ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: return 204



пробовал вот так:

    if (r != r->main && len == 0) {
        return ngx_http_send_special(r, NGX_HTTP_LAST);
    }
    else {
        return ngx_http_output_filter(r, &out);
    }

виснет на пустом подзапросе, конфиг:

        location /mymodule/ {
            mymodule;
            charset           utf-8;
            source_charset    windows-1251;
            override_charset  on;
        }

для чтобы не быть голословным я сделал минимальный тестовый модуль
empty_html для тестов сейчас при прямом вызове он работает, при
включении инклудом виснет основной запрос

хочу понять как поправить модуль чтобы работали все комбинации факторов:
длина ответа: 0, >0
перекодировка из cp1251 в utf8: on, off
способ вызова:  прямой, через SSI
итого: 8 комбинаций

2009/3/6 Igor Sysoev <is@xxxxxxxxxxxxx>:
> On Fri, Mar 06, 2009 at 06:22:08PM +0300, Alexander Bykov wrote:
>
>> >> Можно также
>> >> ngx_http_send_special(r, NGX_HTTP_LAST);
>> >>
>>
>> не помогает, в этом случае виснет на подзапросах
>
> А если так:
>
>  if (size == 0 && r != r->main) {
>      ngx_http_send_special(r, NGX_HTTP_LAST);
>  }
>
> ?
>
>
> --
> Игорь Сысоев
> http://sysoev.ru
>
>
/*
 * Copyright (C) Igor Sysoev
 */

#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>


static char *ngx_http_empty_html(ngx_conf_t *cf, ngx_command_t *cmd,
    void *conf);

static ngx_command_t  ngx_http_empty_html_commands[] = {

    { ngx_string("empty_html"),
      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
      ngx_http_empty_html,
      0,
      0,
      NULL },

      ngx_null_command
};


static ngx_http_module_t  ngx_http_empty_html_module_ctx = {
    NULL,                          /* preconfiguration */
    NULL,                          /* postconfiguration */

    NULL,                          /* create main configuration */
    NULL,                          /* init main configuration */

    NULL,                          /* create server configuration */
    NULL,                          /* merge server configuration */

    NULL,                          /* create location configuration */
    NULL                           /* merge location configuration */
};


ngx_module_t  ngx_http_empty_html_module = {
    NGX_MODULE_V1,
    &ngx_http_empty_html_module_ctx, /* module context */
    ngx_http_empty_html_commands,   /* module directives */
    NGX_HTTP_MODULE,               /* module type */
    NULL,                          /* init master */
    NULL,                          /* init module */
    NULL,                          /* init process */
    NULL,                          /* init thread */
    NULL,                          /* exit thread */
    NULL,                          /* exit process */
    NULL,                          /* exit master */
    NGX_MODULE_V1_PADDING
};


static ngx_int_t
ngx_http_empty_html_handler(ngx_http_request_t *r)
{
    ngx_int_t     rc;
    ngx_buf_t    *b;
    ngx_chain_t   out;

    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
        return NGX_HTTP_NOT_ALLOWED;
    }

    rc = ngx_http_discard_request_body(r);

    if (rc != NGX_OK) {
        return rc;
    }

    r->headers_out.content_type.len = sizeof("text/html") - 1;
    r->headers_out.content_type.data = (u_char *) "text/html";
    r->headers_out.charset.len = sizeof("windows-1251") - 1;
    r->headers_out.charset.data = (u_char*)"windows-1251";

    r->headers_out.status = NGX_HTTP_OK;
    r->headers_out.content_length_n = 0;

    if (r->method == NGX_HTTP_HEAD) {
        return ngx_http_send_header(r);
    }

    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
    if (b == NULL) {
        return NGX_HTTP_INTERNAL_SERVER_ERROR;
    }

    out.buf = b;
    out.next = NULL;

    b->pos = 0;
    b->last = 0;
    //b->memory = 1;
    //b->last_buf = 1;
    b->last_buf = (r == r->main) ? 1: 0;


    rc = ngx_http_send_header(r);

    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
        return rc;
    }

    return ngx_http_output_filter(r, &out);
}


static char *
ngx_http_empty_html(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_http_core_loc_conf_t  *clcf;

    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
    clcf->handler = ngx_http_empty_html_handler;

    return NGX_CONF_OK;
}


 




Copyright © Lexa Software, 1996-2009.