Mercurial > hg > nginx
view src/event/ngx_event_acceptex.c @ 509:9b8c906f6e63 release-0.1.29
nginx-0.1.29-RELEASE import
*) Feature: the ngx_http_ssi_module supports "include virtual" command.
*) Feature: the ngx_http_ssi_module supports the condition command like
'if expr="$NAME"' and "else" and "endif" commands. Only one nested
level is supported.
*) Feature: the ngx_http_ssi_module supports the DATE_LOCAL and
DATE_GMT variables and "config timefmt" command.
*) Feature: the "ssi_ignore_recycled_buffers" directive.
*) Bugfix: the "echo" command did not show the default value for the
empty QUERY_STRING variable.
*) Change: the ngx_http_proxy_module was rewritten.
*) Feature: the "proxy_redirect", "proxy_pass_request_headers",
"proxy_pass_request_body", and "proxy_method" directives.
*) Feature: the "proxy_set_header" directive. The "proxy_x_var" was
canceled and must be replaced with the proxy_set_header directive.
*) Change: the "proxy_preserve_host" is canceled and must be replaced
with the "proxy_set_header Host $host" and the "proxy_redirect off"
directives, the "proxy_set_header Host $host:$proxy_port" directive
and the appropriate proxy_redirect directives.
*) Change: the "proxy_set_x_real_ip" is canceled and must be replaced
with the "proxy_set_header X-Real-IP $remote_addr" directive.
*) Change: the "proxy_add_x_forwarded_for" is canceled and must be
replaced with
the "proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for"
directive.
*) Change: the "proxy_set_x_url" is canceled and must be replaced with
the "proxy_set_header X-URL http://$host:$server_port$request_uri"
directive.
*) Feature: the "fastcgi_param" directive.
*) Change: the "fastcgi_root", "fastcgi_set_var" and "fastcgi_params"
directive are canceled and must be replaced with the fastcgi_param
directives.
*) Feature: the "index" directive can use the variables.
*) Feature: the "index" directive can be used at http and server levels.
*) Change: the last index only in the "index" directive can be absolute.
*) Feature: the "rewrite" directive can use the variables.
*) Feature: the "internal" directive.
*) Feature: the CONTENT_LENGTH, CONTENT_TYPE, REMOTE_PORT, SERVER_ADDR,
SERVER_PORT, SERVER_PROTOCOL, DOCUMENT_ROOT, SERVER_NAME,
REQUEST_METHOD, REQUEST_URI, and REMOTE_USER variables.
*) Change: nginx now passes the invalid lines in a client request
headers or a backend response header.
*) Bugfix: if the backend did not transfer response for a long time and
the "send_timeout" was less than "proxy_read_timeout", then nginx
returned the 408 response.
*) Bugfix: the segmentation fault was occurred if the backend sent an
invalid line in response header; the bug had appeared in 0.1.26.
*) Bugfix: the segmentation fault may occurred in FastCGI fault
tolerance configuration.
*) Bugfix: the "expires" directive did not remove the previous
"Expires" and "Cache-Control" headers.
*) Bugfix: nginx did not take into account trailing dot in "Host"
header line.
*) Bugfix: the ngx_http_auth_module did not work under Linux.
*) Bugfix: the rewrite directive worked incorrectly, if the arguments
were in a request.
*) Bugfix: nginx could not be built on MacOS X.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 12 May 2005 14:58:06 +0000 |
parents | d4ea69372b94 |
children | 371c1cee100d |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev */ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_event.h> void ngx_event_acceptex(ngx_event_t *rev) { ngx_connection_t *c; c = rev->data; ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "AcceptEx: %d", c->fd); if (rev->ovlp.error) { ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error, "AcceptEx() %V failed", &c->listening->addr_text); return; } /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */ if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char *) &c->listening->fd, sizeof(ngx_socket_t)) == -1) { ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno, "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %V", &c->addr_text); } else { c->accept_context_updated = 1; } getacceptexsockaddrs(c->buffer->pos, c->listening->post_accept_buffer_size, c->listening->socklen + 16, c->listening->socklen + 16, &c->local_sockaddr, &c->local_socklen, &c->sockaddr, &c->socklen); if (c->listening->post_accept_buffer_size) { c->buffer->last += rev->available; c->buffer->end = c->buffer->start + c->listening->post_accept_buffer_size; } else { c->buffer = NULL; } if (c->listening->addr_ntop) { c->addr_text.data = ngx_palloc(c->pool, c->listening->addr_text_max_len); if (c->addr_text.data == NULL) { /* TODO: close socket */ return; } c->addr_text.len = ngx_sock_ntop(c->listening->family, c->sockaddr, c->addr_text.data, c->listening->addr_text_max_len); if (c->addr_text.len == 0) { /* TODO: close socket */ return; } } ngx_event_post_acceptex(c->listening, 1); c->number = ngx_atomic_inc(ngx_connection_counter); c->listening->handler(c); return; } int ngx_event_post_acceptex(ngx_listening_t *ls, int n) { u_long rcvd; ngx_int_t i; ngx_err_t err; ngx_event_t *rev, *wev; ngx_socket_t s; ngx_connection_t *c; for (i = 0; i < n; i++) { /* TODO: look up reused sockets */ s = ngx_socket(ls->family, ls->type, 0); ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ls->log, 0, ngx_socket_n " s:%d", s); if (s == -1) { ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno, ngx_socket_n " for AcceptEx() %s post failed", ls->addr_text.data); return NGX_ERROR; } /* * Winsock assignes a socket number divisible by 4 * so to find a connection we divide a socket number by 4. */ if (s % 4) { ngx_log_error(NGX_LOG_EMERG, ls->log, 0, ngx_socket_n " created socket %d, not divisible by 4", s); exit(1); } c = &ngx_cycle->connections[s / 4]; rev = &ngx_cycle->read_events[s / 4]; wev = &ngx_cycle->write_events[s / 4]; ngx_memzero(c, sizeof(ngx_connection_t)); ngx_memzero(rev, sizeof(ngx_event_t)); ngx_memzero(wev, sizeof(ngx_event_t)); c->listening = ls; rev->index = NGX_INVALID_INDEX; wev->index = NGX_INVALID_INDEX; rev->ovlp.event = rev; wev->ovlp.event = wev; rev->handler = ngx_event_acceptex; rev->data = c; wev->data = c; c->read = rev; c->write = wev; c->fd = s; c->unexpected_eof = 1; rev->ready = 1; wev->write = 1; wev->ready = 1; c->ctx = ls->ctx; c->servers = ls->servers; c->recv = ngx_recv; c->send_chain = ngx_send_chain; c->pool = ngx_create_pool(ls->pool_size, ls->log); if (c->pool == NULL) { return NGX_ERROR; } c->buffer = ngx_create_temp_buf(c->pool, ls->post_accept_buffer_size + 2 * (c->listening->socklen + 16)); if (c->buffer == NULL) { return NGX_ERROR; } c->local_sockaddr = ngx_palloc(c->pool, ls->socklen); if (c->local_sockaddr == NULL) { return NGX_ERROR; } c->sockaddr = ngx_palloc(c->pool, ls->socklen); if (c->sockaddr == NULL) { return NGX_ERROR; } c->log = ngx_palloc(c->pool, sizeof(ngx_log_t)); if (c->log == NULL) { return NGX_ERROR; } ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); c->read->log = c->log; c->write->log = c->log; if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) { return NGX_ERROR; } if (acceptex(ls->fd, s, c->buffer->pos, ls->post_accept_buffer_size, ls->socklen + 16, ls->socklen + 16, &rcvd, (LPOVERLAPPED) &rev->ovlp) == 0) { err = ngx_socket_errno; if (err != WSA_IO_PENDING) { ngx_log_error(NGX_LOG_ALERT, ls->log, err, "AcceptEx() %s falied", ls->addr_text.data); return NGX_ERROR; } } } return NGX_OK; }