Team_RPCtester created THRIFT-5803:
--------------------------------------

             Summary: Inconsistencies in Handling Default Values for Required 
Fields Across Thrift Implementations
                 Key: THRIFT-5803
                 URL: https://issues.apache.org/jira/browse/THRIFT-5803
             Project: Thrift
          Issue Type: Bug
    Affects Versions: 0.20.0, 0.19.0
            Reporter: Team_RPCtester


Hi,

We discover an inconsistent behavior with respect to default values for 
required string fields. Specifically, in Go, a required string field is 
automatically initialized to an empty string if not explicitly set, whereas 
other languages do not automatically initialize this field. This inconsistency 
can be illustrated with the following example: 

Thrift Definition:

 
{code:java}
namespace go commonResource
struct StructClass_0 {
 1: required string f_1,
}
service DataService {
   StructClass_0 Method_1(1: StructClass_0 agr_method_1)
}
{code}
Go client side,

 
{code:java}
agr_method_1_0 := commonResource.NewStructClass_0()
fmt.Println(agr_method_1_0)
// method_1_re_agr_method_1_0: StructClass_0({F_1:})
{code}
 

python client side 

 
{code:java}
   agr_method_1 = StructClass_0()
   print(agr_method_1)
  # StructClass_0(f_1=None)
{code}
 

nodejs client side 
{code:java}
arg_Method_1 = new ttypes.StructClass_0();
console.log(arg_Method_1);
// { f_1: null }
{code}
 

GO server side 

 
{code:java}
func (d DataServiceHandler) Method_1(ctx context.Context, agr_method_1 
*commonResource.StructClass_0) (re_agr_method_1 *commonResource.StructClass_0, 
_err error) {
   re_agr_method_1 = agr_method_1
   return re_agr_method_1,  nil
}
{code}
 

*Behavior Observed:*
 * On the Go client side, if agr_method_1_0 is sent with an uninitialized f_1, 
Go automatically sets f_1 to an empty string. The server receives this empty 
string and processes it accordingly.
 * On the Node.js client side, if arg_Method_1 is sent with an uninitialized 
f_1, Node.js client reports an error: "Required field f_1 is unset!" and does 
not allow the call to proceed.
 * On the Python client side, if agr_method_1 is sent with f_1 as null, the Go 
server reports: "*commonResource.StructClass_0 error reading struct: Required 
field F_1 is not, the Nodejs server will prompt “"Required field f_1 is 
unset!"”, the Python server will return what it receives.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to