Uploaded image for project: 'Thrift'
  1. Thrift
  2. THRIFT-4815

Golang thrift and Python don't write the same messages

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Blocker
    • Resolution: Not A Bug
    • 0.11.0, 0.12.0
    • None

    Description

      I'm trying to port a tool that relies on Thrift from Python to Golang, it is a client not a server.

      The thrift protocol behaves inconsistent when comparing Python and Golang and it results in breaking applications.
      What it boils down to is I have a struct called Message with a certain amount of fields and I have a sendMessage method that takes that message and sends it to a server which then processes that.
      In Python I can simply make a Message object, set some user's userId as receiver and the text after which I can send the message using sendMessage()
      In Golang I can do the exact same but I run into error responses from the server saying another field that isn't required cannot be found.

      In Python this is the generated POST body sent to the server:
      b'\x82!\x00\x0bsendMessage\x15\x00\x1c(!u218891b1a7af4d21ffe4918acbeb9a73\x88\x04test\x00\x00'
      b'\x82!\x00\x0bsendMessage\x15\x00\x1c(!u218891b1a7af4d21ffe4918acbeb9a73\x88\x05test2\x00\x00'

      In Golang the generated POST body sent to the server:
      b'\x82!\x01\x0bsendMessage\x15\x00\x1c(\x04test\x88!u218891b1a7af4d21ffe4918acbeb9a73\x00\x00'
      b'\x82!\x02\x0bsendMessage\x15\x00\x1c(\x05test2\x88!u218891b1a7af4d21ffe4918acbeb9a73\x00\x00'

      As demonstrated above therre are two differences in the generated POST bodies but the one causing the error is the fact that the fields are in a different order than they are supposed to.

      In Golang trying to reverse the order of the fields causes this POST body to be generated:
      b'\x82!\x01\x0bsendMessage\x15\x00\x1c\xa8!u218891b1a7af4d21ffe4918acbeb9a73\x08\x04\x04test\x00\x00'
      When commenting out all the fields I actually don't want to be written and then only reversing the functions that are actually writing data, the ones for the receiver and text fields the POST body looks like this:
      b'\x82!\x01\x0bsendMessage\x15\x00\x1c(\x04test\x88!u218891b1a7af4d21ffe4918acbeb9a73\x00\x00'

      To summarize, the Thrift protocol on Golang is broken in certain cases because fields are not written in the right order causing other implementatings of Thrift to stop serving Golang Thrift clients.

      Attachments

        1. bunny.thrift
          1 kB
          Jack Flecher

        Issue Links

          Activity

            People

              jking3 James E. King III
              tmjbunny Jack Flecher
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: