mirror of
https://github.com/nginx/nginx.git
synced 2025-06-07 17:52:38 +08:00
nginx-0.0.1-2003-11-03-20:33:31 import
This commit is contained in:
parent
659774979f
commit
a1512b1904
@ -5,13 +5,16 @@
|
|||||||
#include <ngx_http_proxy_handler.h>
|
#include <ngx_http_proxy_handler.h>
|
||||||
|
|
||||||
|
|
||||||
|
static int ngx_http_proxy_process_cached_header(ngx_http_proxy_ctx_t *p);
|
||||||
|
|
||||||
|
|
||||||
int ngx_http_proxy_get_cached_response(ngx_http_proxy_ctx_t *p)
|
int ngx_http_proxy_get_cached_response(ngx_http_proxy_ctx_t *p)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
char *last;
|
char *last;
|
||||||
ngx_http_request_t *r;
|
ngx_http_request_t *r;
|
||||||
ngx_http_proxy_cache_t *c;
|
ngx_http_proxy_cache_t *c;
|
||||||
ngx_http_proxy_upstream_t *u;
|
ngx_http_proxy_upstream_conf_t *u;
|
||||||
|
|
||||||
r = p->request;
|
r = p->request;
|
||||||
|
|
||||||
@ -19,6 +22,8 @@ int ngx_http_proxy_get_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p->cache = c;
|
||||||
|
|
||||||
c->ctx.file.fd = NGX_INVALID_FILE;
|
c->ctx.file.fd = NGX_INVALID_FILE;
|
||||||
c->ctx.file.log = r->connection->log;
|
c->ctx.file.log = r->connection->log;
|
||||||
c->ctx.path = p->lcf->cache_path;
|
c->ctx.path = p->lcf->cache_path;
|
||||||
@ -48,15 +53,21 @@ int ngx_http_proxy_get_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
p->header_in->tag = (ngx_hunk_tag_t) &ngx_http_proxy_module;
|
p->header_in->tag = (ngx_hunk_tag_t) &ngx_http_proxy_module;
|
||||||
|
|
||||||
c->ctx.buf = p->header_in;
|
c->ctx.buf = p->header_in;
|
||||||
p->cache = c;
|
|
||||||
|
|
||||||
rc = ngx_http_cache_get_file(r, &c->ctx);
|
rc = ngx_http_cache_get_file(r, &c->ctx);
|
||||||
|
|
||||||
|
if (rc == NGX_STALE) {
|
||||||
|
p->stale = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (rc == NGX_OK || rc == NGX_STALE) {
|
if (rc == NGX_OK || rc == NGX_STALE) {
|
||||||
p->header_in->pos += c->ctx.header.size;
|
p->header_in->pos += c->ctx.header_size;
|
||||||
|
if (ngx_http_proxy_process_cached_header(p) == NGX_ERROR) {
|
||||||
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (rc == NGX_DECLINED) {
|
} else if (rc == NGX_DECLINED) {
|
||||||
p->header_in->pos += c->ctx.header.size;
|
p->header_in->pos += c->ctx.header_size;
|
||||||
p->header_in->last = p->header_in->pos;
|
p->header_in->last = p->header_in->pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,7 +75,7 @@ int ngx_http_proxy_get_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ngx_http_proxy_process_cached_response(ngx_http_proxy_ctx_t *p)
|
static int ngx_http_proxy_process_cached_header(ngx_http_proxy_ctx_t *p)
|
||||||
{
|
{
|
||||||
int rc, i;
|
int rc, i;
|
||||||
ngx_table_elt_t *h;
|
ngx_table_elt_t *h;
|
||||||
@ -81,14 +92,14 @@ int ngx_http_proxy_process_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
"\"proxy_header_buffer_size\" "
|
"\"proxy_header_buffer_size\" "
|
||||||
"is too small to read header from \"%s\"",
|
"is too small to read header from \"%s\"",
|
||||||
c->ctx.file.name.data);
|
c->ctx.file.name.data);
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc == NGX_HTTP_PROXY_PARSE_NO_HEADER) {
|
if (rc == NGX_HTTP_PROXY_PARSE_NO_HEADER) {
|
||||||
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
||||||
"no valid HTTP/1.0 header in \"%s\"",
|
"no valid HTTP/1.0 header in \"%s\"",
|
||||||
c->ctx.file.name.data);
|
c->ctx.file.name.data);
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rc == NGX_OK */
|
/* rc == NGX_OK */
|
||||||
@ -97,7 +108,7 @@ int ngx_http_proxy_process_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
c->status_line.len = p->status_end - p->status_start;
|
c->status_line.len = p->status_end - p->status_start;
|
||||||
c->status_line.data = ngx_palloc(r->pool, c->status_line.len + 1);
|
c->status_line.data = ngx_palloc(r->pool, c->status_line.len + 1);
|
||||||
if (c->status_line.data == NULL) {
|
if (c->status_line.data == NULL) {
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_cpystrn(c->status_line.data, p->status_start, c->status_line.len + 1);
|
ngx_cpystrn(c->status_line.data, p->status_start, c->status_line.len + 1);
|
||||||
@ -116,7 +127,7 @@ int ngx_http_proxy_process_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
|
|
||||||
h = ngx_http_add_header(&c->headers_in, ngx_http_proxy_headers_in);
|
h = ngx_http_add_header(&c->headers_in, ngx_http_proxy_headers_in);
|
||||||
if (h == NULL) {
|
if (h == NULL) {
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
h->key.len = r->header_name_end - r->header_name_start;
|
h->key.len = r->header_name_end - r->header_name_start;
|
||||||
@ -125,7 +136,7 @@ int ngx_http_proxy_process_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
h->key.data = ngx_palloc(r->pool,
|
h->key.data = ngx_palloc(r->pool,
|
||||||
h->key.len + 1 + h->value.len + 1);
|
h->key.len + 1 + h->value.len + 1);
|
||||||
if (h->key.data == NULL) {
|
if (h->key.data == NULL) {
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
h->value.data = h->key.data + h->key.len + 1;
|
h->value.data = h->key.data + h->key.len + 1;
|
||||||
@ -157,14 +168,14 @@ int ngx_http_proxy_process_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
|
|
||||||
ngx_log_debug(r->connection->log, "HTTP header done");
|
ngx_log_debug(r->connection->log, "HTTP header done");
|
||||||
|
|
||||||
return ngx_http_proxy_send_cached_response(p);
|
return NGX_OK;
|
||||||
|
|
||||||
} else if (rc == NGX_HTTP_PARSE_INVALID_HEADER) {
|
} else if (rc == NGX_HTTP_PARSE_INVALID_HEADER) {
|
||||||
|
|
||||||
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
||||||
"invalid header in \"%s\"",
|
"invalid header in \"%s\"",
|
||||||
c->ctx.file.name.data);
|
c->ctx.file.name.data);
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rc == NGX_AGAIN || rc == NGX_HTTP_PARSE_TOO_LONG_HEADER */
|
/* rc == NGX_AGAIN || rc == NGX_HTTP_PARSE_TOO_LONG_HEADER */
|
||||||
@ -173,7 +184,7 @@ int ngx_http_proxy_process_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
"\"proxy_header_buffer_size\" "
|
"\"proxy_header_buffer_size\" "
|
||||||
"is too small to read header from \"%s\"",
|
"is too small to read header from \"%s\"",
|
||||||
c->ctx.file.name.data);
|
c->ctx.file.name.data);
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -187,7 +198,7 @@ int ngx_http_proxy_send_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
|
|
||||||
r = p->request;
|
r = p->request;
|
||||||
|
|
||||||
r->headers_out.status = p->status;
|
r->headers_out.status = p->cache->status;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
r->headers_out.content_length_n = -1;
|
r->headers_out.content_length_n = -1;
|
||||||
@ -233,3 +244,14 @@ int ngx_http_proxy_send_cached_response(ngx_http_proxy_ctx_t *p)
|
|||||||
|
|
||||||
return ngx_http_output_filter(r, &out);
|
return ngx_http_output_filter(r, &out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ngx_http_proxy_update_cache(ngx_http_proxy_ctx_t *p)
|
||||||
|
{
|
||||||
|
if (p->cache == NULL) {
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ngx_http_cache_update_file(p->request, &p->cache->ctx,
|
||||||
|
&p->upstream->event_pipe->temp_file->file.name);
|
||||||
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -11,93 +11,102 @@
|
|||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ngx_str_t url;
|
ngx_str_t url;
|
||||||
ngx_str_t host;
|
ngx_str_t host;
|
||||||
ngx_str_t uri;
|
ngx_str_t uri;
|
||||||
ngx_str_t host_header;
|
ngx_str_t host_header;
|
||||||
ngx_str_t port_text;
|
ngx_str_t port_text;
|
||||||
ngx_str_t *location;
|
ngx_str_t *location;
|
||||||
int port;
|
int port;
|
||||||
} ngx_http_proxy_upstream_t;
|
} ngx_http_proxy_upstream_conf_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ssize_t request_buffer_size;
|
ssize_t request_buffer_size;
|
||||||
ngx_msec_t connect_timeout;
|
ngx_msec_t connect_timeout;
|
||||||
ngx_msec_t send_timeout;
|
ngx_msec_t send_timeout;
|
||||||
ssize_t header_buffer_size;
|
ssize_t header_buffer_size;
|
||||||
ngx_msec_t read_timeout;
|
ngx_msec_t read_timeout;
|
||||||
|
|
||||||
ngx_bufs_t bufs;
|
ngx_bufs_t bufs;
|
||||||
ssize_t busy_buffers_size;
|
ssize_t busy_buffers_size;
|
||||||
|
|
||||||
ssize_t max_temp_file_size;
|
ssize_t max_temp_file_size;
|
||||||
ssize_t temp_file_write_size;
|
ssize_t temp_file_write_size;
|
||||||
int cyclic_temp_file;
|
int cyclic_temp_file;
|
||||||
|
|
||||||
int cache;
|
int cache;
|
||||||
int pass_server;
|
int pass_server;
|
||||||
|
|
||||||
int next_upstream;
|
int next_upstream;
|
||||||
int use_stale;
|
int use_stale;
|
||||||
|
|
||||||
ngx_path_t *cache_path;
|
ngx_path_t *cache_path;
|
||||||
ngx_path_t *temp_path;
|
ngx_path_t *temp_path;
|
||||||
|
|
||||||
ngx_http_proxy_upstream_t *upstream;
|
ngx_http_proxy_upstream_conf_t *upstream;
|
||||||
ngx_peers_t *peers;
|
ngx_peers_t *peers;
|
||||||
} ngx_http_proxy_loc_conf_t;
|
} ngx_http_proxy_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int status;
|
int status;
|
||||||
ngx_str_t *peer;
|
ngx_str_t *peer;
|
||||||
} ngx_http_proxy_state_t;
|
} ngx_http_proxy_state_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ngx_table_t *headers; /* it must be first field */
|
ngx_table_t *headers; /* it must be first field */
|
||||||
|
|
||||||
ngx_table_elt_t *date;
|
ngx_table_elt_t *date;
|
||||||
ngx_table_elt_t *server;
|
ngx_table_elt_t *server;
|
||||||
ngx_table_elt_t *connection;
|
|
||||||
ngx_table_elt_t *content_type;
|
|
||||||
ngx_table_elt_t *content_length;
|
|
||||||
ngx_table_elt_t *last_modified;
|
|
||||||
ngx_table_elt_t *accept_ranges;
|
|
||||||
|
|
||||||
off_t content_length_n;
|
ngx_table_elt_t *expires;
|
||||||
|
ngx_table_elt_t *cache_control;
|
||||||
|
ngx_table_elt_t *x_accel_expires;
|
||||||
|
|
||||||
|
ngx_table_elt_t *connection;
|
||||||
|
ngx_table_elt_t *content_type;
|
||||||
|
ngx_table_elt_t *content_length;
|
||||||
|
ngx_table_elt_t *last_modified;
|
||||||
|
ngx_table_elt_t *accept_ranges;
|
||||||
|
|
||||||
|
off_t content_length_n;
|
||||||
} ngx_http_proxy_headers_in_t;
|
} ngx_http_proxy_headers_in_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ngx_http_cache_ctx_t ctx;
|
ngx_http_cache_ctx_t ctx;
|
||||||
int status;
|
int status;
|
||||||
ngx_str_t status_line;
|
ngx_str_t status_line;
|
||||||
ngx_http_proxy_headers_in_t headers_in;
|
|
||||||
|
ngx_http_proxy_headers_in_t headers_in;
|
||||||
} ngx_http_proxy_cache_t;
|
} ngx_http_proxy_cache_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_peer_connection_t peer;
|
||||||
|
int status;
|
||||||
|
ngx_str_t status_line;
|
||||||
|
int method;
|
||||||
|
|
||||||
|
ngx_output_chain_ctx_t *output_chain_ctx;
|
||||||
|
ngx_event_pipe_t *event_pipe;
|
||||||
|
|
||||||
|
ngx_http_proxy_headers_in_t headers_in;
|
||||||
|
} ngx_http_proxy_upstream_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct ngx_http_proxy_ctx_s ngx_http_proxy_ctx_t;
|
typedef struct ngx_http_proxy_ctx_s ngx_http_proxy_ctx_t;
|
||||||
|
|
||||||
struct ngx_http_proxy_ctx_s {
|
struct ngx_http_proxy_ctx_s {
|
||||||
ngx_peer_connection_t upstream;
|
|
||||||
ngx_peer_t *peer;
|
|
||||||
|
|
||||||
ngx_http_request_t *request;
|
ngx_http_request_t *request;
|
||||||
ngx_http_proxy_loc_conf_t *lcf;
|
ngx_http_proxy_loc_conf_t *lcf;
|
||||||
|
ngx_http_proxy_upstream_t *upstream;
|
||||||
ngx_http_proxy_cache_t *cache;
|
ngx_http_proxy_cache_t *cache;
|
||||||
ngx_http_proxy_headers_in_t headers_in;
|
|
||||||
|
|
||||||
ngx_hunk_t *header_in;
|
ngx_hunk_t *header_in;
|
||||||
int status;
|
|
||||||
ngx_str_t status_line;
|
|
||||||
|
|
||||||
ngx_output_chain_ctx_t *output_chain_ctx;
|
|
||||||
|
|
||||||
int method;
|
|
||||||
|
|
||||||
ngx_event_pipe_t *event_pipe;
|
|
||||||
|
|
||||||
unsigned accel:1;
|
unsigned accel:1;
|
||||||
|
|
||||||
@ -107,7 +116,9 @@ struct ngx_http_proxy_ctx_s {
|
|||||||
unsigned request_sent:1;
|
unsigned request_sent:1;
|
||||||
unsigned header_sent:1;
|
unsigned header_sent:1;
|
||||||
|
|
||||||
|
|
||||||
/* used to parse an upstream HTTP header */
|
/* used to parse an upstream HTTP header */
|
||||||
|
int status;
|
||||||
char *status_start;
|
char *status_start;
|
||||||
char *status_end;
|
char *status_end;
|
||||||
int status_count;
|
int status_count;
|
||||||
@ -121,8 +132,6 @@ struct ngx_http_proxy_ctx_s {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define NGX_STALE 1
|
|
||||||
|
|
||||||
#define NGX_HTTP_PROXY_PARSE_NO_HEADER 20
|
#define NGX_HTTP_PROXY_PARSE_NO_HEADER 20
|
||||||
|
|
||||||
#define NGX_HTTP_PROXY_FT_ERROR 2
|
#define NGX_HTTP_PROXY_FT_ERROR 2
|
||||||
@ -134,11 +143,16 @@ struct ngx_http_proxy_ctx_s {
|
|||||||
#define NGX_HTTP_PROXY_FT_MAX_WAITING 128
|
#define NGX_HTTP_PROXY_FT_MAX_WAITING 128
|
||||||
|
|
||||||
|
|
||||||
void ngx_http_proxy_reinit_upstream(ngx_http_proxy_ctx_t *p);
|
int ngx_http_proxy_request_upstream(ngx_http_proxy_ctx_t *p);
|
||||||
|
|
||||||
int ngx_http_proxy_get_cached_response(ngx_http_proxy_ctx_t *p);
|
int ngx_http_proxy_get_cached_response(ngx_http_proxy_ctx_t *p);
|
||||||
int ngx_http_proxy_process_cached_response(ngx_http_proxy_ctx_t *p);
|
|
||||||
int ngx_http_proxy_send_cached_response(ngx_http_proxy_ctx_t *p);
|
int ngx_http_proxy_send_cached_response(ngx_http_proxy_ctx_t *p);
|
||||||
|
int ngx_http_proxy_update_cache(ngx_http_proxy_ctx_t *p);
|
||||||
|
|
||||||
|
int ngx_http_proxy_log_state(ngx_http_proxy_ctx_t *p, int status);
|
||||||
|
size_t ngx_http_proxy_log_error(void *data, char *buf, size_t len);
|
||||||
|
void ngx_http_proxy_finalize_request(ngx_http_proxy_ctx_t *p, int rc);
|
||||||
|
void ngx_http_proxy_close_connection(ngx_connection_t *c);
|
||||||
|
|
||||||
int ngx_http_proxy_parse_status_line(ngx_http_proxy_ctx_t *p);
|
int ngx_http_proxy_parse_status_line(ngx_http_proxy_ctx_t *p);
|
||||||
int ngx_http_proxy_copy_header(ngx_http_proxy_ctx_t *p,
|
int ngx_http_proxy_copy_header(ngx_http_proxy_ctx_t *p,
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -8,12 +8,12 @@
|
|||||||
|
|
||||||
int ngx_http_cache_get_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx)
|
int ngx_http_cache_get_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx)
|
||||||
{
|
{
|
||||||
int small;
|
ssize_t n;
|
||||||
ssize_t n, len;
|
MD5_CTX md5;
|
||||||
MD5_CTX md5;
|
ngx_err_t err;
|
||||||
ngx_err_t err;
|
ngx_http_cache_file_t *h;
|
||||||
ngx_str_t key;
|
|
||||||
ngx_http_bin_cache_t *h;
|
ctx->header_size = sizeof(ngx_http_cache_file_t) + ctx->key.len + 1;
|
||||||
|
|
||||||
ctx->file.name.len = ctx->path->name.len + 1 + ctx->path->len + 32;
|
ctx->file.name.len = ctx->path->name.len + 1 + ctx->path->len + 32;
|
||||||
if (!(ctx->file.name.data = ngx_palloc(r->pool, ctx->file.name.len + 1))) {
|
if (!(ctx->file.name.data = ngx_palloc(r->pool, ctx->file.name.len + 1))) {
|
||||||
@ -43,13 +43,6 @@ ngx_log_debug(r->connection->log, "FILE: %s" _ ctx->file.name.data);
|
|||||||
err = ngx_errno;
|
err = ngx_errno;
|
||||||
|
|
||||||
if (err == NGX_ENOENT || err == NGX_ENOTDIR) {
|
if (err == NGX_ENOENT || err == NGX_ENOTDIR) {
|
||||||
|
|
||||||
/* TODO: text size */
|
|
||||||
|
|
||||||
ctx->header.size = 2 * sizeof(ssize_t)
|
|
||||||
+ sizeof(ngx_http_cache_header_t)
|
|
||||||
+ ctx->key.len + 1;
|
|
||||||
|
|
||||||
return NGX_DECLINED;
|
return NGX_DECLINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,58 +58,31 @@ ngx_log_debug(r->connection->log, "FILE: %s" _ ctx->file.name.data);
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = 0;
|
if (n <= ctx->header_size) {
|
||||||
small = 1;
|
|
||||||
|
|
||||||
if (n > 1) {
|
|
||||||
if (ctx->buf->pos[0] == 'T') {
|
|
||||||
/* STUB */
|
|
||||||
return NGX_ERROR;
|
|
||||||
|
|
||||||
} else if (ctx->buf->pos[0] == 'B') {
|
|
||||||
|
|
||||||
len = sizeof(ngx_http_bin_cache_t);
|
|
||||||
|
|
||||||
if (n > len) {
|
|
||||||
h = (ngx_http_bin_cache_t *) ctx->buf->pos;
|
|
||||||
key.len = h->key_len;
|
|
||||||
|
|
||||||
if (n >= len + (ssize_t) key.len + 1) {
|
|
||||||
ctx->header = h->header;
|
|
||||||
key.data = h->key;
|
|
||||||
|
|
||||||
small = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
|
|
||||||
"unknown type of cache file \"%s\"",
|
|
||||||
ctx->file.name.data);
|
|
||||||
return NGX_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (small) {
|
|
||||||
ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
|
ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
|
||||||
"cache file \"%s\" is to small", ctx->file.name.data);
|
"cache file \"%s\" is too small", ctx->file.name.data);
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key.len != ctx->key.len
|
h = (ngx_http_cache_file_t *) ctx->buf->pos;
|
||||||
|| ngx_strncmp(key.data, ctx->key.data, key.len) != 0)
|
ctx->header = h->header;
|
||||||
|
|
||||||
|
if (h->key_len != ctx->key.len
|
||||||
|
|| ngx_strncmp(h->key, ctx->key.data, h->key_len) != 0)
|
||||||
{
|
{
|
||||||
key.data[key.len] = '\0';
|
h->key[h->key_len] = '\0';
|
||||||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
|
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
|
||||||
"md5 collision: \"%s\" and \"%s\"",
|
"md5 collision: \"%s\" and \"%s\"",
|
||||||
key.data, ctx->key.data);
|
h->key, ctx->key.data);
|
||||||
return NGX_DECLINED;
|
return NGX_DECLINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->header.size = len + key.len + 1;
|
|
||||||
ctx->buf->last += n;
|
ctx->buf->last += n;
|
||||||
|
|
||||||
|
if (ctx->header.expires < ngx_time()) {
|
||||||
|
return NGX_STALE;
|
||||||
|
}
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,31 +10,14 @@ typedef struct {
|
|||||||
time_t expires;
|
time_t expires;
|
||||||
time_t last_modified;
|
time_t last_modified;
|
||||||
off_t length;
|
off_t length;
|
||||||
|
|
||||||
size_t size;
|
|
||||||
} ngx_http_cache_header_t;
|
} ngx_http_cache_header_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ssize_t type;
|
|
||||||
ngx_http_cache_header_t header;
|
ngx_http_cache_header_t header;
|
||||||
ssize_t key_len;
|
size_t key_len;
|
||||||
char key[0];
|
char key[0];
|
||||||
} ngx_http_bin_cache_t;
|
} ngx_http_cache_file_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char type;
|
|
||||||
char space0;
|
|
||||||
char expires[8];
|
|
||||||
char space1;
|
|
||||||
char last_modified[8];
|
|
||||||
char space2;
|
|
||||||
char length[16];
|
|
||||||
char space3;
|
|
||||||
char lf;
|
|
||||||
char key_len[0];
|
|
||||||
} ngx_http_text_cache_t;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -57,15 +40,17 @@ typedef struct {
|
|||||||
ngx_path_t *path;
|
ngx_path_t *path;
|
||||||
ngx_hunk_t *buf;
|
ngx_hunk_t *buf;
|
||||||
ngx_http_cache_header_t header;
|
ngx_http_cache_header_t header;
|
||||||
|
ssize_t header_size;
|
||||||
} ngx_http_cache_ctx_t;
|
} ngx_http_cache_ctx_t;
|
||||||
|
|
||||||
|
|
||||||
|
#define NGX_STALE 1
|
||||||
|
|
||||||
|
|
||||||
int ngx_http_cache_get_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx);
|
int ngx_http_cache_get_file(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx);
|
||||||
int ngx_http_cache_update_file(ngx_http_request_t *r,ngx_http_cache_ctx_t *ctx,
|
int ngx_http_cache_update_file(ngx_http_request_t *r,ngx_http_cache_ctx_t *ctx,
|
||||||
ngx_str_t *temp_file);
|
ngx_str_t *temp_file);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _NGX_HTTP_CACHE_H_INCLUDED_ */
|
#endif /* _NGX_HTTP_CACHE_H_INCLUDED_ */
|
||||||
|
@ -18,15 +18,13 @@ int ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|||||||
size = r->header_in->last - r->header_in->pos;
|
size = r->header_in->last - r->header_in->pos;
|
||||||
|
|
||||||
if (size) {
|
if (size) {
|
||||||
ngx_test_null(h, ngx_calloc_hunk(r->pool),
|
ngx_test_null(h, ngx_calloc_hunk(r->pool), NGX_ERROR);
|
||||||
NGX_HTTP_INTERNAL_SERVER_ERROR);
|
|
||||||
|
|
||||||
h->type = NGX_HUNK_IN_MEMORY|NGX_HUNK_TEMP;
|
h->type = NGX_HUNK_IN_MEMORY|NGX_HUNK_TEMP;
|
||||||
h->start = h->pos = r->header_in->pos;
|
h->start = h->pos = r->header_in->pos;
|
||||||
h->end = h->last = r->header_in->last;
|
h->end = h->last = r->header_in->last;
|
||||||
|
|
||||||
ngx_alloc_link_and_set_hunk(r->request_hunks, h, r->pool,
|
ngx_alloc_link_and_set_hunk(r->request_hunks, h, r->pool, NGX_ERROR);
|
||||||
NGX_HTTP_INTERNAL_SERVER_ERROR);
|
|
||||||
|
|
||||||
if (size >= r->headers_in.content_length_n) {
|
if (size >= r->headers_in.content_length_n) {
|
||||||
r->header_in->pos += r->headers_in.content_length_n;
|
r->header_in->pos += r->headers_in.content_length_n;
|
||||||
@ -48,7 +46,7 @@ int ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngx_test_null(r->request_body_hunk, ngx_create_temp_hunk(r->pool, size),
|
ngx_test_null(r->request_body_hunk, ngx_create_temp_hunk(r->pool, size),
|
||||||
NGX_HTTP_INTERNAL_SERVER_ERROR);
|
NGX_ERROR);
|
||||||
|
|
||||||
r->connection->read->event_handler =
|
r->connection->read->event_handler =
|
||||||
ngx_http_read_client_request_body_handler;
|
ngx_http_read_client_request_body_handler;
|
||||||
@ -56,7 +54,7 @@ int ngx_http_read_client_request_body(ngx_http_request_t *r,
|
|||||||
ngx_http_read_client_request_body_handler(r->connection->read);
|
ngx_http_read_client_request_body_handler(r->connection->read);
|
||||||
|
|
||||||
ngx_alloc_link_and_set_hunk(cl, r->request_body_hunk, r->pool,
|
ngx_alloc_link_and_set_hunk(cl, r->request_body_hunk, r->pool,
|
||||||
NGX_HTTP_INTERNAL_SERVER_ERROR);
|
NGX_ERROR);
|
||||||
|
|
||||||
if (r->request_hunks) {
|
if (r->request_hunks) {
|
||||||
r->request_hunks->next = cl;
|
r->request_hunks->next = cl;
|
||||||
|
Loading…
Reference in New Issue
Block a user