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

Jens Geyer closed THRIFT-4815.
------------------------------

> Golang thrift and Python don't write the same messages
> ------------------------------------------------------
>
>                 Key: THRIFT-4815
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4815
>             Project: Thrift
>          Issue Type: Bug
>          Components: Go - Compiler, Go - Library, Python - Compiler, Python - 
> Library
>    Affects Versions: 0.11.0, 0.12.0
>         Environment: Python:
> Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 
> bit (AMD64)] on win32
> Thrift version 0.11.0 tested.
> Golang:
> Thrift versions 0.12.0 and 0.11.0 tested
> go version go1.11.4 windows/amd64
> go env:
> set GOARCH=amd64
> set GOBIN=
> set GOCACHE=C:\Users\BUNNY\AppData\Local\go-build
> set GOEXE=.exe
> set GOFLAGS=
> set GOHOSTARCH=amd64
> set GOHOSTOS=windows
> set GOOS=windows
> set GOPATH=C:\Users\BUNNY\go
> set GOPROXY=
> set GORACE=
> set GOROOT=C:\Go
> set GOTMPDIR=
> set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
> set GCCGO=gccgo
> set CC=gcc
> set CXX=g++
> set CGO_ENABLED=1
> set GOMOD=
> set CGO_CFLAGS=-g -O2
> set CGO_CPPFLAGS=
> set CGO_CXXFLAGS=-g -O2
> set CGO_FFLAGS=-g -O2
> set CGO_LDFLAGS=-g -O2
> set PKG_CONFIG=pkg-config
> set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments 
> -fmessage-length=0 
> -fdebug-prefix-map=C:\Users\BUNNY\AppData\Local\Temp\go-build552047466=/tmp/go-build
>  -gno-record-gcc-switches
>            Reporter: Jack Flecher
>            Assignee: James E. King III
>            Priority: Blocker
>              Labels: newbie
>         Attachments: bunny.thrift
>
>
> 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.



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

Reply via email to