You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Malan Ruppert (Jira)" <ji...@apache.org> on 2020/03/23 09:08:00 UTC

[jira] [Comment Edited] (THRIFT-4987) TProtocolException: Bad version in readMessageBegin when using XHR client with C++ server

    [ https://issues.apache.org/jira/browse/THRIFT-4987?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17064640#comment-17064640 ] 

Malan Ruppert edited comment on THRIFT-4987 at 3/23/20, 9:07 AM:
-----------------------------------------------------------------

[~emmenlau] after spending some time debugging, I found a solution for using binary in the browser:

In xhr_connection.js, after creating XMLHttpRequest object, you need to specify the response type as being 'arraybuffer':

 
{code:java}
line 103: var xreq = this.getXmlHttpRequestObject();  
line 104: xreq.responseType = 'arraybuffer';
{code}
 

Afterwards, in the onreadystatechange event handler of the XMLHttpRequest object, setRecvBuffer needs to be called with the 'response' propery of the XMLHttpRequest object (instead of 'responseText')
{code:java}
xreq.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      self.setRecvBuffer(this.response);
    }
};
{code}
Ofcourse this will most likely break again when using JSON. But seems to be a starting point for fixing the binary protocol for browser..


was (Author: mruppert):
[~emmenlau] after spending some time debugging, I found a solution for using binary in the browser:

In xhr_connection.js, after creating XMLHttpRequest object, you need to specify the response type as being 'arraybuffer':

 
{code:java}
line 103: var xreq = this.getXmlHttpRequestObject();  
line 104: xreq.responseType = 'arraybuffer';
{code}
 

Afterwards, in the onreadystatechange event handler of the XMLHttpRequest object, setRecvBuffer needs to be called with the 'response' propery of the XMLHttpRequest object (instead of 'responseText'
{code:java}
xreq.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      self.setRecvBuffer(this.response);
    }
};
{code}
Ofcourse this will most likely break again when using JSON. But seems to be a starting point for fixing the binary protocol for browser..

> TProtocolException: Bad version in readMessageBegin when using XHR client with C++ server
> -----------------------------------------------------------------------------------------
>
>                 Key: THRIFT-4987
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4987
>             Project: Thrift
>          Issue Type: Bug
>          Components: Node.js - Library
>    Affects Versions: 0.13.0
>            Reporter: Mario Emmenlauer
>            Priority: Major
>
> I'm getting a "TProtocolException: Bad version in readMessageBegin" in the web browser when running an XHR client with binary protocol on a C++ server. The issue comes as soon as I call a method with return value that returns for example an int32_t.
> This is tested with latest thrift from master.
> The Nodejs Http client works successfully with binary protocol, so the issue seems to be related to the XHR connection or XHR client.
>  
> Is this a bug or am I doing something wrong? I've found this report in various places on the internet, in combination with Cassandra. It seems this happened for Cassandra in the past, but as far as I could see, it was resolved by switching to the compact protocol.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)