Hi, I'm not sure that help. But, I suggest this: int SendResponse(ngx_http_request_t *r, ngx_uint_t http_status, const char *data, unsigned int dlen) { ngx_buf_t *buf; ngx_int_t rc;
rc = ngx_http_discard_request_body(r); if (rc != NGX_OK) { return rc; } buf = ngx_create_temp_buf(r->pool, 512); /* Sure 512 is enough? */ if (NULL == buf) { ngx_log_error(NGX_LOG_ERR, log, 0, "allocation failure"); return NGX_HTTP_INTERNAL_SERVER_ERROR; } buf->last = ngx_copy(buf->start, (unsigned char*) data, dlen); ngx_log_t *log = r->connection->log; ngx_chain_t *out_chain = ngx_alloc_chain_link(r->pool); if (NULL == out_chain) { ngx_log_error(NGX_LOG_ERR, log, 0, "failed to alloc buffer chain"); return NGX_HTTP_INTERNAL_SERVER_ERROR; } out_chain->buf = buf; out_chain->next = NULL; buf->last_buf = 1; buf->last_in_chain = 1; r->headers_out.status = http_status; r->headers_out.content_length_n = buf->last - buf->pos; /* Use buf->pos */ r->headers_out.content_type.len = sizeof("text/plain") - 1; r->headers_out.content_type.data = (u_char *) "text/plain"; rc = ngx_http_send_header(r); if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { ngx_log_error(NGX_LOG_ERR, log, 0, "send header failed. rc=%i", rc); return NGX_HTTP_INTERNAL_SERVER_ERROR; } rc = ngx_http_output_filter(r, out_chain); if (rc != NGX_OK) { ngx_log_error(NGX_LOG_ERR, log, 0, "send response buffer failed. rc=%i", rc); return NGX_HTTP_INTERNAL_SERVER_ERROR; } return rc; } <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> Livre de vĂrus. www.avast.com <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>. <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> 2018-05-16 14:02 GMT-03:00 Dk Jack <dnj0...@gmail.com>: > Hi, > I am trying to send a custom response in my module when I encounter a > request for a specific location. For example, I have setup my location as > follows: > > server { > listen 9999; > location /__my_module { > set_mymodule_location; > log_not_found off; > } > } > > In my location handler, I am trying to respond to a request for this > location. I get the response I expect at the client. However, I am seeing > the following error message logged in error.log: > > 2018/05/16 00:38:07 [alert] 225#225: *158 header already sent, client: > 127.0.0.1, server: , request: "GET /__my_module HTTP/1.1", host: > "localhost:9999" > > Can someone let me know how I can prevent this error from showing up. > Also, the return value from ngx_http_send_header is always an NGX_ERROR. > Not sure why... > > FWIW, my response buffer is always less than 512 bytes. My code is > included at the end of this email. Any help is appreciated. Thanks > > Dk. > > int > SendResponse(ngx_http_request_t *r, ngx_uint_t http_status, > const char *data, unsigned int dlen) > { > ngx_buf_t *buf = ngx_create_temp_buf(r->pool, 512); > > if (NULL == buf) { > ngx_log_error(NGX_LOG_ERR, log, 0, > "allocation failure"); > return NGX_HTTP_INTERNAL_SERVER_ERROR; > } > > buf->last = ngx_copy(buf->start, (unsigned char*) data, dlen); > ngx_log_t *log = r->connection->log; > > ngx_chain_t *out_chain = ngx_alloc_chain_link(r->pool); > if (NULL == out_chain) { > ngx_log_error(NGX_LOG_ERR, log, 0, > "failed to alloc buffer chain"); > return NGX_HTTP_INTERNAL_SERVER_ERROR; > } > > out_chain->buf = buf; > out_chain->next = NULL; > buf->last_buf = 1; > buf->last_in_chain = 1; > > ngx_int_t rc; > r->headers_out.status = http_status; > r->headers_out.content_length_n = buf->last - buf->start; > r->headers_out.content_type.len = sizeof("text/plain") - 1; > r->headers_out.content_type.data = (u_char *) "text/plain"; > rc = ngx_http_send_header(r); > > #if 0 // send_header always returns NGX_ERROR. > if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { > ngx_log_error(NGX_LOG_ERR, log, 0, > "send header failed. rc=%i", rc); > return NGX_HTTP_INTERNAL_SERVER_ERROR; > } > #endif > > rc = ngx_http_output_filter(r, out_chain); > if (rc != NGX_OK) { > ngx_log_error(NGX_LOG_ERR, log, 0, > "send response buffer failed. rc=%i", rc); > return NGX_HTTP_INTERNAL_SERVER_ERROR; > } > > return 0; > } > > > _______________________________________________ > nginx-devel mailing list > nginx-devel@nginx.org > http://mailman.nginx.org/mailman/listinfo/nginx-devel >
_______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel