Mercurial > hg > nginx-quic
view src/mysql/ngx_mysql.h @ 6428:545b5e4d83b2
Upstream: avoid closing client connection in edge case.
If proxy_cache is enabled, and proxy_no_cache tests true, it was previously
possible for the client connection to be closed after a 304. The fix is to
recheck r->header_only after the final cacheability is determined, and end the
request if no longer cacheable.
Example configuration:
proxy_cache foo;
proxy_cache_bypass 1;
proxy_no_cache 1;
If a client sends If-None-Match, and the upstream server returns 200 with a
matching ETag, no body should be returned to the client. At the start of
ngx_http_upstream_send_response proxy_no_cache is not yet tested, thus cacheable
is still 1 and downstream_error is set.
However, by the time the downstream_error check is done in process_request,
proxy_no_cache has been tested and cacheable is set to 0. The client connection
is then closed, regardless of keepalive.
author | Justin Li <jli.justinli@gmail.com> |
---|---|
date | Tue, 08 Mar 2016 22:31:55 -0500 |
parents | d620f497c50f |
children |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #ifndef _NGX_MYSQL_H_INCLUDED_ #define _NGX_MYSQL_H_INCLUDED_ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_event.h> #include <ngx_event_connect.h> typedef struct ngx_mysql_s ngx_mysql_t; typedef void (*ngx_mysql_handler_pt)(ngx_mysql_t *m); struct ngx_mysql_s { ngx_peer_connection_t peer; ngx_buf_t *buf; ngx_pool_t *pool; ngx_str_t *login; ngx_str_t *passwd; ngx_str_t *database; ngx_str_t query; ngx_uint_t pktn; ngx_mysql_handler_pt handler; void *data; ngx_int_t state; }; #define NGX_MYSQL_CMDPKT_LEN 5 #if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED && 0) #define ngx_m16toh(n) (*(uint32_t *) n & 0x0000ffff) #define ngx_m24toh(n) (*(uint32_t *) n & 0x00ffffff) #define ngx_m32toh(n) *(uint32_t *) n #define ngx_htom16(n, m) *(uint16_t *) n = (uint16_t) ((m) & 0xffff) #define ngx_htom24(n, m) (n)[0] = (u_char) ((m) & 0xff); \ (n)[1] = (u_char) (((m) >> 8) & 0xff); \ (n)[2] = (u_char) (((m) >> 16) & 0xff) #define ngx_htom32(n, m) *(uint32_t *) (n) = (m) #else #define ngx_m16toh(n) (n[0] | n[1] << 8) #define ngx_m24toh(n) (n[0] | n[1] << 8 | n[2] << 16) #define ngx_m32toh(n) (n[0] | n[1] << 8 | n[2] << 16 | n[3] << 24) #define ngx_htom16(n, m) (n)[0] = (u_char) (m); (n)[1] = (u_char) ((m) >> 8) #define ngx_htom24(n, m) (n)[0] = (u_char) ((m) & 0xff); \ (n)[1] = (u_char) (((m) >> 8) & 0xff); \ (n)[2] = (u_char) (((m) >> 16) & 0xff) #define ngx_htom32(n, m) (n)[0] = (u_char) ((m) & 0xff); \ (n)[1] = (u_char) (((m) >> 8) & 0xff); \ (n)[2] = (u_char) (((m) >> 16) & 0xff); \ (n)[3] = (u_char) (((m) >> 24) & 0xff) #endif ngx_int_t ngx_mysql_connect(ngx_mysql_t *m); ngx_int_t ngx_mysql_query(ngx_mysql_t *m); #endif /* _NGX_MYSQL_H_INCLUDED_ */