Welcome! Log In Create A New Profile

Advanced

Help with reading response from upstream u->buffer

Posted by Ashish S 
Ashish S
Help with reading response from upstream u->buffer
April 26, 2012 02:30AM
Hi there,

In my module which uses upstream to talk to a backend, i do the
following in the response processing method (u->process_header)

{
ngx_http_upstream_t * u = r->upstream;
size_t myResponseLength = (u->buffer.last - u->buffer.pos);
size_t origUpstreamResponseLength = (u->buffer.last - u->buffer.start);
std::string myResponseString ((u_char *) u->buffer.pos, myResponseLength);

ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "u->length is %d
and Original Upstream response length is %d and myResponseLength is
%d", u->length, origUpstreamResponseLength, myResponseLength);

....
}

My actual response length from upstream is ~16kb, while i get
u->length printed as 0, Original upstream response length and
myResponseLength printed as 1448 bytes. I also see in nginx debug
logs, "Transfer-Encoding: chunked". Is the difference in length
printed, because of this encoding? Is there a way to disable chunked
transfer, so that i can get the entire response in one go (into my
string), as shown in code? If not, what is the right method to read
the entire response from upstream buffer into a temporary string (so
that i can do further parsing)?

Thanks,
Ashish

_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx
Maxim had once mentioned about checking out memcache module for an
example of non-buffered protocol handling, and i modeled my code
around it. Is the behavior below because of buffered protocol (http)?

Thanks,
Ashish

On Wed, Apr 25, 2012 at 5:22 PM, Ashish S <[email protected]> wrote:
> Hi there,
>
> In my module which uses upstream to talk to a backend, i do the
> following in the response processing method  (u->process_header)
>
> {
>    ngx_http_upstream_t * u = r->upstream;
>    size_t myResponseLength = (u->buffer.last - u->buffer.pos);
>    size_t origUpstreamResponseLength = (u->buffer.last - u->buffer.start);
>    std::string myResponseString ((u_char *) u->buffer.pos, myResponseLength);
>
>    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "u->length is %d
> and Original Upstream response length is %d and myResponseLength is
> %d", u->length, origUpstreamResponseLength, myResponseLength);
>
>    ....
> }
>
> My actual response length from upstream is ~16kb, while i get
> u->length printed as 0, Original upstream response length and
> myResponseLength printed as 1448 bytes.  I also see in nginx debug
> logs,  "Transfer-Encoding: chunked". Is the difference in length
> printed, because of this encoding? Is there a way to disable chunked
> transfer, so that i can get the entire response in one go (into my
> string), as shown in code?  If not, what is the right method to read
> the entire response from upstream buffer into a temporary string (so
> that i can do further parsing)?
>
> Thanks,
> Ashish

_______________________________________________
nginx mailing list
nginx@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx
Sorry, only registered users may post in this forum.

Click here to login