Last update from me for a while hopefully :) Ilia, I did look at your suggestion more closely with wrapping the entire message in base64. It became apparent to me that I was only decoding base64 in my nested message handler which should have been obvious.
I added some conditional decoding logic to check if every incoming message was base64. I think this change leads to some cleaner code overall within the project. Take care. On Wednesday, September 25, 2013 12:51:14 PM UTC-7, [email protected] wrote: > > Ilia (sorry for the misspell of your name previously), > > I'll keep your suggestion in mind if I start to have issues when adding > other nested messages. > > I did play around with wrapping the entire message as base64 but the > websocket server seems to complain upon receiving the message. > I receive an exception along the lines of "Protocol message tag had > invalid wire type". > In any case, wrapping only the nested object seems to be functioning > properly and is allowing me to move forward. I'll update the thread if > anything changes. > > > Cheers ! > > > > On Wednesday, September 25, 2013 10:27:52 AM UTC-7, Ilia Mirkin wrote: >> >> I believe Chris's suggestion was to base64-encode the full message, >> not the subproto, or you'll run into other problems down the line, >> since it sounds like your transport can't handle arbitrary byte >> sequences. >> >> IOW, something like >> >> response.response_proto = heartbeatResult.SerializeToString() >> self.sendMessage(base64.b64encode(response.SerializeToString())) >> >> Or even better, stick the b64encode into sendMessage itself (and >> matching b64decode in the receive logic). But best still would be to >> figure out why your transport doesn't seem to be handling arbitrary >> byte sequences. >> >> -ilia >> >> >> On Wed, Sep 25, 2013 at 1:24 PM, <[email protected]> wrote: >> > Chris, >> > Your suggestion of trying base64 worked on the nested >> > protobuf. Thanks to you and Llia again for taking the time to >> > share your thoughts. >> > >> > Here is the solution that ended up working with the websocket >> > server that I'm using. >> > >> > >> > >> > def GetHeartbeat(self): >> > print "GetHeartbeat called" >> > heartbeatResult = rpc_pb2.HeartbeatResult() >> > heartbeatResult.service = "ALERT_SERVICE" >> > heartbeatResult.timestamp = self.getTimestamp() >> > >> > heartbeatResult.status_cd = rpc_pb2.OK >> > heartbeatResult.status_summary = "OK" >> > >> > response = rpc_pb2.Response() >> > response.service_name = "" >> > response.method_name = "SendHeartbeatResult" >> > response.client_id = "ALERT_SERVICE" >> > response.status_cd = rpc_pb2.OK >> > response.response_proto = >> > base64.b64encode(heartbeatResult.SerializeToString()) >> > self.sendMessage(response.SerializeToString()) >> > print "GetHeartbeat finished" >> > >> > >> > >> > >> > >> > >> > On Tuesday, August 27, 2013 12:12:30 PM UTC-7, Christopher Head wrote: >> >> >> >> On Mon, 26 Aug 2013 17:32:23 -0700 (PDT) >> >> [email protected] wrote: >> >> >> >> > Thanks for taking the time to read/reply. >> >> > >> >> > GetHeartbeat2 is my original version which I included as well and >> the >> >> > way I had thought it should probably work. This code is serializing >> >> > to string >> >> > on the inner buffer and then again on the outer. >> >> > >> >> > response.response_proto = heartbeatResult.SerializeToString() >> >> > self.sendMessage(response.SerializeToString()) >> >> > >> >> > >> >> > The GetHeartbeat2 generates this error on the server ( I included >> >> > more of the stack trace this time) >> >> > Message: [org.java_websocket.exceptions.InvalidDataException: >> >> > java.nio.charset.MalformedInputException: Input length = 1 >> >> > at >> >> > >> >> > >> org.java_websocket.util.Charsetfunctions.stringUtf8(Charsetfunctions.java:80) >> >> >> >> > at >> >> > >> org.java_websocket.WebSocketImpl.deliverMessage(WebSocketImpl.java:561) >> >> > at >> >> > >> org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:328) >> >> > at org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:149) >> at >> >> > >> >> > >> org.java_websocket.server.WebSocketServer$WebSocketWorker.run(WebSocketServer.java:593) >> >> >> >> > Caused by: java.nio.charset.MalformedInputException: Input length = >> 1 >> >> > at >> >> > java.nio.charset.CoderResult.throwException(CoderResult.java:277) at >> >> > java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:798) at >> >> > >> >> > >> org.java_websocket.util.Charsetfunctions.stringUtf8(Charsetfunctions.java:77) >> >> >> >> > >> >> >> >> This stack trace suggests you’re still involving UTF-8 somewhere, this >> >> time on the Java side (java.nio.charset, stringUtf8 method name, >> etc.). >> >> Again, an encoded Protobuf message is a BYTE STRING. You should not be >> >> doing UTF-8 things, or any other text-related things, to it. I have no >> >> idea how Websockets work, but if they are not capable of transporting >> >> byte strings directly (if they only carry text, for example), then you >> >> will have to do further encoding on your Protobuf message—Base64 might >> >> be suitable here. >> >> >> >> Chris >> > >> > -- >> > You received this message because you are subscribed to the Google >> Groups >> > "Protocol Buffers" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> an >> > email to [email protected]. >> > To post to this group, send email to [email protected]. >> > Visit this group at http://groups.google.com/group/protobuf. >> > For more options, visit https://groups.google.com/groups/opt_out. >> > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/protobuf. For more options, visit https://groups.google.com/groups/opt_out.
