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.

Reply via email to