agree +1
*ZhengSong Tu*
My GitHub: https://github.com/tzssangglass <https://github.com/membphis>
Apache APISIX: https://github.com/apache/apisix


Zexuan Luo <spacewan...@apache.org> 于2021年8月5日周四 上午9:43写道:

> Yes.
> The ExtraInfoReq already contains type and name (if needed).
>
> ZhengSong Tu <tzssanggl...@gmail.com> 于2021年8月5日周四 上午9:36写道:
> >
> > One more question: How does APISIX know which ExtraInfo the Runner
> > wants? Declare it in ExtraInfoReq?
> >
> > *ZhengSong Tu*
> > My GitHub: https://github.com/tzssangglass <https://github.com/membphis>
> > Apache APISIX: https://github.com/apache/apisix
> >
> >
> > Zexuan Luo <spacewan...@apache.org> 于2021年8月5日周四 上午9:01写道:
> >
> > > > 1. declare ExtraInfo in conf
> > >
> > > I used to solve it with this. But this way is too cumbersome. It let
> > > me think about Java's check exception. You have to add a new exception
> > > handler when the function you called has changed. There will be the
> > > same with the ExtraInfo
> > >
> > > > Does this also include handling the body of the POST request? I have
> > > encountered this problem before.
> > >
> > > Yes
> > >
> > > ZhengSong Tu <tzssanggl...@gmail.com> 于2021年8月4日周三 上午11:11写道:
> > > >
> > > > >
> > > > > APISIX sends HTTPReqCallReq
> > > > > while reply from Runner isn't HTTPReqCallResp:
> > > > >
> > > >     APISIX handle ExtraInfoReq
> > > >
> > > >
> > > > I feel there is some ambiguity here.
> > > > The reply from Runner to APISIX isn't HTTPReqCallResp = Runner wants
> > > > ExtraInfo, so why not just tell APISIX that it wants ExtraInfo. Or a
> > > > response that specifically identifies ExtraInfo.
> > > >
> > > > I have two suggestions:
> > > >
> > > >    1. declare ExtraInfo in conf (has this been discussed before? I
> can't
> > > >    remember, sorry), for example:
> > > >
> > > > ```
> > > > "ext-plugin-pre-req": {
> > > >     "conf": [
> > > >         {
> > > >             "name":"foo",
> > > >             "value":"bar",
> > > >             "extra_info": {
> > > >                              "ngx.var.request_start_time":
> "1454670920"
> > > >                                  }
> > > >         },
> > > >     ]
> > > > }
> > > > ```
> > > >
> > > > 2. Before processing the HTTPReqCallResp, the Runner adds a
> > > pre-processing
> > > > step: checking the required ExtraInfo, and returns a Required
> ExtraInfo
> > > > true/false response.(This is to add to the points I was wondering
> about)
> > > >
> > > > I prefer the first one. I think developers know exactly what they
> want
> > > from
> > > > the ExtraInfo when they write the Runner plugin, so the way it's
> declared
> > > > is clearer.
> > > >
> > > >
> > > >
> > > >
> > > > In some situations, user may want to process request body that is
> greater
> > > > > than 16M.
> > > >
> > > >
> > > > Does this also include handling the body of the POST request? I have
> > > > encountered this problem before.
> > > >
> > > >
> > > >
> > > > 1 byte type + 3 byte zero + 4 byte length + body.
> > > >
> > > >
> > > > This is an upgrade to the protocol between Runner and APISIX? Sounds
> good
> > > > to me. This allows Runner to use some common TCP unpacking functions.
> > > >
> > > >
> > > > *ZhengSong Tu*
> > > > My GitHub: https://github.com/tzssangglass <
> https://github.com/membphis>
> > > > Apache APISIX: https://github.com/apache/apisix
> > > >
> > > >
> > > > Zexuan Luo <spacewan...@apache.org> 于2021年8月3日周二 下午8:54写道:
> > > >
> > > > > Sometimes we need to use some information that can't be predicted
> > > > > before running the extern plugin. For example, access the
> > > > > `ngx.var.request_start_time` in the extern plugin.
> > > > >
> > > > > Hence, we add a pair of messages: ExtraInfoReq & ExtraInfoResp.
> > > > >
> > > > > Now a request from APISIX to Plugin Runner will be like this:
> > > > >
> > > > > ```
> > > > > APISIX sends HTTPReqCallReq
> > > > > while reply from Runner isn't HTTPReqCallResp:
> > > > >     APISIX handle ExtraInfoReq
> > > > >     APISIX sends ExtraInfoResp
> > > > > APISIX handle HTTPReqCallResp
> > > > > ```
> > > > >
> > > > > The ExtraInfo schema is:
> > > > >
> > > > > ```
> > > > > namespace A6.ExtraInfo;
> > > > >
> > > > > table Var {
> > > > >     name:string;
> > > > > }
> > > > >
> > > > > table ReqBody {
> > > > > }
> > > > >
> > > > > union Info {
> > > > >     // Get the `ngx.var.name`
> > > > >     Var,
> > > > >     // Get the request body
> > > > >     ReqBody,
> > > > > }
> > > > >
> > > > > table Req {
> > > > >     info:Info;
> > > > > }
> > > > >
> > > > > table Resp {
> > > > >     result:[ubyte];
> > > > > }
> > > > > ```
> > > > >
> > > > >
> > > > > In some situations, user may want to process request body that is
> > > > > greater than 16M.
> > > > > Although handling a large body in the extern plugin is discourage,
> we
> > > > > still need to way to adapt it instead of just raise an error.
> > > > >
> > > > > To solve this problem, let's extend the current rpc header.
> > > > >
> > > > > Normally we have a header like this:
> > > > >
> > > > > 1 byte type + 3 byte length + body
> > > > >
> > > > > Since body can't be zero in all known types, we can introduce an
> > > > > extension with zero length placeholder.
> > > > >
> > > > > Now we can accept such a header to represent a body larger than
> 16M:
> > > > >
> > > > > 1 byte type + 3 byte zero + 4 byte length + body.
> > > > >
> > > > > Body larger than 4GB is unsupported since we will buffer the whole
> > > > > body both in APISIX and in Runner.
> > > > >
> > >
>

Reply via email to