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, chri...@gmail.com 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,  <chri...@gmail.com> 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) 
>> >> chri...@gmail.com 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 protobuf+u...@googlegroups.com. 
>> > To post to this group, send email to prot...@googlegroups.com. 
>> > 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 protobuf+unsubscr...@googlegroups.com.
To post to this group, send email to protobuf@googlegroups.com.
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