ngx_http_process_header_line function in source code

Maxim Dounin mdounin at
Mon Jun 16 11:31:20 UTC 2014


On Sun, Jun 15, 2014 at 06:03:27PM -0400, alayim wrote:

> Hi,
> I'm browsing through the source code of the project, and looked at
> ngx_http_request.c where the function ngx_http_process_header_line() creates
> a pointer to a pointer to a large struct(ngx_http_request_t) containing a
> smaller one(ngx_http_headers_in_t), containing yet another one.
> ngx_http_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,
> ngx_uint_t offset) {
>     ph = (ngx_table_elt_t **) ((char *) &r->headers_in + offset);
>     // ... then check if ph is NULL, and if so point it to h
> }
> Why is it done in this way? It seems quite complex and error prone, doesen't
> it?
> Is there any reason something like this wasn't done instead?
> (where range are ONE of those structures in headers_in that are a
> ngx_table_elt_t)
> if(r->headers_in->range == NULL) {
>       r->headers_in->range = h;
> }

The ngx_http_process_header_line() function is used to handle lots 
of header lines.  You can't hardcode just one name into it - 
you'll have to write 15 functions instead (and add another one on 
each header line added).  Using one universal function instead 
greatly reduces code size and therefore less error prone.

Maxim Dounin

More information about the nginx mailing list