mirror of
https://github.com/nginx/nginx.git
synced 2025-02-25 18:55:26 -06:00
nginx-0.0.3-2004-03-30-10:27:36 import
This commit is contained in:
parent
11dbe97ca4
commit
6881bfb990
4
auto/cc
4
auto/cc
@ -62,8 +62,8 @@ case $CC in
|
|||||||
# debug
|
# debug
|
||||||
CFLAGS="$CFLAGS -g"
|
CFLAGS="$CFLAGS -g"
|
||||||
|
|
||||||
# DragonFly's gcc3 generate DWARF
|
# DragonFly's gcc3 generates DWARF
|
||||||
CFLAGS="$CFLAGS -g -gstabs"
|
#CFLAGS="$CFLAGS -g -gstabs"
|
||||||
|
|
||||||
have=HAVE_GCC_VARIADIC_MACROS . auto/have
|
have=HAVE_GCC_VARIADIC_MACROS . auto/have
|
||||||
|
|
||||||
|
@ -1,10 +1,4 @@
|
|||||||
|
|
||||||
if [ $EVENT_RTSIG = YES ]; then
|
|
||||||
have=HAVE_RTSIG . auto/have
|
|
||||||
EVENT_MODULES="$EVENT_MODULES $RTSIG_MODULE"
|
|
||||||
CORE_SRCS="$CORE_SRCS $RTSIG_SRCS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $EVENT_SELECT = NO -a $EVENT_FOUND = NO ]; then
|
if [ $EVENT_SELECT = NO -a $EVENT_FOUND = NO ]; then
|
||||||
EVENT_SELECT=YES
|
EVENT_SELECT=YES
|
||||||
fi
|
fi
|
||||||
|
8
auto/nohave
Normal file
8
auto/nohave
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
cat << END >> $NGX_AUTO_CONFIG_H
|
||||||
|
|
||||||
|
#ifndef $have
|
||||||
|
#define $have 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
END
|
@ -42,8 +42,8 @@ then
|
|||||||
|
|
||||||
have=HAVE_KQUEUE . auto/have
|
have=HAVE_KQUEUE . auto/have
|
||||||
have=HAVE_CLEAR_EVENT . auto/have
|
have=HAVE_CLEAR_EVENT . auto/have
|
||||||
CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"
|
|
||||||
EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"
|
EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"
|
||||||
|
CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"
|
||||||
EVENT_FOUND=YES
|
EVENT_FOUND=YES
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -60,6 +60,9 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
if [ $EVENT_AIO = YES ]; then
|
if [ $EVENT_AIO = YES ]; then
|
||||||
CORE_SRCS="$CORE_SRCS $AIO_SRCS"
|
have=HAVE_AIO . auto/have
|
||||||
EVENT_MODULES="$EVENT_MODULES $AIO_MODULE"
|
EVENT_MODULES="$EVENT_MODULES $AIO_MODULE"
|
||||||
|
CORE_SRCS="$CORE_SRCS $AIO_SRCS"
|
||||||
|
else
|
||||||
|
have=HAVE_AIO . auto/nohave
|
||||||
fi
|
fi
|
||||||
|
@ -30,6 +30,15 @@ if [ $ngx_found = yes ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# rtsig
|
||||||
|
|
||||||
|
if [ $EVENT_RTSIG = YES ]; then
|
||||||
|
have=HAVE_RTSIG . auto/have
|
||||||
|
EVENT_MODULES="$EVENT_MODULES $RTSIG_MODULE"
|
||||||
|
CORE_SRCS="$CORE_SRCS $RTSIG_SRCS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# sendfile()
|
# sendfile()
|
||||||
|
|
||||||
CC_TEST_FLAGS="-D_GNU_SOURCE"
|
CC_TEST_FLAGS="-D_GNU_SOURCE"
|
||||||
|
@ -64,7 +64,7 @@ static ngx_inline uint32_t ngx_atomic_cmp_set(ngx_atomic_t *lock,
|
|||||||
" setz %%al; "
|
" setz %%al; "
|
||||||
" movzbl %%al, %0; "
|
" movzbl %%al, %0; "
|
||||||
|
|
||||||
: "+a" (res) : "m" (*lock), "a" (old), "q" (set));
|
: "=a" (res) : "m" (*lock), "a" (old), "q" (set));
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -374,28 +374,29 @@ static int ngx_http_proxy_handler(ngx_http_request_t *r)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ngx_http_proxy_check_broken_connection(ngx_event_t *wev)
|
void ngx_http_proxy_check_broken_connection(ngx_event_t *ev)
|
||||||
{
|
{
|
||||||
ngx_connection_t *c;
|
ngx_connection_t *c;
|
||||||
ngx_http_request_t *r;
|
ngx_http_request_t *r;
|
||||||
ngx_http_proxy_ctx_t *p;
|
ngx_http_proxy_ctx_t *p;
|
||||||
|
|
||||||
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, "http proxy check client");
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, 0,
|
||||||
|
"http proxy check client, write event:%d", ev->write);
|
||||||
|
|
||||||
c = wev->data;
|
c = ev->data;
|
||||||
r = c->data;
|
r = c->data;
|
||||||
p = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
|
p = ngx_http_get_module_ctx(r, ngx_http_proxy_module);
|
||||||
|
|
||||||
#if (HAVE_KQUEUE)
|
#if (HAVE_KQUEUE)
|
||||||
if (wev->kq_eof) {
|
if (ev->kq_eof) {
|
||||||
wev->eof = 1;
|
ev->eof = 1;
|
||||||
|
|
||||||
if (wev->kq_errno) {
|
if (ev->kq_errno) {
|
||||||
wev->error = 1;
|
ev->error = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!p->cachable && p->upstream->peer.connection) {
|
if (!p->cachable && p->upstream->peer.connection) {
|
||||||
ngx_log_error(NGX_LOG_INFO, wev->log, wev->kq_errno,
|
ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
|
||||||
"kevent() reported that client have closed "
|
"kevent() reported that client have closed "
|
||||||
"prematurely connection, "
|
"prematurely connection, "
|
||||||
"so upstream connection is closed too");
|
"so upstream connection is closed too");
|
||||||
@ -403,7 +404,7 @@ void ngx_http_proxy_check_broken_connection(ngx_event_t *wev)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_log_error(NGX_LOG_INFO, wev->log, wev->kq_errno,
|
ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno,
|
||||||
"kevent() reported that client have closed "
|
"kevent() reported that client have closed "
|
||||||
"prematurely connection");
|
"prematurely connection");
|
||||||
|
|
||||||
|
@ -227,7 +227,7 @@ void ngx_http_proxy_cache_busy_lock(ngx_http_proxy_ctx_t *p);
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ngx_http_proxy_check_broken_connection(ngx_event_t *wev);
|
void ngx_http_proxy_check_broken_connection(ngx_event_t *ev);
|
||||||
|
|
||||||
void ngx_http_proxy_busy_lock_handler(ngx_event_t *rev);
|
void ngx_http_proxy_busy_lock_handler(ngx_event_t *rev);
|
||||||
void ngx_http_proxy_upstream_busy_lock(ngx_http_proxy_ctx_t *p);
|
void ngx_http_proxy_upstream_busy_lock(ngx_http_proxy_ctx_t *p);
|
||||||
|
@ -70,40 +70,36 @@ int ngx_http_proxy_request_upstream(ngx_http_proxy_ctx_t *p)
|
|||||||
}
|
}
|
||||||
r->request_body = rb;
|
r->request_body = rb;
|
||||||
|
|
||||||
if (r->headers_in.content_length_n > 0) {
|
if (r->headers_in.content_length_n <= 0) {
|
||||||
|
ngx_http_proxy_init_upstream(p);
|
||||||
if (!(tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)))) {
|
return NGX_DONE;
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
tf->file.fd = NGX_INVALID_FILE;
|
|
||||||
tf->file.log = r->connection->log;
|
|
||||||
tf->path = p->lcf->temp_path;
|
|
||||||
tf->pool = r->pool;
|
|
||||||
tf->warn = "a client request body is buffered to a temporary file";
|
|
||||||
/* tf->persistent = 0; */
|
|
||||||
|
|
||||||
rb->buf_size = p->lcf->request_buffer_size;
|
|
||||||
rb->handler = ngx_http_proxy_init_upstream;
|
|
||||||
rb->data = p;
|
|
||||||
/* rb->bufs = NULL; */
|
|
||||||
/* rb->buf = NULL; */
|
|
||||||
/* rb->rest = 0; */
|
|
||||||
|
|
||||||
rb->temp_file = tf;
|
|
||||||
|
|
||||||
rc = ngx_http_read_client_request_body(r);
|
|
||||||
|
|
||||||
if (rc == NGX_AGAIN) {
|
|
||||||
return NGX_DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_http_proxy_init_upstream(p);
|
if (!(tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)))) {
|
||||||
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
tf->file.fd = NGX_INVALID_FILE;
|
||||||
|
tf->file.log = r->connection->log;
|
||||||
|
tf->path = p->lcf->temp_path;
|
||||||
|
tf->pool = r->pool;
|
||||||
|
tf->warn = "a client request body is buffered to a temporary file";
|
||||||
|
/* tf->persistent = 0; */
|
||||||
|
|
||||||
|
rb->buf_size = p->lcf->request_buffer_size;
|
||||||
|
rb->handler = ngx_http_proxy_init_upstream;
|
||||||
|
rb->data = p;
|
||||||
|
/* rb->bufs = NULL; */
|
||||||
|
/* rb->buf = NULL; */
|
||||||
|
/* rb->rest = 0; */
|
||||||
|
|
||||||
|
rb->temp_file = tf;
|
||||||
|
|
||||||
|
rc = ngx_http_read_client_request_body(r);
|
||||||
|
|
||||||
|
if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
return NGX_DONE;
|
return NGX_DONE;
|
||||||
}
|
}
|
||||||
@ -323,13 +319,15 @@ static void ngx_http_proxy_init_upstream(void *data)
|
|||||||
r = p->request;
|
r = p->request;
|
||||||
|
|
||||||
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
"http proxy set timer: %d",
|
"http proxy init upstream, client timer: %d",
|
||||||
r->connection->read->timer_set);
|
r->connection->read->timer_set);
|
||||||
|
|
||||||
if (r->connection->read->timer_set) {
|
if (r->connection->read->timer_set) {
|
||||||
ngx_del_timer(r->connection->read);
|
ngx_del_timer(r->connection->read);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r->connection->read->event_handler = ngx_http_proxy_check_broken_connection;
|
||||||
|
|
||||||
if ((ngx_event_flags & (NGX_USE_CLEAR_EVENT|NGX_HAVE_KQUEUE_EVENT))
|
if ((ngx_event_flags & (NGX_USE_CLEAR_EVENT|NGX_HAVE_KQUEUE_EVENT))
|
||||||
&& !r->connection->write->active)
|
&& !r->connection->write->active)
|
||||||
{
|
{
|
||||||
|
@ -39,6 +39,7 @@ static char *client_header_errors[] = {
|
|||||||
"client %s sent too long header line, URL: %s",
|
"client %s sent too long header line, URL: %s",
|
||||||
"client %s sent HTTP/1.1 request without \"Host\" header, URL: %s",
|
"client %s sent HTTP/1.1 request without \"Host\" header, URL: %s",
|
||||||
"client %s sent invalid \"Content-Length\" header, URL: %s"
|
"client %s sent invalid \"Content-Length\" header, URL: %s"
|
||||||
|
"client %s sent POST method without \"Content-Length\" header, URL: %s"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -873,6 +874,10 @@ static ngx_int_t ngx_http_process_request_header(ngx_http_request_t *r)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r->method == NGX_HTTP_POST && r->headers_in.content_length_n <= 0) {
|
||||||
|
return NGX_HTTP_PARSE_POST_WO_CL_HEADER;
|
||||||
|
}
|
||||||
|
|
||||||
if (r->headers_in.connection) {
|
if (r->headers_in.connection) {
|
||||||
if (r->headers_in.connection->value.len == 5
|
if (r->headers_in.connection->value.len == 5
|
||||||
&& ngx_strcasecmp(r->headers_in.connection->value.data, "close")
|
&& ngx_strcasecmp(r->headers_in.connection->value.data, "close")
|
||||||
@ -1222,10 +1227,17 @@ static void ngx_http_set_keepalive(ngx_http_request_t *r)
|
|||||||
wev = c->write;
|
wev = c->write;
|
||||||
wev->event_handler = ngx_http_empty_handler;
|
wev->event_handler = ngx_http_empty_handler;
|
||||||
|
|
||||||
|
|
||||||
|
/* skip the tralling "\r\n" before the possible pipelined request */
|
||||||
|
|
||||||
|
while (h->pos < h->last && (*h->pos == CR || *h->pos == LF)) {
|
||||||
|
h->pos++;
|
||||||
|
}
|
||||||
|
|
||||||
if (h->pos < h->last) {
|
if (h->pos < h->last) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pipelined request.
|
* The pipelined request.
|
||||||
*
|
*
|
||||||
* We do not know here whether the pipelined request is complete
|
* We do not know here whether the pipelined request is complete
|
||||||
* so if the large client headers are not enabled
|
* so if the large client headers are not enabled
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#define NGX_HTTP_PARSE_TOO_LONG_HEADER 15
|
#define NGX_HTTP_PARSE_TOO_LONG_HEADER 15
|
||||||
#define NGX_HTTP_PARSE_NO_HOST_HEADER 16
|
#define NGX_HTTP_PARSE_NO_HOST_HEADER 16
|
||||||
#define NGX_HTTP_PARSE_INVALID_CL_HEADER 17
|
#define NGX_HTTP_PARSE_INVALID_CL_HEADER 17
|
||||||
|
#define NGX_HTTP_PARSE_POST_WO_CL_HEADER 18
|
||||||
|
|
||||||
|
|
||||||
#define NGX_HTTP_OK 200
|
#define NGX_HTTP_OK 200
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
#include <ngx_core.h>
|
#include <ngx_core.h>
|
||||||
|
|
||||||
|
|
||||||
ssize_t ngx_aio_read(ngx_connection_t *c, char *buf, size_t size);
|
ssize_t ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size);
|
||||||
ssize_t ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl);
|
ssize_t ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl);
|
||||||
ssize_t ngx_aio_write(ngx_connection_t *c, char *buf, size_t size);
|
ssize_t ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size);
|
||||||
ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in);
|
ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in);
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
* timeout, aio_cancel(), aio_error()
|
* timeout, aio_cancel(), aio_error()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ssize_t ngx_aio_read(ngx_connection_t *c, char *buf, size_t size)
|
ssize_t ngx_aio_read(ngx_connection_t *c, u_char *buf, size_t size)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
ngx_event_t *rev;
|
ngx_event_t *rev;
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
ssize_t ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl)
|
ssize_t ngx_aio_read_chain(ngx_connection_t *c, ngx_chain_t *cl)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
char *buf, *prev;
|
u_char *buf, *prev;
|
||||||
size_t size, total;
|
size_t size, total;
|
||||||
ngx_err_t err;
|
ngx_err_t err;
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
* timeout, aio_cancel(), aio_error()
|
* timeout, aio_cancel(), aio_error()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ssize_t ngx_aio_write(ngx_connection_t *c, char *buf, size_t size)
|
ssize_t ngx_aio_write(ngx_connection_t *c, u_char *buf, size_t size)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
ngx_event_t *wev;
|
ngx_event_t *wev;
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in)
|
ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
char *buf, *prev;
|
u_char *buf, *prev;
|
||||||
off_t sent;
|
off_t sent;
|
||||||
size_t size;
|
size_t size;
|
||||||
ngx_err_t err;
|
ngx_err_t err;
|
||||||
|
Loading…
Reference in New Issue
Block a user