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

Jens Geyer commented on THRIFT-5803:
------------------------------------

{quote}

While we do think that required fields should be set before transmission.
{quote}

We think that you all are right. That's exactly what REQUIRED means.



{quote}

the behavior observed across different languages suggests a need for 
consistency. It would be beneficial if all languages handled the default values 
and required field initialization in a similar manner.
{quote}

What on earth is a "suggested need for consistency"? 

> 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.19.0, 0.20.0
>            Reporter: Team_RPCtester
>            Priority: Major
>
> 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.
> Can you help check this issue.
> Thank you.



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

Reply via email to