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

Serhii Kanin commented on THRIFT-5164:
--------------------------------------

[~fishywang] it is not a problem to retrieve a data from TProtocol, the 
question is how to parse it, parsing logic is autogenerated for every argument.

so your suggestion is to have a switch/case for every method?

argument creation works like this:

 
{code:java}
//autogenerated code, DIFFERENT for EVERY server method
func (p *ServiceMethodProcessor) Process(ctx context.Context, seqId int32, 
iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
  args := Argument{} // this argument object contains all the logic to PARSE a 
data from iprot. This is a basic implementation of bridge pattern.
//args.Read contains list of calls to iprot, this calls are different for every 
autogenerated argument
  if err = args.Read(iprot); err != nil {
    iprot.ReadMessageEnd()
    x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
    oprot.WriteMessageBegin("arg", thrift.EXCEPTION, seqId)
    x.Write(oprot)
    oprot.WriteMessageEnd()
    oprot.Flush(ctx)
    return false, err
  }

//interceptors are HERE, working with prepared arguments.
res, err2 := p.opts.Interceptor(ctx, "argument", args, func(ctx 
context.Context, arg interface{}) (result interface{}, err error) {
    return p.handler.processCall(ctx, arg.(Argument).TArgs_)
  })


{code}
I hope this simple snippet explains the problem.

[~jensg] it's already here  [PR|https://github.com/apache/thrift/pull/1992]

 

> Go middleware support
> ---------------------
>
>                 Key: THRIFT-5164
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5164
>             Project: Thrift
>          Issue Type: Improvement
>          Components: Go - Library
>            Reporter: Yuxuan Wang
>            Assignee: Duru Can Celasun
>            Priority: Major
>              Labels: Breaking-Change
>             Fix For: 0.14.0
>
>          Time Spent: 2h
>  Remaining Estimate: 0h
>
> I saw that this idea was discussed before in THRIFT-4553, but want to reopen 
> the discussion to see if there's a change of mind.
> We (Reddit) recently implemented TProcessor level middleware support in our 
> Baseplate.go library, and we think that our implementation is generic enough 
> that it might make sense to contribute that into the thrift library. The 
> related implementation are all in this file: 
> https://github.com/reddit/baseplate.go/blob/4225e42dc8dde56b222ac7ea3a4ff63aa726f6a6/thriftbp/middlewares.go
> https://github.com/reddit/baseplate.go/blob/4225e42dc8dde56b222ac7ea3a4ff63aa726f6a6/tracing/middlewares.go#L40-L64
>  is an example of how a tracing middleware is implemented.
> If we think that's a good idea, then we can contribute that into thrift repo 
> (with renames, of course). One implementation detail I'm not sure is that 
> whether we want to expand the TProcessor interface to also include 
> ProcessorMap and AddToProcessorMap, or do we want to keep the two iinterfaces 
> separate.



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

Reply via email to