You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Will Demaine (JIRA)" <ji...@apache.org> on 2015/03/20 02:31:38 UTC

[jira] [Updated] (THRIFT-3048) NodeJS decoding of I64 is inconsistent across protocols

     [ https://issues.apache.org/jira/browse/THRIFT-3048?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Will Demaine updated THRIFT-3048:
---------------------------------
    Description: 
The NodeJS libraries decode i64 differently between protocols. The {{TCompactProtocol}} returns a {{number}} whereas {{TBinaryProtocol}} and {{TJSONProtocol}} return an {{object}}

Compact: https://github.com/apache/thrift/blob/master/lib/nodejs/lib/thrift/compact_protocol.js#L815

Binary: https://github.com/apache/thrift/blob/master/lib/nodejs/lib/thrift/binary_protocol.js#L273

JSON:
https://github.com/apache/thrift/blob/master/lib/nodejs/lib/thrift/json_protocol.js#L664

This leads to a lack interoperability when switching between protocols:

{code}
service BTest {
  bool testMethod (
    1: string protocol
    2: i64 int64
  );
}
{code}

{code:JavaScript}
var handlers = {
  testMethod: function(desc, int64, callback) {
    console.log(util.format('%s: %d, %s', desc, int64, typeof int64));
    callback(null, true);
  }
};

var startServer = function(callback){
  var serverOptions = {
    services: {
      '/thrift': {
        handler: handlers,
        processor: BTest,
        protocol: thrift.TCompactProtocol,
        transport: thrift.TBufferedTransport
      },
      '/thrift.binary': {
        handler: handlers,
        processor: BTest,
        protocol: thrift.TBinaryProtocol,
        transport: thrift.TBufferedTransport
      }
    }
  };

  this.server = thrift.createWebServer(serverOptions);
  this.server.listen(9887, function serverCreated(){
    callback();
  }.bind(this));
};
{code}

Client side: 
{code:JavaScript}
  compactClient.testMethod('compact small', 123);
  binaryClient.testMethod('binary small', 456);

  compactClient.testMethod('compact', 4294967297);
  binaryClient.testMethod('binary', 4294967297);

  compactClient.testMethod('compact large', 3.602879702e16);
  binaryClient.testMethod('binary large', 3.602879702e16);
{code}

Results (0.9.2 and 1.0-dev):

{code}
compact small: 123, number
binary small: 456, object
compact: 4294967297, number
binary: 4294967297, object
binary large: Infinity, object
{code}

  was:
The NodeJS libraries decode i64 differently between protocols. The {{TCompactProtocol}} returns a {{number}} whereas {{TBinaryProtocol}} and {{TJSONProtocol}} return an {{object}}

Compact: https://github.com/apache/thrift/blob/master/lib/nodejs/lib/thrift/compact_protocol.js#L815

Binary: https://github.com/apache/thrift/blob/master/lib/nodejs/lib/thrift/binary_protocol.js#L273

JSON:
https://github.com/apache/thrift/blob/master/lib/nodejs/lib/thrift/json_protocol.js#L664

This leads to a lack interoperability when switching between protocols:

{code}
service BTest {
  bool testMethod (
    1: string protocol
    2: i64 int64
  );
}
{code}

{code:JavaScript}
var handlers = {
  testMethod: function(desc, int64, callback) {
    console.log(util.format('%s: %d, %s', desc, int64, typeof int64));
    callback(null, true);
  }
};

var startServer = function(callback){
  var serverOptions = {
    services: {
      '/thrift': {
        handler: handlers,
        processor: BTest,
        protocol: thrift.TCompactProtocol,
        transport: thrift.TBufferedTransport
      },
      '/thrift.binary': {
        handler: handlers,
        processor: BTest,
        protocol: thrift.TBinaryProtocol,
        transport: thrift.TBufferedTransport
      }
    }
  };

  this.server = thrift.createWebServer(serverOptions);
  this.server.listen(9887, function serverCreated(){
    callback();
  }.bind(this));
};
{code}

Client side: 
{code:JavaScript}
  compactClient.testMethod('compact small', 123);
  binaryClient.testMethod('binary small', 456);

  compactClient.testMethod('compact', 4294967297);
  binaryClient.testMethod('binary', 4294967297);

  compactClient.testMethod('compact large', 3.602879702e16);
  binaryClient.testMethod('binary large', 3.602879702e16);
{code}

Results (0.9.2 and 1.0-dev):

{code}
compact small: 1, 123, number, number
binary small: 2, 456, number, object
compact: 4, 4294967297, number, number
binary: 5, 4294967297, number, object
binary large: 8, Infinity, number, object
{code}


> NodeJS decoding of I64 is inconsistent across protocols
> -------------------------------------------------------
>
>                 Key: THRIFT-3048
>                 URL: https://issues.apache.org/jira/browse/THRIFT-3048
>             Project: Thrift
>          Issue Type: Bug
>          Components: Node.js - Library
>    Affects Versions: 0.9.2, 1.0
>            Reporter: Will Demaine
>
> The NodeJS libraries decode i64 differently between protocols. The {{TCompactProtocol}} returns a {{number}} whereas {{TBinaryProtocol}} and {{TJSONProtocol}} return an {{object}}
> Compact: https://github.com/apache/thrift/blob/master/lib/nodejs/lib/thrift/compact_protocol.js#L815
> Binary: https://github.com/apache/thrift/blob/master/lib/nodejs/lib/thrift/binary_protocol.js#L273
> JSON:
> https://github.com/apache/thrift/blob/master/lib/nodejs/lib/thrift/json_protocol.js#L664
> This leads to a lack interoperability when switching between protocols:
> {code}
> service BTest {
>   bool testMethod (
>     1: string protocol
>     2: i64 int64
>   );
> }
> {code}
> {code:JavaScript}
> var handlers = {
>   testMethod: function(desc, int64, callback) {
>     console.log(util.format('%s: %d, %s', desc, int64, typeof int64));
>     callback(null, true);
>   }
> };
> var startServer = function(callback){
>   var serverOptions = {
>     services: {
>       '/thrift': {
>         handler: handlers,
>         processor: BTest,
>         protocol: thrift.TCompactProtocol,
>         transport: thrift.TBufferedTransport
>       },
>       '/thrift.binary': {
>         handler: handlers,
>         processor: BTest,
>         protocol: thrift.TBinaryProtocol,
>         transport: thrift.TBufferedTransport
>       }
>     }
>   };
>   this.server = thrift.createWebServer(serverOptions);
>   this.server.listen(9887, function serverCreated(){
>     callback();
>   }.bind(this));
> };
> {code}
> Client side: 
> {code:JavaScript}
>   compactClient.testMethod('compact small', 123);
>   binaryClient.testMethod('binary small', 456);
>   compactClient.testMethod('compact', 4294967297);
>   binaryClient.testMethod('binary', 4294967297);
>   compactClient.testMethod('compact large', 3.602879702e16);
>   binaryClient.testMethod('binary large', 3.602879702e16);
> {code}
> Results (0.9.2 and 1.0-dev):
> {code}
> compact small: 123, number
> binary small: 456, object
> compact: 4294967297, number
> binary: 4294967297, object
> binary large: Infinity, object
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)