annotate src/http/ngx_http_spdy.c @ 6058:7ba52c995325

SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
author Valentin Bartenev <vbart@nginx.com>
date Mon, 23 Mar 2015 20:47:46 +0300
parents 199c0dd313ea
children c81d79a7befd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2 /*
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
4 * Copyright (C) Valentin V. Bartenev
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
5 */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
6
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
7
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
10 #include <ngx_http.h>
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
11 #include <ngx_http_spdy_module.h>
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
12
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
13 #include <zlib.h>
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
14
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
15
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
16 #if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
17
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
18 #define ngx_str5cmp(m, c0, c1, c2, c3, c4) \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
19 *(uint32_t *) m == (c3 << 24 | c2 << 16 | c1 << 8 | c0) \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
20 && m[4] == c4
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
21
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
22 #else
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
23
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
24 #define ngx_str5cmp(m, c0, c1, c2, c3, c4) \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
25 m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3 && m[4] == c4
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
26
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
27 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
28
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
29
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
30 #if (NGX_HAVE_NONALIGNED)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
31
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
32 #define ngx_spdy_frame_parse_uint16(p) ntohs(*(uint16_t *) (p))
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
33 #define ngx_spdy_frame_parse_uint32(p) ntohl(*(uint32_t *) (p))
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
34
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
35 #else
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
36
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
37 #define ngx_spdy_frame_parse_uint16(p) ((p)[0] << 8 | (p)[1])
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
38 #define ngx_spdy_frame_parse_uint32(p) \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
39 ((p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3])
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
40
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
41 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
42
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
43 #define ngx_spdy_frame_parse_sid(p) \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
44 (ngx_spdy_frame_parse_uint32(p) & 0x7fffffff)
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
45 #define ngx_spdy_frame_parse_delta(p) \
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
46 (ngx_spdy_frame_parse_uint32(p) & 0x7fffffff)
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
47
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
48
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
49 #define ngx_spdy_ctl_frame_check(h) \
5643
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
50 (((h) & 0xffff0000) == ngx_spdy_ctl_frame_head(0))
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
51 #define ngx_spdy_data_frame_check(h) \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
52 (!((h) & (uint32_t) NGX_SPDY_CTL_BIT << 31))
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
53
5643
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
54 #define ngx_spdy_ctl_frame_type(h) ((h) & 0x0000ffff)
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
55 #define ngx_spdy_frame_flags(p) ((p) >> 24)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
56 #define ngx_spdy_frame_length(p) ((p) & 0x00ffffff)
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
57 #define ngx_spdy_frame_id(p) ((p) & 0x00ffffff)
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
58
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
59
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
60 #define NGX_SPDY_SKIP_HEADERS_BUFFER_SIZE 4096
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
61 #define NGX_SPDY_CTL_FRAME_BUFFER_SIZE 16
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
62
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
63 #define NGX_SPDY_PROTOCOL_ERROR 1
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
64 #define NGX_SPDY_INVALID_STREAM 2
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
65 #define NGX_SPDY_REFUSED_STREAM 3
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
66 #define NGX_SPDY_UNSUPPORTED_VERSION 4
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
67 #define NGX_SPDY_CANCEL 5
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
68 #define NGX_SPDY_INTERNAL_ERROR 6
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
69 #define NGX_SPDY_FLOW_CONTROL_ERROR 7
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
70 #define NGX_SPDY_STREAM_IN_USE 8
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
71 #define NGX_SPDY_STREAM_ALREADY_CLOSED 9
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
72 /* deprecated 10 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
73 #define NGX_SPDY_FRAME_TOO_LARGE 11
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
74
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
75 #define NGX_SPDY_SETTINGS_MAX_STREAMS 4
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
76 #define NGX_SPDY_SETTINGS_INIT_WINDOW 7
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
77
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
78 #define NGX_SPDY_SETTINGS_FLAG_PERSIST 0x01
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
79 #define NGX_SPDY_SETTINGS_FLAG_PERSISTED 0x02
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
80
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
81 #define NGX_SPDY_MAX_WINDOW NGX_MAX_INT32_VALUE
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
82 #define NGX_SPDY_CONNECTION_WINDOW 65536
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
83 #define NGX_SPDY_INIT_STREAM_WINDOW 65536
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
84 #define NGX_SPDY_STREAM_WINDOW NGX_SPDY_MAX_WINDOW
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
85
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
86 typedef struct {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
87 ngx_uint_t hash;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
88 u_char len;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
89 u_char header[7];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
90 ngx_int_t (*handler)(ngx_http_request_t *r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
91 } ngx_http_spdy_request_header_t;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
92
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
93
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
94 static void ngx_http_spdy_read_handler(ngx_event_t *rev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
95 static void ngx_http_spdy_write_handler(ngx_event_t *wev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
96 static void ngx_http_spdy_handle_connection(ngx_http_spdy_connection_t *sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
97
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
98 static u_char *ngx_http_spdy_proxy_protocol(ngx_http_spdy_connection_t *sc,
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
99 u_char *pos, u_char *end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
100 static u_char *ngx_http_spdy_state_head(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
101 u_char *pos, u_char *end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
102 static u_char *ngx_http_spdy_state_syn_stream(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
103 u_char *pos, u_char *end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
104 static u_char *ngx_http_spdy_state_headers(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
105 u_char *pos, u_char *end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
106 static u_char *ngx_http_spdy_state_headers_skip(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
107 u_char *pos, u_char *end);
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
108 static u_char *ngx_http_spdy_state_headers_error(ngx_http_spdy_connection_t *sc,
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
109 u_char *pos, u_char *end);
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
110 static u_char *ngx_http_spdy_state_window_update(ngx_http_spdy_connection_t *sc,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
111 u_char *pos, u_char *end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
112 static u_char *ngx_http_spdy_state_data(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
113 u_char *pos, u_char *end);
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
114 static u_char *ngx_http_spdy_state_read_data(ngx_http_spdy_connection_t *sc,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
115 u_char *pos, u_char *end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
116 static u_char *ngx_http_spdy_state_rst_stream(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
117 u_char *pos, u_char *end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
118 static u_char *ngx_http_spdy_state_ping(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
119 u_char *pos, u_char *end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
120 static u_char *ngx_http_spdy_state_skip(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
121 u_char *pos, u_char *end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
122 static u_char *ngx_http_spdy_state_settings(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
123 u_char *pos, u_char *end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
124 static u_char *ngx_http_spdy_state_complete(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
125 u_char *pos, u_char *end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
126 static u_char *ngx_http_spdy_state_save(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
127 u_char *pos, u_char *end, ngx_http_spdy_handler_pt handler);
5690
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
128
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
129 static u_char *ngx_http_spdy_state_inflate_error(
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
130 ngx_http_spdy_connection_t *sc, int rc);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
131 static u_char *ngx_http_spdy_state_protocol_error(
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
132 ngx_http_spdy_connection_t *sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
133 static u_char *ngx_http_spdy_state_internal_error(
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
134 ngx_http_spdy_connection_t *sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
135
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
136 static ngx_int_t ngx_http_spdy_send_window_update(
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
137 ngx_http_spdy_connection_t *sc, ngx_uint_t sid, ngx_uint_t delta);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
138 static ngx_int_t ngx_http_spdy_send_rst_stream(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
139 ngx_uint_t sid, ngx_uint_t status, ngx_uint_t priority);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
140 static ngx_int_t ngx_http_spdy_send_settings(ngx_http_spdy_connection_t *sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
141 static ngx_int_t ngx_http_spdy_settings_frame_handler(
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
142 ngx_http_spdy_connection_t *sc, ngx_http_spdy_out_frame_t *frame);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
143 static ngx_http_spdy_out_frame_t *ngx_http_spdy_get_ctl_frame(
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
144 ngx_http_spdy_connection_t *sc, size_t size, ngx_uint_t priority);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
145 static ngx_int_t ngx_http_spdy_ctl_frame_handler(
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
146 ngx_http_spdy_connection_t *sc, ngx_http_spdy_out_frame_t *frame);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
147
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
148 static ngx_http_spdy_stream_t *ngx_http_spdy_create_stream(
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
149 ngx_http_spdy_connection_t *sc, ngx_uint_t id, ngx_uint_t priority);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
150 static ngx_http_spdy_stream_t *ngx_http_spdy_get_stream_by_id(
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
151 ngx_http_spdy_connection_t *sc, ngx_uint_t sid);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
152 #define ngx_http_spdy_streams_index_size(sscf) (sscf->streams_index_mask + 1)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
153 #define ngx_http_spdy_stream_index(sscf, sid) \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
154 ((sid >> 1) & sscf->streams_index_mask)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
155
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
156 static ngx_int_t ngx_http_spdy_parse_header(ngx_http_request_t *r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
157 static ngx_int_t ngx_http_spdy_alloc_large_header_buffer(ngx_http_request_t *r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
158
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
159 static ngx_int_t ngx_http_spdy_handle_request_header(ngx_http_request_t *r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
160 static ngx_int_t ngx_http_spdy_parse_method(ngx_http_request_t *r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
161 static ngx_int_t ngx_http_spdy_parse_scheme(ngx_http_request_t *r);
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
162 static ngx_int_t ngx_http_spdy_parse_host(ngx_http_request_t *r);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
163 static ngx_int_t ngx_http_spdy_parse_path(ngx_http_request_t *r);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
164 static ngx_int_t ngx_http_spdy_parse_version(ngx_http_request_t *r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
165
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
166 static ngx_int_t ngx_http_spdy_construct_request_line(ngx_http_request_t *r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
167 static void ngx_http_spdy_run_request(ngx_http_request_t *r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
168 static ngx_int_t ngx_http_spdy_init_request_body(ngx_http_request_t *r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
169
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
170 static ngx_int_t ngx_http_spdy_terminate_stream(ngx_http_spdy_connection_t *sc,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
171 ngx_http_spdy_stream_t *stream, ngx_uint_t status);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
172
5403
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
173 static void ngx_http_spdy_close_stream_handler(ngx_event_t *ev);
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
174
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
175 static void ngx_http_spdy_handle_connection_handler(ngx_event_t *rev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
176 static void ngx_http_spdy_keepalive_handler(ngx_event_t *rev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
177 static void ngx_http_spdy_finalize_connection(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
178 ngx_int_t rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
179
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
180 static ngx_int_t ngx_http_spdy_adjust_windows(ngx_http_spdy_connection_t *sc,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
181 ssize_t delta);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
182
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
183 static void ngx_http_spdy_pool_cleanup(void *data);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
184
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
185 static void *ngx_http_spdy_zalloc(void *opaque, u_int items, u_int size);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
186 static void ngx_http_spdy_zfree(void *opaque, void *address);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
187
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
188
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
189 static const u_char ngx_http_spdy_dict[] = {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
190 0x00, 0x00, 0x00, 0x07, 0x6f, 0x70, 0x74, 0x69, /* - - - - o p t i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
191 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x04, 0x68, /* o n s - - - - h */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
192 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x04, 0x70, /* e a d - - - - p */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
193 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x70, /* o s t - - - - p */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
194 0x75, 0x74, 0x00, 0x00, 0x00, 0x06, 0x64, 0x65, /* u t - - - - d e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
195 0x6c, 0x65, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05, /* l e t e - - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
196 0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00, /* t r a c e - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
197 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x00, /* - a c c e p t - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
198 0x00, 0x00, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, /* - - - a c c e p */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
199 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, /* t - c h a r s e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
200 0x74, 0x00, 0x00, 0x00, 0x0f, 0x61, 0x63, 0x63, /* t - - - - a c c */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
201 0x65, 0x70, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f, /* e p t - e n c o */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
202 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x0f, /* d i n g - - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
203 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x6c, /* a c c e p t - l */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
204 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, /* a n g u a g e - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
205 0x00, 0x00, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70, /* - - - a c c e p */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
206 0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, /* t - r a n g e s */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
207 0x00, 0x00, 0x00, 0x03, 0x61, 0x67, 0x65, 0x00, /* - - - - a g e - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
208 0x00, 0x00, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77, /* - - - a l l o w */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
209 0x00, 0x00, 0x00, 0x0d, 0x61, 0x75, 0x74, 0x68, /* - - - - a u t h */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
210 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, /* o r i z a t i o */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
211 0x6e, 0x00, 0x00, 0x00, 0x0d, 0x63, 0x61, 0x63, /* n - - - - c a c */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
212 0x68, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, /* h e - c o n t r */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
213 0x6f, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f, /* o l - - - - c o */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
214 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, /* n n e c t i o n */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
215 0x00, 0x00, 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, /* - - - - c o n t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
216 0x65, 0x6e, 0x74, 0x2d, 0x62, 0x61, 0x73, 0x65, /* e n t - b a s e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
217 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, 0x6e, 0x74, /* - - - - c o n t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
218 0x65, 0x6e, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f, /* e n t - e n c o */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
219 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, /* d i n g - - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
220 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, /* c o n t e n t - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
221 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, /* l a n g u a g e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
222 0x00, 0x00, 0x00, 0x0e, 0x63, 0x6f, 0x6e, 0x74, /* - - - - c o n t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
223 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, /* e n t - l e n g */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
224 0x74, 0x68, 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, /* t h - - - - c o */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
225 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x6f, /* n t e n t - l o */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
226 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, /* c a t i o n - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
227 0x00, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, /* - - c o n t e n */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
228 0x74, 0x2d, 0x6d, 0x64, 0x35, 0x00, 0x00, 0x00, /* t - m d 5 - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
229 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, /* - c o n t e n t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
230 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, /* - r a n g e - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
231 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, /* - - c o n t e n */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
232 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x00, 0x00, /* t - t y p e - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
233 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x00, 0x00, /* - - d a t e - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
234 0x00, 0x04, 0x65, 0x74, 0x61, 0x67, 0x00, 0x00, /* - - e t a g - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
235 0x00, 0x06, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, /* - - e x p e c t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
236 0x00, 0x00, 0x00, 0x07, 0x65, 0x78, 0x70, 0x69, /* - - - - e x p i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
237 0x72, 0x65, 0x73, 0x00, 0x00, 0x00, 0x04, 0x66, /* r e s - - - - f */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
238 0x72, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x04, 0x68, /* r o m - - - - h */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
239 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x08, 0x69, /* o s t - - - - i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
240 0x66, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, /* f - m a t c h - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
241 0x00, 0x00, 0x11, 0x69, 0x66, 0x2d, 0x6d, 0x6f, /* - - - i f - m o */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
242 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, 0x73, /* d i f i e d - s */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
243 0x69, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x0d, /* i n c e - - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
244 0x69, 0x66, 0x2d, 0x6e, 0x6f, 0x6e, 0x65, 0x2d, /* i f - n o n e - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
245 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x00, 0x00, /* m a t c h - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
246 0x08, 0x69, 0x66, 0x2d, 0x72, 0x61, 0x6e, 0x67, /* - i f - r a n g */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
247 0x65, 0x00, 0x00, 0x00, 0x13, 0x69, 0x66, 0x2d, /* e - - - - i f - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
248 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, /* u n m o d i f i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
249 0x65, 0x64, 0x2d, 0x73, 0x69, 0x6e, 0x63, 0x65, /* e d - s i n c e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
250 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x61, 0x73, 0x74, /* - - - - l a s t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
251 0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, /* - m o d i f i e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
252 0x64, 0x00, 0x00, 0x00, 0x08, 0x6c, 0x6f, 0x63, /* d - - - - l o c */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
253 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, /* a t i o n - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
254 0x0c, 0x6d, 0x61, 0x78, 0x2d, 0x66, 0x6f, 0x72, /* - m a x - f o r */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
255 0x77, 0x61, 0x72, 0x64, 0x73, 0x00, 0x00, 0x00, /* w a r d s - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
256 0x06, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x00, /* - p r a g m a - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
257 0x00, 0x00, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, /* - - - p r o x y */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
258 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, /* - a u t h e n t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
259 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, /* i c a t e - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
260 0x13, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61, /* - p r o x y - a */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
261 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, /* u t h o r i z a */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
262 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x05, /* t i o n - - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
263 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, 0x00, /* r a n g e - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
264 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, /* - r e f e r e r */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
265 0x00, 0x00, 0x00, 0x0b, 0x72, 0x65, 0x74, 0x72, /* - - - - r e t r */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
266 0x79, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x00, /* y - a f t e r - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
267 0x00, 0x00, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, /* - - - s e r v e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
268 0x72, 0x00, 0x00, 0x00, 0x02, 0x74, 0x65, 0x00, /* r - - - - t e - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
269 0x00, 0x00, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, /* - - - t r a i l */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
270 0x65, 0x72, 0x00, 0x00, 0x00, 0x11, 0x74, 0x72, /* e r - - - - t r */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
271 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65, /* a n s f e r - e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
272 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00, /* n c o d i n g - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
273 0x00, 0x00, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, /* - - - u p g r a */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
274 0x64, 0x65, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x73, /* d e - - - - u s */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
275 0x65, 0x72, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, /* e r - a g e n t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
276 0x00, 0x00, 0x00, 0x04, 0x76, 0x61, 0x72, 0x79, /* - - - - v a r y */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
277 0x00, 0x00, 0x00, 0x03, 0x76, 0x69, 0x61, 0x00, /* - - - - v i a - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
278 0x00, 0x00, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, /* - - - w a r n i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
279 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, 0x77, 0x77, /* n g - - - - w w */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
280 0x77, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, /* w - a u t h e n */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
281 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, /* t i c a t e - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
282 0x00, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, /* - - m e t h o d */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
283 0x00, 0x00, 0x00, 0x03, 0x67, 0x65, 0x74, 0x00, /* - - - - g e t - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
284 0x00, 0x00, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, /* - - - s t a t u */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
285 0x73, 0x00, 0x00, 0x00, 0x06, 0x32, 0x30, 0x30, /* s - - - - 2 0 0 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
286 0x20, 0x4f, 0x4b, 0x00, 0x00, 0x00, 0x07, 0x76, /* - O K - - - - v */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
287 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x00, /* e r s i o n - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
288 0x00, 0x08, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, /* - - H T T P - 1 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
289 0x2e, 0x31, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72, /* - 1 - - - - u r */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
290 0x6c, 0x00, 0x00, 0x00, 0x06, 0x70, 0x75, 0x62, /* l - - - - p u b */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
291 0x6c, 0x69, 0x63, 0x00, 0x00, 0x00, 0x0a, 0x73, /* l i c - - - - s */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
292 0x65, 0x74, 0x2d, 0x63, 0x6f, 0x6f, 0x6b, 0x69, /* e t - c o o k i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
293 0x65, 0x00, 0x00, 0x00, 0x0a, 0x6b, 0x65, 0x65, /* e - - - - k e e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
294 0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x00, /* p - a l i v e - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
295 0x00, 0x00, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, /* - - - o r i g i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
296 0x6e, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x32, /* n 1 0 0 1 0 1 2 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
297 0x30, 0x31, 0x32, 0x30, 0x32, 0x32, 0x30, 0x35, /* 0 1 2 0 2 2 0 5 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
298 0x32, 0x30, 0x36, 0x33, 0x30, 0x30, 0x33, 0x30, /* 2 0 6 3 0 0 3 0 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
299 0x32, 0x33, 0x30, 0x33, 0x33, 0x30, 0x34, 0x33, /* 2 3 0 3 3 0 4 3 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
300 0x30, 0x35, 0x33, 0x30, 0x36, 0x33, 0x30, 0x37, /* 0 5 3 0 6 3 0 7 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
301 0x34, 0x30, 0x32, 0x34, 0x30, 0x35, 0x34, 0x30, /* 4 0 2 4 0 5 4 0 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
302 0x36, 0x34, 0x30, 0x37, 0x34, 0x30, 0x38, 0x34, /* 6 4 0 7 4 0 8 4 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
303 0x30, 0x39, 0x34, 0x31, 0x30, 0x34, 0x31, 0x31, /* 0 9 4 1 0 4 1 1 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
304 0x34, 0x31, 0x32, 0x34, 0x31, 0x33, 0x34, 0x31, /* 4 1 2 4 1 3 4 1 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
305 0x34, 0x34, 0x31, 0x35, 0x34, 0x31, 0x36, 0x34, /* 4 4 1 5 4 1 6 4 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
306 0x31, 0x37, 0x35, 0x30, 0x32, 0x35, 0x30, 0x34, /* 1 7 5 0 2 5 0 4 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
307 0x35, 0x30, 0x35, 0x32, 0x30, 0x33, 0x20, 0x4e, /* 5 0 5 2 0 3 - N */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
308 0x6f, 0x6e, 0x2d, 0x41, 0x75, 0x74, 0x68, 0x6f, /* o n - A u t h o */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
309 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, /* r i t a t i v e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
310 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, /* - I n f o r m a */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
311 0x74, 0x69, 0x6f, 0x6e, 0x32, 0x30, 0x34, 0x20, /* t i o n 2 0 4 - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
312 0x4e, 0x6f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65, /* N o - C o n t e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
313 0x6e, 0x74, 0x33, 0x30, 0x31, 0x20, 0x4d, 0x6f, /* n t 3 0 1 - M o */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
314 0x76, 0x65, 0x64, 0x20, 0x50, 0x65, 0x72, 0x6d, /* v e d - P e r m */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
315 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x34, /* a n e n t l y 4 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
316 0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52, /* 0 0 - B a d - R */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
317 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x34, 0x30, /* e q u e s t 4 0 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
318 0x31, 0x20, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68, /* 1 - U n a u t h */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
319 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x34, 0x30, /* o r i z e d 4 0 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
320 0x33, 0x20, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, /* 3 - F o r b i d */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
321 0x64, 0x65, 0x6e, 0x34, 0x30, 0x34, 0x20, 0x4e, /* d e n 4 0 4 - N */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
322 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, /* o t - F o u n d */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
323 0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x74, 0x65, /* 5 0 0 - I n t e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
324 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, /* r n a l - S e r */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
325 0x76, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6f, /* v e r - E r r o */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
326 0x72, 0x35, 0x30, 0x31, 0x20, 0x4e, 0x6f, 0x74, /* r 5 0 1 - N o t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
327 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, /* - I m p l e m e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
328 0x6e, 0x74, 0x65, 0x64, 0x35, 0x30, 0x33, 0x20, /* n t e d 5 0 3 - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
329 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, /* S e r v i c e - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
330 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, /* U n a v a i l a */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
331 0x62, 0x6c, 0x65, 0x4a, 0x61, 0x6e, 0x20, 0x46, /* b l e J a n - F */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
332 0x65, 0x62, 0x20, 0x4d, 0x61, 0x72, 0x20, 0x41, /* e b - M a r - A */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
333 0x70, 0x72, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x4a, /* p r - M a y - J */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
334 0x75, 0x6e, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x41, /* u n - J u l - A */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
335 0x75, 0x67, 0x20, 0x53, 0x65, 0x70, 0x74, 0x20, /* u g - S e p t - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
336 0x4f, 0x63, 0x74, 0x20, 0x4e, 0x6f, 0x76, 0x20, /* O c t - N o v - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
337 0x44, 0x65, 0x63, 0x20, 0x30, 0x30, 0x3a, 0x30, /* D e c - 0 0 - 0 */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
338 0x30, 0x3a, 0x30, 0x30, 0x20, 0x4d, 0x6f, 0x6e, /* 0 - 0 0 - M o n */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
339 0x2c, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x57, /* - - T u e - - W */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
340 0x65, 0x64, 0x2c, 0x20, 0x54, 0x68, 0x75, 0x2c, /* e d - - T h u - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
341 0x20, 0x46, 0x72, 0x69, 0x2c, 0x20, 0x53, 0x61, /* - F r i - - S a */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
342 0x74, 0x2c, 0x20, 0x53, 0x75, 0x6e, 0x2c, 0x20, /* t - - S u n - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
343 0x47, 0x4d, 0x54, 0x63, 0x68, 0x75, 0x6e, 0x6b, /* G M T c h u n k */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
344 0x65, 0x64, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, /* e d - t e x t - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
345 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x69, 0x6d, 0x61, /* h t m l - i m a */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
346 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x2c, 0x69, /* g e - p n g - i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
347 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x67, /* m a g e - j p g */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
348 0x2c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, /* - i m a g e - g */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
349 0x69, 0x66, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, /* i f - a p p l i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
350 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, /* c a t i o n - x */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
351 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, /* m l - a p p l i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
352 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, /* c a t i o n - x */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
353 0x68, 0x74, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, 0x6c, /* h t m l - x m l */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
354 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, /* - t e x t - p l */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
355 0x61, 0x69, 0x6e, 0x2c, 0x74, 0x65, 0x78, 0x74, /* a i n - t e x t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
356 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, /* - j a v a s c r */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
357 0x69, 0x70, 0x74, 0x2c, 0x70, 0x75, 0x62, 0x6c, /* i p t - p u b l */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
358 0x69, 0x63, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, /* i c p r i v a t */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
359 0x65, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65, /* e m a x - a g e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
360 0x3d, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x64, 0x65, /* - g z i p - d e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
361 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64, /* f l a t e - s d */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
362 0x63, 0x68, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, /* c h c h a r s e */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
363 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x63, /* t - u t f - 8 c */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
364 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x69, /* h a r s e t - i */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
365 0x73, 0x6f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d, /* s o - 8 8 5 9 - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
366 0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x2c, 0x2a, /* 1 - u t f - - - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
367 0x2c, 0x65, 0x6e, 0x71, 0x3d, 0x30, 0x2e /* - e n q - 0 - */
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
368 };
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
369
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
370
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
371 static ngx_http_spdy_request_header_t ngx_http_spdy_request_headers[] = {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
372 { 0, 6, "method", ngx_http_spdy_parse_method },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
373 { 0, 6, "scheme", ngx_http_spdy_parse_scheme },
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
374 { 0, 4, "host", ngx_http_spdy_parse_host },
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
375 { 0, 4, "path", ngx_http_spdy_parse_path },
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
376 { 0, 7, "version", ngx_http_spdy_parse_version },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
377 };
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
378
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
379 #define NGX_SPDY_REQUEST_HEADERS \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
380 (sizeof(ngx_http_spdy_request_headers) \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
381 / sizeof(ngx_http_spdy_request_header_t))
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
382
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
383
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
384 void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
385 ngx_http_spdy_init(ngx_event_t *rev)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
386 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
387 int rc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
388 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
389 ngx_pool_cleanup_t *cln;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
390 ngx_http_connection_t *hc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
391 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
392 ngx_http_spdy_main_conf_t *smcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
393 ngx_http_spdy_connection_t *sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
394
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
395 c = rev->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
396 hc = c->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
397
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
398 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "init spdy request");
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
399
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
400 c->log->action = "processing SPDY";
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
401
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
402 smcf = ngx_http_get_module_main_conf(hc->conf_ctx, ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
403
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
404 if (smcf->recv_buffer == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
405 smcf->recv_buffer = ngx_palloc(ngx_cycle->pool, smcf->recv_buffer_size);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
406 if (smcf->recv_buffer == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
407 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
408 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
409 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
410 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
411
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
412 sc = ngx_pcalloc(c->pool, sizeof(ngx_http_spdy_connection_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
413 if (sc == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
414 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
415 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
416 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
417
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
418 sc->connection = c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
419 sc->http_connection = hc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
420
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
421 sc->send_window = NGX_SPDY_CONNECTION_WINDOW;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
422 sc->recv_window = NGX_SPDY_CONNECTION_WINDOW;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
423
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
424 sc->init_window = NGX_SPDY_INIT_STREAM_WINDOW;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
425
5692
ed5fb7d22d46 SPDY: set log action for PROXY protocol only while parsing it.
Valentin Bartenev <vbart@nginx.com>
parents: 5691
diff changeset
426 sc->handler = hc->proxy_protocol ? ngx_http_spdy_proxy_protocol
ed5fb7d22d46 SPDY: set log action for PROXY protocol only while parsing it.
Valentin Bartenev <vbart@nginx.com>
parents: 5691
diff changeset
427 : ngx_http_spdy_state_head;
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
428
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
429 sc->zstream_in.zalloc = ngx_http_spdy_zalloc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
430 sc->zstream_in.zfree = ngx_http_spdy_zfree;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
431 sc->zstream_in.opaque = sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
432
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
433 rc = inflateInit(&sc->zstream_in);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
434 if (rc != Z_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
435 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
436 "inflateInit() failed: %d", rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
437 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
438 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
439 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
440
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
441 sc->zstream_out.zalloc = ngx_http_spdy_zalloc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
442 sc->zstream_out.zfree = ngx_http_spdy_zfree;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
443 sc->zstream_out.opaque = sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
444
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
445 sscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
446
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
447 rc = deflateInit2(&sc->zstream_out, (int) sscf->headers_comp,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
448 Z_DEFLATED, 11, 4, Z_DEFAULT_STRATEGY);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
449
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
450 if (rc != Z_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
451 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
452 "deflateInit2() failed: %d", rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
453 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
454 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
455 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
456
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
457 rc = deflateSetDictionary(&sc->zstream_out, ngx_http_spdy_dict,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
458 sizeof(ngx_http_spdy_dict));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
459 if (rc != Z_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
460 ngx_log_error(NGX_LOG_ALERT, c->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
461 "deflateSetDictionary() failed: %d", rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
462 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
463 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
464 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
465
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
466 sc->pool = ngx_create_pool(sscf->pool_size, sc->connection->log);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
467 if (sc->pool == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
468 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
469 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
470 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
471
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
472 cln = ngx_pool_cleanup_add(c->pool, sizeof(ngx_pool_cleanup_file_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
473 if (cln == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
474 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
475 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
476 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
477
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
478 cln->handler = ngx_http_spdy_pool_cleanup;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
479 cln->data = sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
480
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
481 sc->streams_index = ngx_pcalloc(sc->pool,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
482 ngx_http_spdy_streams_index_size(sscf)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
483 * sizeof(ngx_http_spdy_stream_t *));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
484 if (sc->streams_index == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
485 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
486 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
487 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
488
5526
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
489 if (ngx_http_spdy_send_settings(sc) == NGX_ERROR) {
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
490 ngx_http_close_connection(c);
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
491 return;
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
492 }
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
493
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
494 if (ngx_http_spdy_send_window_update(sc, 0, NGX_SPDY_MAX_WINDOW
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
495 - sc->recv_window)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
496 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
497 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
498 ngx_http_close_connection(c);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
499 return;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
500 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
501
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
502 sc->recv_window = NGX_SPDY_MAX_WINDOW;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
503
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
504 ngx_queue_init(&sc->waiting);
5530
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
505 ngx_queue_init(&sc->posted);
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
506
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
507 c->data = sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
508
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
509 rev->handler = ngx_http_spdy_read_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
510 c->write->handler = ngx_http_spdy_write_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
511
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
512 ngx_http_spdy_read_handler(rev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
513 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
514
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
515
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
516 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
517 ngx_http_spdy_read_handler(ngx_event_t *rev)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
518 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
519 u_char *p, *end;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
520 size_t available;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
521 ssize_t n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
522 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
523 ngx_http_spdy_main_conf_t *smcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
524 ngx_http_spdy_connection_t *sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
525
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
526 c = rev->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
527 sc = c->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
528
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
529 if (rev->timedout) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
530 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
531 ngx_http_spdy_finalize_connection(sc, NGX_HTTP_REQUEST_TIME_OUT);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
532 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
533 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
534
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
535 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "spdy read handler");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
536
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
537 sc->blocked = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
538
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
539 smcf = ngx_http_get_module_main_conf(sc->http_connection->conf_ctx,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
540 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
541
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
542 available = smcf->recv_buffer_size - 2 * NGX_SPDY_STATE_BUFFER_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
543
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
544 do {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
545 p = smcf->recv_buffer;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
546
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
547 ngx_memcpy(p, sc->buffer, NGX_SPDY_STATE_BUFFER_SIZE);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
548 end = p + sc->buffer_used;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
549
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
550 n = c->recv(c, end, available);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
551
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
552 if (n == NGX_AGAIN) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
553 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
554 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
555
5509
877a7bd72070 SPDY: better name for flag that indicates incomplete frame state.
Valentin Bartenev <vbart@nginx.com>
parents: 5508
diff changeset
556 if (n == 0 && (sc->incomplete || sc->processing)) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
557 ngx_log_error(NGX_LOG_INFO, c->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
558 "client prematurely closed connection");
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
559 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
560
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
561 if (n == 0 || n == NGX_ERROR) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
562 ngx_http_spdy_finalize_connection(sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
563 NGX_HTTP_CLIENT_CLOSED_REQUEST);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
564 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
565 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
566
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
567 end += n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
568
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
569 sc->buffer_used = 0;
5509
877a7bd72070 SPDY: better name for flag that indicates incomplete frame state.
Valentin Bartenev <vbart@nginx.com>
parents: 5508
diff changeset
570 sc->incomplete = 0;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
571
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
572 do {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
573 p = sc->handler(sc, p, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
574
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
575 if (p == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
576 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
577 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
578
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
579 } while (p != end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
580
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
581 } while (rev->ready);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
582
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
583 if (ngx_handle_read_event(rev, 0) != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
584 ngx_http_spdy_finalize_connection(sc, NGX_HTTP_INTERNAL_SERVER_ERROR);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
585 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
586 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
587
5520
a336cbc3dd44 SPDY: send output queue after processing of read event.
Valentin Bartenev <vbart@nginx.com>
parents: 5519
diff changeset
588 if (sc->last_out && ngx_http_spdy_send_output_queue(sc) == NGX_ERROR) {
a336cbc3dd44 SPDY: send output queue after processing of read event.
Valentin Bartenev <vbart@nginx.com>
parents: 5519
diff changeset
589 ngx_http_spdy_finalize_connection(sc, NGX_HTTP_CLIENT_CLOSED_REQUEST);
a336cbc3dd44 SPDY: send output queue after processing of read event.
Valentin Bartenev <vbart@nginx.com>
parents: 5519
diff changeset
590 return;
a336cbc3dd44 SPDY: send output queue after processing of read event.
Valentin Bartenev <vbart@nginx.com>
parents: 5519
diff changeset
591 }
a336cbc3dd44 SPDY: send output queue after processing of read event.
Valentin Bartenev <vbart@nginx.com>
parents: 5519
diff changeset
592
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
593 sc->blocked = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
594
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
595 if (sc->processing) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
596 if (rev->timer_set) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
597 ngx_del_timer(rev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
598 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
599 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
600 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
601
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
602 ngx_http_spdy_handle_connection(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
603 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
604
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
605
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
606 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
607 ngx_http_spdy_write_handler(ngx_event_t *wev)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
608 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
609 ngx_int_t rc;
5530
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
610 ngx_queue_t *q;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
611 ngx_connection_t *c;
5530
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
612 ngx_http_spdy_stream_t *stream;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
613 ngx_http_spdy_connection_t *sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
614
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
615 c = wev->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
616 sc = c->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
617
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
618 if (wev->timedout) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
619 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
620 "spdy write event timed out");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
621 ngx_http_spdy_finalize_connection(sc, NGX_HTTP_CLIENT_CLOSED_REQUEST);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
622 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
623 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
624
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
625 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "spdy write handler");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
626
5493
916cb6d28f6a SPDY: fixed possible request hang.
Valentin Bartenev <vbart@nginx.com>
parents: 5465
diff changeset
627 sc->blocked = 1;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
628
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
629 rc = ngx_http_spdy_send_output_queue(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
630
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
631 if (rc == NGX_ERROR) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
632 ngx_http_spdy_finalize_connection(sc, NGX_HTTP_CLIENT_CLOSED_REQUEST);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
633 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
634 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
635
5530
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
636 while (!ngx_queue_empty(&sc->posted)) {
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
637 q = ngx_queue_head(&sc->posted);
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
638
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
639 ngx_queue_remove(q);
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
640
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
641 stream = ngx_queue_data(q, ngx_http_spdy_stream_t, queue);
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
642
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
643 stream->handled = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
644
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
645 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
646 "run spdy stream %ui", stream->id);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
647
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
648 wev = stream->request->connection->write;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
649 wev->handler(wev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
650 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
651
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
652 sc->blocked = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
653
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
654 if (rc == NGX_AGAIN) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
655 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
656 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
657
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
658 ngx_http_spdy_handle_connection(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
659 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
660
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
661
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
662 ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
663 ngx_http_spdy_send_output_queue(ngx_http_spdy_connection_t *sc)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
664 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
665 ngx_chain_t *cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
666 ngx_event_t *wev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
667 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
668 ngx_http_core_loc_conf_t *clcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
669 ngx_http_spdy_out_frame_t *out, *frame, *fn;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
670
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
671 c = sc->connection;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
672
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
673 if (c->error) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
674 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
675 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
676
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
677 wev = c->write;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
678
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
679 if (!wev->ready) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
680 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
681 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
682
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
683 cl = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
684 out = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
685
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
686 for (frame = sc->last_out; frame; frame = fn) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
687 frame->last->next = cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
688 cl = frame->first;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
689
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
690 fn = frame->next;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
691 frame->next = out;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
692 out = frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
693
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
694 ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0,
5529
e4adaa47af65 SPDY: store the length of frame instead of its whole size.
Valentin Bartenev <vbart@nginx.com>
parents: 5528
diff changeset
695 "spdy frame out: %p sid:%ui prio:%ui bl:%d len:%uz",
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
696 out, out->stream ? out->stream->id : 0, out->priority,
5529
e4adaa47af65 SPDY: store the length of frame instead of its whole size.
Valentin Bartenev <vbart@nginx.com>
parents: 5528
diff changeset
697 out->blocked, out->length);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
698 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
699
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
700 cl = c->send_chain(c, cl, 0);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
701
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
702 if (cl == NGX_CHAIN_ERROR) {
6058
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
703 goto error;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
704 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
705
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
706 clcf = ngx_http_get_module_loc_conf(sc->http_connection->conf_ctx,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
707 ngx_http_core_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
708
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
709 if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {
6058
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
710 goto error;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
711 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
712
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
713 if (cl) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
714 ngx_add_timer(wev, clcf->send_timeout);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
715
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
716 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
717 if (wev->timer_set) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
718 ngx_del_timer(wev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
719 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
720 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
721
5528
d5de6c25b759 SPDY: use frame->next pointer to chain free frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5527
diff changeset
722 for ( /* void */ ; out; out = fn) {
d5de6c25b759 SPDY: use frame->next pointer to chain free frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5527
diff changeset
723 fn = out->next;
d5de6c25b759 SPDY: use frame->next pointer to chain free frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5527
diff changeset
724
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
725 if (out->handler(sc, out) != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
726 out->blocked = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
727 out->priority = NGX_SPDY_HIGHEST_PRIORITY;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
728 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
729 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
730
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
731 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0,
5529
e4adaa47af65 SPDY: store the length of frame instead of its whole size.
Valentin Bartenev <vbart@nginx.com>
parents: 5528
diff changeset
732 "spdy frame sent: %p sid:%ui bl:%d len:%uz",
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
733 out, out->stream ? out->stream->id : 0,
5529
e4adaa47af65 SPDY: store the length of frame instead of its whole size.
Valentin Bartenev <vbart@nginx.com>
parents: 5528
diff changeset
734 out->blocked, out->length);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
735 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
736
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
737 frame = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
738
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
739 for ( /* void */ ; out; out = fn) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
740 fn = out->next;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
741 out->next = frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
742 frame = out;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
743 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
744
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
745 sc->last_out = frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
746
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
747 return NGX_OK;
6058
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
748
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
749 error:
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
750
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
751 c->error = 1;
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
752
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
753 if (!sc->blocked) {
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
754 ngx_post_event(wev, &ngx_posted_events);
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
755 }
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
756
7ba52c995325 SPDY: fixed error handling in ngx_http_spdy_send_output_queue().
Valentin Bartenev <vbart@nginx.com>
parents: 6024
diff changeset
757 return NGX_ERROR;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
758 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
759
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
760
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
761 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
762 ngx_http_spdy_handle_connection(ngx_http_spdy_connection_t *sc)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
763 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
764 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
765 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
766
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
767 if (sc->last_out || sc->processing) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
768 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
769 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
770
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
771 c = sc->connection;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
772
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
773 if (c->error) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
774 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
775 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
776 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
777
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
778 if (c->buffered) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
779 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
780 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
781
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
782 sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
783 ngx_http_spdy_module);
5509
877a7bd72070 SPDY: better name for flag that indicates incomplete frame state.
Valentin Bartenev <vbart@nginx.com>
parents: 5508
diff changeset
784 if (sc->incomplete) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
785 ngx_add_timer(c->read, sscf->recv_timeout);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
786 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
787 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
788
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
789 if (ngx_terminate || ngx_exiting) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
790 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
791 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
792 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
793
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
794 ngx_destroy_pool(sc->pool);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
795
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
796 sc->pool = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
797 sc->free_ctl_frames = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
798 sc->free_fake_connections = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
799
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
800 #if (NGX_HTTP_SSL)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
801 if (c->ssl) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
802 ngx_ssl_free_buffer(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
803 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
804 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
805
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
806 c->destroyed = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
807 c->idle = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
808 ngx_reusable_connection(c, 1);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
809
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
810 c->write->handler = ngx_http_empty_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
811 c->read->handler = ngx_http_spdy_keepalive_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
812
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
813 if (c->write->timer_set) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
814 ngx_del_timer(c->write);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
815 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
816
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
817 ngx_add_timer(c->read, sscf->keepalive_timeout);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
818 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
819
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
820
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
821 static u_char *
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
822 ngx_http_spdy_proxy_protocol(ngx_http_spdy_connection_t *sc, u_char *pos,
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
823 u_char *end)
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
824 {
5692
ed5fb7d22d46 SPDY: set log action for PROXY protocol only while parsing it.
Valentin Bartenev <vbart@nginx.com>
parents: 5691
diff changeset
825 ngx_log_t *log;
ed5fb7d22d46 SPDY: set log action for PROXY protocol only while parsing it.
Valentin Bartenev <vbart@nginx.com>
parents: 5691
diff changeset
826
ed5fb7d22d46 SPDY: set log action for PROXY protocol only while parsing it.
Valentin Bartenev <vbart@nginx.com>
parents: 5691
diff changeset
827 log = sc->connection->log;
ed5fb7d22d46 SPDY: set log action for PROXY protocol only while parsing it.
Valentin Bartenev <vbart@nginx.com>
parents: 5691
diff changeset
828 log->action = "reading PROXY protocol";
ed5fb7d22d46 SPDY: set log action for PROXY protocol only while parsing it.
Valentin Bartenev <vbart@nginx.com>
parents: 5691
diff changeset
829
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
830 pos = ngx_proxy_protocol_parse(sc->connection, pos, end);
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
831
5692
ed5fb7d22d46 SPDY: set log action for PROXY protocol only while parsing it.
Valentin Bartenev <vbart@nginx.com>
parents: 5691
diff changeset
832 log->action = "processing SPDY";
ed5fb7d22d46 SPDY: set log action for PROXY protocol only while parsing it.
Valentin Bartenev <vbart@nginx.com>
parents: 5691
diff changeset
833
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
834 if (pos == NULL) {
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
835 return ngx_http_spdy_state_protocol_error(sc);
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
836 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
837
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
838 return ngx_http_spdy_state_complete(sc, pos, end);
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
839 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
840
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
841
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
842 static u_char *
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
843 ngx_http_spdy_state_head(ngx_http_spdy_connection_t *sc, u_char *pos,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
844 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
845 {
5643
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
846 uint32_t head, flen;
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
847 ngx_uint_t type;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
848
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
849 if (end - pos < NGX_SPDY_FRAME_HEADER_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
850 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
851 ngx_http_spdy_state_head);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
852 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
853
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
854 head = ngx_spdy_frame_parse_uint32(pos);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
855
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
856 pos += sizeof(uint32_t);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
857
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
858 flen = ngx_spdy_frame_parse_uint32(pos);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
859
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
860 sc->flags = ngx_spdy_frame_flags(flen);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
861 sc->length = ngx_spdy_frame_length(flen);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
862
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
863 pos += sizeof(uint32_t);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
864
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
865 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
866 "process spdy frame head:%08XD f:%Xd l:%uz",
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
867 head, sc->flags, sc->length);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
868
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
869 if (ngx_spdy_ctl_frame_check(head)) {
5643
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
870 type = ngx_spdy_ctl_frame_type(head);
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
871
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
872 switch (type) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
873
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
874 case NGX_SPDY_SYN_STREAM:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
875 return ngx_http_spdy_state_syn_stream(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
876
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
877 case NGX_SPDY_SYN_REPLY:
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
878 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
879 "client sent unexpected SYN_REPLY frame");
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
880 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
881
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
882 case NGX_SPDY_RST_STREAM:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
883 return ngx_http_spdy_state_rst_stream(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
884
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
885 case NGX_SPDY_SETTINGS:
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
886 return ngx_http_spdy_state_settings(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
887
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
888 case NGX_SPDY_PING:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
889 return ngx_http_spdy_state_ping(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
890
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
891 case NGX_SPDY_GOAWAY:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
892 return ngx_http_spdy_state_skip(sc, pos, end); /* TODO */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
893
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
894 case NGX_SPDY_HEADERS:
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
895 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
896 "client sent unexpected HEADERS frame");
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
897 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
898
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
899 case NGX_SPDY_WINDOW_UPDATE:
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
900 return ngx_http_spdy_state_window_update(sc, pos, end);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
901
5643
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
902 default:
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
903 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
904 "spdy control frame with unknown type %ui", type);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
905 return ngx_http_spdy_state_skip(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
906 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
907 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
908
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
909 if (ngx_spdy_data_frame_check(head)) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
910 sc->stream = ngx_http_spdy_get_stream_by_id(sc, head);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
911 return ngx_http_spdy_state_data(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
912 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
913
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
914 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
915 "client sent invalid frame");
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
916
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
917 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
918 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
919
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
920
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
921 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
922 ngx_http_spdy_state_syn_stream(ngx_http_spdy_connection_t *sc, u_char *pos,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
923 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
924 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
925 ngx_uint_t sid, prio;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
926 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
927 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
928
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
929 if (end - pos < NGX_SPDY_SYN_STREAM_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
930 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
931 ngx_http_spdy_state_syn_stream);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
932 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
933
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
934 if (sc->length <= NGX_SPDY_SYN_STREAM_SIZE) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
935 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
936 "client sent SYN_STREAM frame with incorrect length %uz",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
937 sc->length);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
938
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
939 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
940 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
941
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
942 sc->length -= NGX_SPDY_SYN_STREAM_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
943
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
944 sid = ngx_spdy_frame_parse_sid(pos);
5553
60c4179f76ad SPDY: fixed parsing of the priority field.
Shigeki Ohtsu <ohtsu@iij.ad.jp>
parents: 5549
diff changeset
945 prio = pos[8] >> 5;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
946
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
947 pos += NGX_SPDY_SYN_STREAM_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
948
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
949 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
950 "spdy SYN_STREAM frame sid:%ui prio:%ui", sid, prio);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
951
5664
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
952 if (sid % 2 == 0 || sid <= sc->last_sid) {
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
953 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
954 "client sent SYN_STREAM frame "
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
955 "with invalid Stream-ID %ui", sid);
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
956
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
957 stream = ngx_http_spdy_get_stream_by_id(sc, sid);
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
958
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
959 if (stream) {
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
960 if (ngx_http_spdy_terminate_stream(sc, stream,
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
961 NGX_SPDY_PROTOCOL_ERROR)
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
962 != NGX_OK)
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
963 {
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
964 return ngx_http_spdy_state_internal_error(sc);
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
965 }
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
966 }
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
967
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
968 return ngx_http_spdy_state_protocol_error(sc);
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
969 }
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
970
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
971 sc->last_sid = sid;
de93bbe2d8cd SPDY: Stream-ID restrictions according to specification.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
972
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
973 sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
974 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
975
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
976 if (sc->processing >= sscf->concurrent_streams) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
977
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
978 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
979 "concurrent streams exceeded %ui", sc->processing);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
980
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
981 if (ngx_http_spdy_send_rst_stream(sc, sid, NGX_SPDY_REFUSED_STREAM,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
982 prio)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
983 != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
984 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
985 return ngx_http_spdy_state_internal_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
986 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
987
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
988 return ngx_http_spdy_state_headers_skip(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
989 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
990
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
991 stream = ngx_http_spdy_create_stream(sc, sid, prio);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
992 if (stream == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
993 return ngx_http_spdy_state_internal_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
994 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
995
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
996 stream->in_closed = (sc->flags & NGX_SPDY_FLAG_FIN) ? 1 : 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
997
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
998 stream->request->request_length = NGX_SPDY_FRAME_HEADER_SIZE
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
999 + NGX_SPDY_SYN_STREAM_SIZE
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1000 + sc->length;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1001
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1002 sc->stream = stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1003
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1004 return ngx_http_spdy_state_headers(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1005 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1006
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1007
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1008 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1009 ngx_http_spdy_state_headers(ngx_http_spdy_connection_t *sc, u_char *pos,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1010 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1011 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1012 int z;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1013 size_t size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1014 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1015 ngx_int_t rc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1016 ngx_http_request_t *r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1017
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1018 size = end - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1019
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1020 if (size == 0) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1021 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1022 ngx_http_spdy_state_headers);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1023 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1024
5694
9a95eb9f448b SPDY: refactored ngx_http_spdy_state_headers().
Valentin Bartenev <vbart@nginx.com>
parents: 5693
diff changeset
1025 if (size > sc->length) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1026 size = sc->length;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1027 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1028
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1029 r = sc->stream->request;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1030
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1031 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1032 "process spdy header block %uz of %uz", size, sc->length);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1033
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1034 buf = r->header_in;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1035
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1036 sc->zstream_in.next_in = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1037 sc->zstream_in.avail_in = size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1038 sc->zstream_in.next_out = buf->last;
5323
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1039
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1040 /* one byte is reserved for null-termination of the last header value */
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1041 sc->zstream_in.avail_out = buf->end - buf->last - 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1042
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1043 z = inflate(&sc->zstream_in, Z_NO_FLUSH);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1044
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1045 if (z == Z_NEED_DICT) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1046 z = inflateSetDictionary(&sc->zstream_in, ngx_http_spdy_dict,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1047 sizeof(ngx_http_spdy_dict));
5690
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1048
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1049 if (z != Z_OK) {
5690
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1050 if (z == Z_DATA_ERROR) {
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1051 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1052 "client sent SYN_STREAM frame with header "
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1053 "block encoded using wrong dictionary: %ul",
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1054 (u_long) sc->zstream_in.adler);
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1055
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1056 return ngx_http_spdy_state_protocol_error(sc);
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1057 }
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1058
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1059 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1060 "inflateSetDictionary() failed: %d", z);
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1061
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1062 return ngx_http_spdy_state_internal_error(sc);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1063 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1064
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1065 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1066 "spdy inflateSetDictionary(): %d", z);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1067
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1068 z = sc->zstream_in.avail_in ? inflate(&sc->zstream_in, Z_NO_FLUSH)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1069 : Z_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1070 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1071
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1072 ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1073 "spdy inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1074 sc->zstream_in.next_in, sc->zstream_in.next_out,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1075 sc->zstream_in.avail_in, sc->zstream_in.avail_out,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1076 z);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1077
5903
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1078 if (z != Z_OK) {
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1079 return ngx_http_spdy_state_inflate_error(sc, z);
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1080 }
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1081
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1082 sc->length -= sc->zstream_in.next_in - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1083 pos = sc->zstream_in.next_in;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1084
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1085 buf->last = sc->zstream_in.next_out;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1086
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1087 if (r->headers_in.headers.part.elts == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1088
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1089 if (buf->last - buf->pos < NGX_SPDY_NV_NUM_SIZE) {
5625
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1090
5694
9a95eb9f448b SPDY: refactored ngx_http_spdy_state_headers().
Valentin Bartenev <vbart@nginx.com>
parents: 5693
diff changeset
1091 if (sc->length == 0) {
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1092 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1093 "premature end of spdy header block");
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1094
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1095 return ngx_http_spdy_state_headers_error(sc, pos, end);
5625
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1096 }
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1097
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1098 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1099 ngx_http_spdy_state_headers);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1100 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1101
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1102 sc->entries = ngx_spdy_frame_parse_uint32(buf->pos);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1103
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1104 buf->pos += NGX_SPDY_NV_NUM_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1105
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1106 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1107 "spdy header block has %ui entries",
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1108 sc->entries);
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1109
5589
a9116d9b63f9 SPDY: constant number of preallocated structures for headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5574
diff changeset
1110 if (ngx_list_init(&r->headers_in.headers, r->pool, 20,
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1111 sizeof(ngx_table_elt_t))
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1112 != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1113 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1114 ngx_http_spdy_close_stream(sc->stream,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1115 NGX_HTTP_INTERNAL_SERVER_ERROR);
5689
5d55f03b1e12 SPDY: removed ngx_http_spdy_state_headers_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5688
diff changeset
1116 return ngx_http_spdy_state_headers_skip(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1117 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1118
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1119 if (ngx_array_init(&r->headers_in.cookies, r->pool, 2,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1120 sizeof(ngx_table_elt_t *))
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1121 != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1122 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1123 ngx_http_spdy_close_stream(sc->stream,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1124 NGX_HTTP_INTERNAL_SERVER_ERROR);
5689
5d55f03b1e12 SPDY: removed ngx_http_spdy_state_headers_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5688
diff changeset
1125 return ngx_http_spdy_state_headers_skip(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1126 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1127 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1128
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1129 while (sc->entries) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1130
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1131 rc = ngx_http_spdy_parse_header(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1132
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1133 switch (rc) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1134
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1135 case NGX_DONE:
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1136 sc->entries--;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1137
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1138 case NGX_OK:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1139 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1140
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1141 case NGX_AGAIN:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1142
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1143 if (sc->zstream_in.avail_in) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1144
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1145 rc = ngx_http_spdy_alloc_large_header_buffer(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1146
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1147 if (rc == NGX_DECLINED) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1148 ngx_http_finalize_request(r,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1149 NGX_HTTP_REQUEST_HEADER_TOO_LARGE);
5689
5d55f03b1e12 SPDY: removed ngx_http_spdy_state_headers_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5688
diff changeset
1150 return ngx_http_spdy_state_headers_skip(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1151 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1152
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1153 if (rc != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1154 ngx_http_spdy_close_stream(sc->stream,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1155 NGX_HTTP_INTERNAL_SERVER_ERROR);
5689
5d55f03b1e12 SPDY: removed ngx_http_spdy_state_headers_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5688
diff changeset
1156 return ngx_http_spdy_state_headers_skip(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1157 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1158
5323
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1159 /* null-terminate the last processed header name or value */
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1160 *buf->pos = '\0';
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1161
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1162 buf = r->header_in;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1163
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1164 sc->zstream_in.next_out = buf->last;
5323
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1165
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1166 /* one byte is reserved for null-termination */
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1167 sc->zstream_in.avail_out = buf->end - buf->last - 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1168
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1169 z = inflate(&sc->zstream_in, Z_NO_FLUSH);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1170
5903
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1171 ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1172 "spdy inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1173 sc->zstream_in.next_in, sc->zstream_in.next_out,
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1174 sc->zstream_in.avail_in, sc->zstream_in.avail_out,
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1175 z);
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1176
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1177 if (z != Z_OK) {
5690
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1178 return ngx_http_spdy_state_inflate_error(sc, z);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1179 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1180
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1181 sc->length -= sc->zstream_in.next_in - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1182 pos = sc->zstream_in.next_in;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1183
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1184 buf->last = sc->zstream_in.next_out;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1185
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1186 continue;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1187 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1188
5694
9a95eb9f448b SPDY: refactored ngx_http_spdy_state_headers().
Valentin Bartenev <vbart@nginx.com>
parents: 5693
diff changeset
1189 if (sc->length == 0) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1190 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1191 "premature end of spdy header block");
5687
6642690698f1 SPDY: improved ngx_http_spdy_state_protocol_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5686
diff changeset
1192
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1193 return ngx_http_spdy_state_headers_error(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1194 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1195
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1196 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1197 ngx_http_spdy_state_headers);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1198
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1199 case NGX_HTTP_PARSE_INVALID_HEADER:
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1200 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
5689
5d55f03b1e12 SPDY: removed ngx_http_spdy_state_headers_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5688
diff changeset
1201 return ngx_http_spdy_state_headers_skip(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1202
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1203 default: /* NGX_ERROR */
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1204 return ngx_http_spdy_state_headers_error(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1205 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1206
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1207 /* a header line has been parsed successfully */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1208
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1209 rc = ngx_http_spdy_handle_request_header(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1210
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1211 if (rc != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1212 if (rc == NGX_HTTP_PARSE_INVALID_HEADER) {
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1213 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1214 return ngx_http_spdy_state_headers_skip(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1215 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1216
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1217 if (rc != NGX_ABORT) {
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1218 ngx_http_spdy_close_stream(sc->stream,
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1219 NGX_HTTP_INTERNAL_SERVER_ERROR);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1220 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1221
5689
5d55f03b1e12 SPDY: removed ngx_http_spdy_state_headers_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5688
diff changeset
1222 return ngx_http_spdy_state_headers_skip(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1223 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1224 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1225
5626
2411d4b5be2c SPDY: better detect if headers block has wrong entries count.
Valentin Bartenev <vbart@nginx.com>
parents: 5625
diff changeset
1226 if (buf->pos != buf->last || sc->zstream_in.avail_in) {
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1227 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1228 "incorrect number of spdy header block entries");
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1229
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1230 return ngx_http_spdy_state_headers_error(sc, pos, end);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1231 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1232
5694
9a95eb9f448b SPDY: refactored ngx_http_spdy_state_headers().
Valentin Bartenev <vbart@nginx.com>
parents: 5693
diff changeset
1233 if (sc->length) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1234 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1235 ngx_http_spdy_state_headers);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1236 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1237
5323
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1238 /* null-terminate the last header value */
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1239 *buf->pos = '\0';
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1240
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1241 ngx_http_spdy_run_request(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1242
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1243 return ngx_http_spdy_state_complete(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1244 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1245
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1246
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1247 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1248 ngx_http_spdy_state_headers_skip(ngx_http_spdy_connection_t *sc, u_char *pos,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1249 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1250 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1251 int n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1252 size_t size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1253 u_char buffer[NGX_SPDY_SKIP_HEADERS_BUFFER_SIZE];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1254
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1255 if (sc->length == 0) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1256 return ngx_http_spdy_state_complete(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1257 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1258
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1259 size = end - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1260
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1261 if (size == 0) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1262 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1263 ngx_http_spdy_state_headers_skip);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1264 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1265
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1266 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1267 "spdy header block skip %uz of %uz", size, sc->length);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1268
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1269 sc->zstream_in.next_in = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1270 sc->zstream_in.avail_in = (size < sc->length) ? size : sc->length;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1271
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1272 while (sc->zstream_in.avail_in) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1273 sc->zstream_in.next_out = buffer;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1274 sc->zstream_in.avail_out = NGX_SPDY_SKIP_HEADERS_BUFFER_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1275
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1276 n = inflate(&sc->zstream_in, Z_NO_FLUSH);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1277
5903
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1278 ngx_log_debug5(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1279 "spdy inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1280 sc->zstream_in.next_in, sc->zstream_in.next_out,
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1281 sc->zstream_in.avail_in, sc->zstream_in.avail_out,
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1282 n);
571e66f7c12c SPDY: improved debug logging of inflate() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 5899
diff changeset
1283
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1284 if (n != Z_OK) {
5690
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1285 return ngx_http_spdy_state_inflate_error(sc, n);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1286 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1287 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1288
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1289 pos = sc->zstream_in.next_in;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1290
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1291 if (size < sc->length) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1292 sc->length -= size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1293 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1294 ngx_http_spdy_state_headers_skip);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1295 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1296
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1297 return ngx_http_spdy_state_complete(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1298 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1299
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1300
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1301 static u_char *
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1302 ngx_http_spdy_state_headers_error(ngx_http_spdy_connection_t *sc, u_char *pos,
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1303 u_char *end)
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1304 {
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1305 ngx_http_spdy_stream_t *stream;
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1306
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1307 stream = sc->stream;
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1308
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1309 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1310 "client sent SYN_STREAM frame for stream %ui "
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1311 "with invalid header block", stream->id);
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1312
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1313 if (ngx_http_spdy_send_rst_stream(sc, stream->id, NGX_SPDY_PROTOCOL_ERROR,
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1314 stream->priority)
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1315 != NGX_OK)
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1316 {
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1317 return ngx_http_spdy_state_internal_error(sc);
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1318 }
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1319
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1320 stream->out_closed = 1;
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1321
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1322 ngx_http_spdy_close_stream(stream, NGX_HTTP_BAD_REQUEST);
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1323
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1324 return ngx_http_spdy_state_headers_skip(sc, pos, end);
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1325 }
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1326
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1327
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
1328 static u_char *
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1329 ngx_http_spdy_state_window_update(ngx_http_spdy_connection_t *sc, u_char *pos,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1330 u_char *end)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1331 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1332 size_t delta;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1333 ngx_uint_t sid;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1334 ngx_event_t *wev;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1335 ngx_queue_t *q;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1336 ngx_http_spdy_stream_t *stream;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1337
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1338 if (end - pos < NGX_SPDY_WINDOW_UPDATE_SIZE) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1339 return ngx_http_spdy_state_save(sc, pos, end,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1340 ngx_http_spdy_state_window_update);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1341 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1342
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1343 if (sc->length != NGX_SPDY_WINDOW_UPDATE_SIZE) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1344 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1345 "client sent WINDOW_UPDATE frame "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1346 "with incorrect length %uz", sc->length);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1347
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1348 return ngx_http_spdy_state_protocol_error(sc);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1349 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1350
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1351 sid = ngx_spdy_frame_parse_sid(pos);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1352
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1353 pos += NGX_SPDY_SID_SIZE;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1354
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1355 delta = ngx_spdy_frame_parse_delta(pos);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1356
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1357 pos += NGX_SPDY_DELTA_SIZE;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1358
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1359 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
6024
199c0dd313ea SPDY: fixed format specifier in logging.
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5923
diff changeset
1360 "spdy WINDOW_UPDATE sid:%ui delta:%uz", sid, delta);
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1361
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1362 if (sid) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1363 stream = ngx_http_spdy_get_stream_by_id(sc, sid);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1364
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1365 if (stream == NULL) {
5665
46d0795a846c SPDY: avoid sending RST_STREAM on WINDOW_UPDATE with unknown SID.
Valentin Bartenev <vbart@nginx.com>
parents: 5664
diff changeset
1366 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
46d0795a846c SPDY: avoid sending RST_STREAM on WINDOW_UPDATE with unknown SID.
Valentin Bartenev <vbart@nginx.com>
parents: 5664
diff changeset
1367 "unknown spdy stream");
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1368
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1369 return ngx_http_spdy_state_complete(sc, pos, end);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1370 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1371
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1372 if (stream->send_window > (ssize_t) (NGX_SPDY_MAX_WINDOW - delta)) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1373
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1374 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1375 "client violated flow control for stream %ui: "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1376 "received WINDOW_UPDATE frame with delta %uz "
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1377 "not allowed for window %z",
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1378 sid, delta, stream->send_window);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1379
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1380 if (ngx_http_spdy_terminate_stream(sc, stream,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1381 NGX_SPDY_FLOW_CONTROL_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1382 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1383 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1384 return ngx_http_spdy_state_internal_error(sc);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1385 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1386
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1387 return ngx_http_spdy_state_complete(sc, pos, end);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1388 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1389
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1390 stream->send_window += delta;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1391
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1392 if (stream->exhausted) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1393 stream->exhausted = 0;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1394
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1395 wev = stream->request->connection->write;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1396
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1397 if (!wev->timer_set) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1398 wev->delayed = 0;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1399 wev->handler(wev);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1400 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1401 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1402
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1403 } else {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1404 sc->send_window += delta;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1405
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1406 if (sc->send_window > NGX_SPDY_MAX_WINDOW) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1407 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1408 "client violated connection flow control: "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1409 "received WINDOW_UPDATE frame with delta %uz "
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1410 "not allowed for window %uz",
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1411 delta, sc->send_window);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1412
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1413 return ngx_http_spdy_state_protocol_error(sc);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1414 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1415
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1416 while (!ngx_queue_empty(&sc->waiting)) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1417 q = ngx_queue_head(&sc->waiting);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1418
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1419 ngx_queue_remove(q);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1420
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1421 stream = ngx_queue_data(q, ngx_http_spdy_stream_t, queue);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1422
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1423 stream->handled = 0;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1424
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1425 wev = stream->request->connection->write;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1426
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1427 if (!wev->timer_set) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1428 wev->delayed = 0;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1429 wev->handler(wev);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1430
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1431 if (sc->send_window == 0) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1432 break;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1433 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1434 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1435 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1436 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1437
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1438 return ngx_http_spdy_state_complete(sc, pos, end);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1439 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1440
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1441
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1442 static u_char *
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1443 ngx_http_spdy_state_data(ngx_http_spdy_connection_t *sc, u_char *pos,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1444 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1445 {
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1446 ngx_http_spdy_stream_t *stream;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1447
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1448 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1449 "spdy DATA frame");
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1450
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1451 if (sc->length > sc->recv_window) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1452 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1453 "client violated connection flow control: "
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1454 "received DATA frame length %uz, available window %uz",
5649
e1dcb983d6b3 SPDY: fixed arguments supplied for an error message.
Valentin Bartenev <vbart@nginx.com>
parents: 5643
diff changeset
1455 sc->length, sc->recv_window);
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1456
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1457 return ngx_http_spdy_state_protocol_error(sc);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1458 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1459
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1460 sc->recv_window -= sc->length;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1461
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1462 if (sc->recv_window < NGX_SPDY_MAX_WINDOW / 4) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1463
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1464 if (ngx_http_spdy_send_window_update(sc, 0,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1465 NGX_SPDY_MAX_WINDOW
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1466 - sc->recv_window)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1467 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1468 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1469 return ngx_http_spdy_state_internal_error(sc);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1470 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1471
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1472 sc->recv_window = NGX_SPDY_MAX_WINDOW;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1473 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1474
5650
363395795384 SPDY: moved a variable initialization near to its check.
Valentin Bartenev <vbart@nginx.com>
parents: 5649
diff changeset
1475 stream = sc->stream;
363395795384 SPDY: moved a variable initialization near to its check.
Valentin Bartenev <vbart@nginx.com>
parents: 5649
diff changeset
1476
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1477 if (stream == NULL) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1478 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1479 "unknown spdy stream");
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1480
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1481 return ngx_http_spdy_state_skip(sc, pos, end);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1482 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1483
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1484 if (sc->length > stream->recv_window) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1485 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1486 "client violated flow control for stream %ui: "
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1487 "received DATA frame length %uz, available window %uz",
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1488 stream->id, sc->length, stream->recv_window);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1489
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1490 if (ngx_http_spdy_terminate_stream(sc, stream,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1491 NGX_SPDY_FLOW_CONTROL_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1492 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1493 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1494 return ngx_http_spdy_state_internal_error(sc);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1495 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1496
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1497 return ngx_http_spdy_state_skip(sc, pos, end);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1498 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1499
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1500 stream->recv_window -= sc->length;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1501
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1502 if (stream->recv_window < NGX_SPDY_STREAM_WINDOW / 4) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1503
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1504 if (ngx_http_spdy_send_window_update(sc, stream->id,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1505 NGX_SPDY_STREAM_WINDOW
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1506 - stream->recv_window)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1507 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1508 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1509 return ngx_http_spdy_state_internal_error(sc);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1510 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1511
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1512 stream->recv_window = NGX_SPDY_STREAM_WINDOW;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1513 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1514
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1515 if (stream->in_closed) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1516 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1517 "client sent DATA frame for half-closed stream %ui",
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1518 stream->id);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1519
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1520 if (ngx_http_spdy_terminate_stream(sc, stream,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1521 NGX_SPDY_STREAM_ALREADY_CLOSED)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1522 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1523 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1524 return ngx_http_spdy_state_internal_error(sc);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1525 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1526
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1527 return ngx_http_spdy_state_skip(sc, pos, end);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1528 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1529
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1530 return ngx_http_spdy_state_read_data(sc, pos, end);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1531 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1532
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1533
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1534 static u_char *
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1535 ngx_http_spdy_state_read_data(ngx_http_spdy_connection_t *sc, u_char *pos,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1536 u_char *end)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1537 {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1538 size_t size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1539 ssize_t n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1540 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1541 ngx_int_t rc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1542 ngx_temp_file_t *tf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1543 ngx_http_request_t *r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1544 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1545 ngx_http_request_body_t *rb;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1546 ngx_http_core_loc_conf_t *clcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1547
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1548 stream = sc->stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1549
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1550 if (stream == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1551 return ngx_http_spdy_state_skip(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1552 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1553
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1554 if (stream->skip_data) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1555
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1556 if (sc->flags & NGX_SPDY_FLAG_FIN) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1557 stream->in_closed = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1558 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1559
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1560 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1561 "skipping spdy DATA frame, reason: %d",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1562 stream->skip_data);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1563
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1564 return ngx_http_spdy_state_skip(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1565 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1566
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1567 size = end - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1568
5642
d2ac5cf4056d SPDY: refactored ngx_http_spdy_state_read_data().
Valentin Bartenev <vbart@nginx.com>
parents: 5641
diff changeset
1569 if (size > sc->length) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1570 size = sc->length;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1571 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1572
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1573 r = stream->request;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1574
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1575 if (r->request_body == NULL
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1576 && ngx_http_spdy_init_request_body(r) != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1577 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1578 stream->skip_data = NGX_SPDY_DATA_INTERNAL_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1579 return ngx_http_spdy_state_skip(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1580 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1581
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1582 rb = r->request_body;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1583 tf = rb->temp_file;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1584 buf = rb->buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1585
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1586 if (size) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1587 rb->rest += size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1588
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1589 if (r->headers_in.content_length_n != -1
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1590 && r->headers_in.content_length_n < rb->rest)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1591 {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1592 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1593 "client intended to send body data "
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1594 "larger than declared");
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1595
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1596 stream->skip_data = NGX_SPDY_DATA_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1597 goto error;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1598
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1599 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1600 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1601
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1602 if (clcf->client_max_body_size
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1603 && clcf->client_max_body_size < rb->rest)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1604 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1605 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1606 "client intended to send "
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1607 "too large chunked body: %O bytes", rb->rest);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1608
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1609 stream->skip_data = NGX_SPDY_DATA_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1610 goto error;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1611 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1612 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1613
5627
d74889fbf06d SPDY: fixed the DATA frame length handling in case of some errors.
Valentin Bartenev <vbart@nginx.com>
parents: 5626
diff changeset
1614 sc->length -= size;
d74889fbf06d SPDY: fixed the DATA frame length handling in case of some errors.
Valentin Bartenev <vbart@nginx.com>
parents: 5626
diff changeset
1615
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1616 if (tf) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1617 buf->start = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1618 buf->pos = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1619
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1620 pos += size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1621
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1622 buf->end = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1623 buf->last = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1624
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1625 n = ngx_write_chain_to_temp_file(tf, rb->bufs);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1626
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1627 /* TODO: n == 0 or not complete and level event */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1628
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1629 if (n == NGX_ERROR) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1630 stream->skip_data = NGX_SPDY_DATA_INTERNAL_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1631 goto error;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1632 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1633
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1634 tf->offset += n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1635
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1636 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1637 buf->last = ngx_cpymem(buf->last, pos, size);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1638 pos += size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1639 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1640
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1641 r->request_length += size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1642 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1643
5642
d2ac5cf4056d SPDY: refactored ngx_http_spdy_state_read_data().
Valentin Bartenev <vbart@nginx.com>
parents: 5641
diff changeset
1644 if (sc->length) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1645 return ngx_http_spdy_state_save(sc, pos, end,
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1646 ngx_http_spdy_state_read_data);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1647 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1648
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1649 if (sc->flags & NGX_SPDY_FLAG_FIN) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1650
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1651 stream->in_closed = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1652
5628
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1653 if (r->headers_in.content_length_n < 0) {
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1654 r->headers_in.content_length_n = rb->rest;
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1655
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1656 } else if (r->headers_in.content_length_n != rb->rest) {
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1657 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1658 "client prematurely closed stream: "
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1659 "only %O out of %O bytes of request body received",
5628
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1660 rb->rest, r->headers_in.content_length_n);
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1661
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1662 stream->skip_data = NGX_SPDY_DATA_ERROR;
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1663 goto error;
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1664 }
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1665
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1666 if (tf) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1667 ngx_memzero(buf, sizeof(ngx_buf_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1668
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1669 buf->in_file = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1670 buf->file_last = tf->file.offset;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1671 buf->file = &tf->file;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1672
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1673 rb->buf = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1674 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1675
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1676 if (rb->post_handler) {
5402
4d0c70541784 SPDY: fixed connection leak while waiting for request body.
Valentin Bartenev <vbart@nginx.com>
parents: 5325
diff changeset
1677 r->read_event_handler = ngx_http_block_reading;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1678 rb->post_handler(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1679 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1680 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1681
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1682 return ngx_http_spdy_state_complete(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1683
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1684 error:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1685
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1686 if (rb->post_handler) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1687
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1688 if (stream->skip_data == NGX_SPDY_DATA_ERROR) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1689 rc = (r->headers_in.content_length_n == -1)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1690 ? NGX_HTTP_REQUEST_ENTITY_TOO_LARGE
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1691 : NGX_HTTP_BAD_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1692
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1693 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1694 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1695 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1696
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1697 ngx_http_finalize_request(r, rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1698 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1699
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1700 return ngx_http_spdy_state_skip(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1701 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1702
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1703
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1704 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1705 ngx_http_spdy_state_rst_stream(ngx_http_spdy_connection_t *sc, u_char *pos,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1706 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1707 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1708 ngx_uint_t sid, status;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1709 ngx_event_t *ev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1710 ngx_connection_t *fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1711 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1712
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1713 if (end - pos < NGX_SPDY_RST_STREAM_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1714 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1715 ngx_http_spdy_state_rst_stream);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1716 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1717
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1718 if (sc->length != NGX_SPDY_RST_STREAM_SIZE) {
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1719 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1720 "client sent RST_STREAM frame with incorrect length %uz",
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1721 sc->length);
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1722
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1723 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1724 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1725
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1726 sid = ngx_spdy_frame_parse_sid(pos);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1727
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1728 pos += NGX_SPDY_SID_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1729
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1730 status = ngx_spdy_frame_parse_uint32(pos);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1731
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1732 pos += sizeof(uint32_t);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1733
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1734 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1735 "spdy RST_STREAM sid:%ui st:%ui", sid, status);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1736
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1737 stream = ngx_http_spdy_get_stream_by_id(sc, sid);
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1738
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1739 if (stream == NULL) {
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1740 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1741 "unknown spdy stream");
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1742
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1743 return ngx_http_spdy_state_complete(sc, pos, end);
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1744 }
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1745
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1746 stream->in_closed = 1;
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1747 stream->out_closed = 1;
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1748
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1749 fc = stream->request->connection;
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1750 fc->error = 1;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1751
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1752 switch (status) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1753
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1754 case NGX_SPDY_CANCEL:
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1755 ngx_log_error(NGX_LOG_INFO, fc->log, 0,
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1756 "client canceled stream %ui", sid);
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1757 break;
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1758
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1759 case NGX_SPDY_INTERNAL_ERROR:
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1760 ngx_log_error(NGX_LOG_INFO, fc->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1761 "client terminated stream %ui due to internal error",
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1762 sid);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1763 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1764
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1765 default:
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1766 ngx_log_error(NGX_LOG_INFO, fc->log, 0,
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1767 "client terminated stream %ui with status %ui",
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1768 sid, status);
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1769 break;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1770 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1771
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1772 ev = fc->read;
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1773 ev->handler(ev);
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1774
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1775 return ngx_http_spdy_state_complete(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1776 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1777
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1778
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1779 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1780 ngx_http_spdy_state_ping(ngx_http_spdy_connection_t *sc, u_char *pos,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1781 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1782 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1783 u_char *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1784 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1785 ngx_http_spdy_out_frame_t *frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1786
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1787 if (end - pos < NGX_SPDY_PING_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1788 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1789 ngx_http_spdy_state_ping);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1790 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1791
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1792 if (sc->length != NGX_SPDY_PING_SIZE) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1793 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1794 "client sent PING frame with incorrect length %uz",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1795 sc->length);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1796
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1797 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1798 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1799
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1800 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1801 "spdy PING frame");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1802
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1803 frame = ngx_http_spdy_get_ctl_frame(sc, NGX_SPDY_PING_SIZE,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1804 NGX_SPDY_HIGHEST_PRIORITY);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1805 if (frame == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1806 return ngx_http_spdy_state_internal_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1807 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1808
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1809 buf = frame->first->buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1810
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1811 p = buf->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1812
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1813 p = ngx_spdy_frame_write_head(p, NGX_SPDY_PING);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1814 p = ngx_spdy_frame_write_flags_and_len(p, 0, NGX_SPDY_PING_SIZE);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1815
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1816 p = ngx_cpymem(p, pos, NGX_SPDY_PING_SIZE);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1817
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1818 buf->last = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1819
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1820 ngx_http_spdy_queue_frame(sc, frame);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1821
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1822 pos += NGX_SPDY_PING_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1823
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1824 return ngx_http_spdy_state_complete(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1825 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1826
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1827
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1828 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1829 ngx_http_spdy_state_skip(ngx_http_spdy_connection_t *sc, u_char *pos,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1830 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1831 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1832 size_t size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1833
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1834 size = end - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1835
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1836 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1837 "spdy frame skip %uz of %uz", size, sc->length);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1838
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1839 if (size < sc->length) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1840 sc->length -= size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1841 return ngx_http_spdy_state_save(sc, end, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1842 ngx_http_spdy_state_skip);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1843 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1844
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1845 return ngx_http_spdy_state_complete(sc, pos + sc->length, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1846 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1847
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1848
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1849 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1850 ngx_http_spdy_state_settings(ngx_http_spdy_connection_t *sc, u_char *pos,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1851 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1852 {
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1853 ngx_uint_t fid, val;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1854
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1855 if (sc->entries == 0) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1856
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1857 if (end - pos < NGX_SPDY_SETTINGS_NUM_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1858 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1859 ngx_http_spdy_state_settings);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1860 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1861
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1862 sc->entries = ngx_spdy_frame_parse_uint32(pos);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1863
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1864 pos += NGX_SPDY_SETTINGS_NUM_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1865 sc->length -= NGX_SPDY_SETTINGS_NUM_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1866
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1867 if (sc->length < sc->entries * NGX_SPDY_SETTINGS_PAIR_SIZE) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1868 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1869 "client sent SETTINGS frame with incorrect "
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1870 "length %uz or number of entries %ui",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1871 sc->length, sc->entries);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1872
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1873 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1874 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1875
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1876 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1877 "spdy SETTINGS frame has %ui entries", sc->entries);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1878 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1879
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1880 while (sc->entries) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1881 if (end - pos < NGX_SPDY_SETTINGS_PAIR_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1882 return ngx_http_spdy_state_save(sc, pos, end,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1883 ngx_http_spdy_state_settings);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1884 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1885
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1886 sc->entries--;
5526
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
1887 sc->length -= NGX_SPDY_SETTINGS_PAIR_SIZE;
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1888
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1889 fid = ngx_spdy_frame_parse_uint32(pos);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1890
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1891 pos += NGX_SPDY_SETTINGS_FID_SIZE;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1892
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1893 val = ngx_spdy_frame_parse_uint32(pos);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1894
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1895 pos += NGX_SPDY_SETTINGS_VAL_SIZE;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1896
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1897 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1898 "spdy SETTINGS entry fl:%ui id:%ui val:%ui",
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1899 ngx_spdy_frame_flags(fid), ngx_spdy_frame_id(fid), val);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1900
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1901 if (ngx_spdy_frame_flags(fid) == NGX_SPDY_SETTINGS_FLAG_PERSISTED) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1902 continue;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1903 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1904
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1905 switch (ngx_spdy_frame_id(fid)) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1906
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1907 case NGX_SPDY_SETTINGS_INIT_WINDOW:
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1908
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1909 if (val > NGX_SPDY_MAX_WINDOW) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1910 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1911 "client sent SETTINGS frame with "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1912 "incorrect INIT_WINDOW value: %ui", val);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1913
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1914 return ngx_http_spdy_state_protocol_error(sc);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1915 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1916
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1917 if (ngx_http_spdy_adjust_windows(sc, val - sc->init_window)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1918 != NGX_OK)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1919 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1920 return ngx_http_spdy_state_internal_error(sc);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1921 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1922
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1923 sc->init_window = val;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1924
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1925 continue;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1926 }
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1927 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1928
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1929 return ngx_http_spdy_state_complete(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1930 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1931
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1932
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1933 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1934 ngx_http_spdy_state_complete(ngx_http_spdy_connection_t *sc, u_char *pos,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1935 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1936 {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1937 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1938 "spdy frame complete pos:%p end:%p", pos, end);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1939
5696
19a14a484707 SPDY: added protection from overrun of the receive buffer.
Valentin Bartenev <vbart@nginx.com>
parents: 5695
diff changeset
1940 if (pos > end) {
19a14a484707 SPDY: added protection from overrun of the receive buffer.
Valentin Bartenev <vbart@nginx.com>
parents: 5695
diff changeset
1941 ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
19a14a484707 SPDY: added protection from overrun of the receive buffer.
Valentin Bartenev <vbart@nginx.com>
parents: 5695
diff changeset
1942 "receive buffer overrun");
19a14a484707 SPDY: added protection from overrun of the receive buffer.
Valentin Bartenev <vbart@nginx.com>
parents: 5695
diff changeset
1943
19a14a484707 SPDY: added protection from overrun of the receive buffer.
Valentin Bartenev <vbart@nginx.com>
parents: 5695
diff changeset
1944 ngx_debug_point();
19a14a484707 SPDY: added protection from overrun of the receive buffer.
Valentin Bartenev <vbart@nginx.com>
parents: 5695
diff changeset
1945 return ngx_http_spdy_state_internal_error(sc);
19a14a484707 SPDY: added protection from overrun of the receive buffer.
Valentin Bartenev <vbart@nginx.com>
parents: 5695
diff changeset
1946 }
19a14a484707 SPDY: added protection from overrun of the receive buffer.
Valentin Bartenev <vbart@nginx.com>
parents: 5695
diff changeset
1947
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1948 sc->handler = ngx_http_spdy_state_head;
5687
6642690698f1 SPDY: improved ngx_http_spdy_state_protocol_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5686
diff changeset
1949 sc->stream = NULL;
6642690698f1 SPDY: improved ngx_http_spdy_state_protocol_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5686
diff changeset
1950
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1951 return pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1952 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1953
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1954
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1955 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1956 ngx_http_spdy_state_save(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1957 u_char *pos, u_char *end, ngx_http_spdy_handler_pt handler)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1958 {
5616
b93db4e4ff77 SPDY: improved ngx_http_spdy_state_save() check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5606
diff changeset
1959 size_t size;
b93db4e4ff77 SPDY: improved ngx_http_spdy_state_save() check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5606
diff changeset
1960
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1961 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1962 "spdy frame state save pos:%p end:%p handler:%p",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1963 pos, end, handler);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1964
5616
b93db4e4ff77 SPDY: improved ngx_http_spdy_state_save() check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5606
diff changeset
1965 size = end - pos;
b93db4e4ff77 SPDY: improved ngx_http_spdy_state_save() check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5606
diff changeset
1966
b93db4e4ff77 SPDY: improved ngx_http_spdy_state_save() check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5606
diff changeset
1967 if (size > NGX_SPDY_STATE_BUFFER_SIZE) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1968 ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1969 "state buffer overflow: %uz bytes required", size);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
1970
5695
231588611230 SPDY: added a debug point to the state buffer overflow protection.
Valentin Bartenev <vbart@nginx.com>
parents: 5694
diff changeset
1971 ngx_debug_point();
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1972 return ngx_http_spdy_state_internal_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1973 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1974
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1975 ngx_memcpy(sc->buffer, pos, NGX_SPDY_STATE_BUFFER_SIZE);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1976
5618
c15350f4071c SPDY: improved ngx_http_spdy_state_save() again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5616
diff changeset
1977 sc->buffer_used = size;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1978 sc->handler = handler;
5509
877a7bd72070 SPDY: better name for flag that indicates incomplete frame state.
Valentin Bartenev <vbart@nginx.com>
parents: 5508
diff changeset
1979 sc->incomplete = 1;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1980
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1981 return end;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1982 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1983
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1984
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1985 static u_char *
5690
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1986 ngx_http_spdy_state_inflate_error(ngx_http_spdy_connection_t *sc, int rc)
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1987 {
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1988 if (rc == Z_DATA_ERROR || rc == Z_STREAM_END) {
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1989 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1990 "client sent SYN_STREAM frame with "
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1991 "corrupted header block, inflate() failed: %d", rc);
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1992
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1993 return ngx_http_spdy_state_protocol_error(sc);
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1994 }
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1995
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1996 ngx_log_error(NGX_LOG_ERR, sc->connection->log, 0,
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1997 "inflate() failed: %d", rc);
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1998
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
1999 return ngx_http_spdy_state_internal_error(sc);
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
2000 }
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
2001
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
2002
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
2003 static u_char *
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2004 ngx_http_spdy_state_protocol_error(ngx_http_spdy_connection_t *sc)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2005 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2006 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2007 "spdy state protocol error");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2008
5687
6642690698f1 SPDY: improved ngx_http_spdy_state_protocol_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5686
diff changeset
2009 if (sc->stream) {
5688
86232c95623d SPDY: prevented creation of RST_STREAM in protocol error state.
Valentin Bartenev <vbart@nginx.com>
parents: 5687
diff changeset
2010 sc->stream->out_closed = 1;
5687
6642690698f1 SPDY: improved ngx_http_spdy_state_protocol_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5686
diff changeset
2011 ngx_http_spdy_close_stream(sc->stream, NGX_HTTP_BAD_REQUEST);
6642690698f1 SPDY: improved ngx_http_spdy_state_protocol_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5686
diff changeset
2012 }
6642690698f1 SPDY: improved ngx_http_spdy_state_protocol_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5686
diff changeset
2013
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2014 ngx_http_spdy_finalize_connection(sc, NGX_HTTP_CLIENT_CLOSED_REQUEST);
5687
6642690698f1 SPDY: improved ngx_http_spdy_state_protocol_error().
Valentin Bartenev <vbart@nginx.com>
parents: 5686
diff changeset
2015
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2016 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2017 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2018
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2019
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2020 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2021 ngx_http_spdy_state_internal_error(ngx_http_spdy_connection_t *sc)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2022 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2023 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2024 "spdy state internal error");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2025
5690
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
2026 if (sc->stream) {
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
2027 sc->stream->out_closed = 1;
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
2028 ngx_http_spdy_close_stream(sc->stream, NGX_HTTP_INTERNAL_SERVER_ERROR);
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
2029 }
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
2030
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2031 ngx_http_spdy_finalize_connection(sc, NGX_HTTP_INTERNAL_SERVER_ERROR);
5690
fb56f5d612a0 SPDY: improved error handling of header block decompression.
Valentin Bartenev <vbart@nginx.com>
parents: 5689
diff changeset
2032
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2033 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2034 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2035
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2036
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2037 static ngx_int_t
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2038 ngx_http_spdy_send_window_update(ngx_http_spdy_connection_t *sc, ngx_uint_t sid,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2039 ngx_uint_t delta)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2040 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2041 u_char *p;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2042 ngx_buf_t *buf;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2043 ngx_http_spdy_out_frame_t *frame;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2044
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2045 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2046 "spdy send WINDOW_UPDATE sid:%ui delta:%ui", sid, delta);
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2047
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2048 frame = ngx_http_spdy_get_ctl_frame(sc, NGX_SPDY_WINDOW_UPDATE_SIZE,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2049 NGX_SPDY_HIGHEST_PRIORITY);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2050 if (frame == NULL) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2051 return NGX_ERROR;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2052 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2053
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2054 buf = frame->first->buf;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2055
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2056 p = buf->pos;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2057
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2058 p = ngx_spdy_frame_write_head(p, NGX_SPDY_WINDOW_UPDATE);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2059 p = ngx_spdy_frame_write_flags_and_len(p, 0, NGX_SPDY_WINDOW_UPDATE_SIZE);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2060
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2061 p = ngx_spdy_frame_write_sid(p, sid);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2062 p = ngx_spdy_frame_aligned_write_uint32(p, delta);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2063
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2064 buf->last = p;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2065
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2066 ngx_http_spdy_queue_frame(sc, frame);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2067
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2068 return NGX_OK;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2069 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2070
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2071
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2072 static ngx_int_t
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2073 ngx_http_spdy_send_rst_stream(ngx_http_spdy_connection_t *sc, ngx_uint_t sid,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2074 ngx_uint_t status, ngx_uint_t priority)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2075 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2076 u_char *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2077 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2078 ngx_http_spdy_out_frame_t *frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2079
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2080 if (sc->connection->error) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2081 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2082 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2083
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2084 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2085 "spdy send RST_STREAM sid:%ui st:%ui", sid, status);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2086
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2087 frame = ngx_http_spdy_get_ctl_frame(sc, NGX_SPDY_RST_STREAM_SIZE,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2088 priority);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2089 if (frame == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2090 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2091 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2092
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2093 buf = frame->first->buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2094
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2095 p = buf->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2096
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2097 p = ngx_spdy_frame_write_head(p, NGX_SPDY_RST_STREAM);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2098 p = ngx_spdy_frame_write_flags_and_len(p, 0, NGX_SPDY_RST_STREAM_SIZE);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2099
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2100 p = ngx_spdy_frame_write_sid(p, sid);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2101 p = ngx_spdy_frame_aligned_write_uint32(p, status);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2102
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2103 buf->last = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2104
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2105 ngx_http_spdy_queue_frame(sc, frame);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2106
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2107 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2108 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2109
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2110
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2111 #if 0
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2112 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2113 ngx_http_spdy_send_goaway(ngx_http_spdy_connection_t *sc)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2114 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2115 u_char *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2116 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2117 ngx_http_spdy_out_frame_t *frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2118
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2119 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2120 "spdy send GOAWAY sid:%ui", sc->last_sid);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2122 frame = ngx_http_spdy_get_ctl_frame(sc, NGX_SPDY_GOAWAY_SIZE,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2123 NGX_SPDY_HIGHEST_PRIORITY);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2124 if (frame == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2125 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2126 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2127
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2128 buf = frame->first->buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2129
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2130 p = buf->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2131
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2132 p = ngx_spdy_frame_write_head(p, NGX_SPDY_GOAWAY);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2133 p = ngx_spdy_frame_write_flags_and_len(p, 0, NGX_SPDY_GOAWAY_SIZE);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2134
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2135 p = ngx_spdy_frame_write_sid(p, sc->last_sid);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2136
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2137 buf->last = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2138
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2139 ngx_http_spdy_queue_frame(sc, frame);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2140
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2141 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2142 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2143 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2144
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2145
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2146 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2147 ngx_http_spdy_send_settings(ngx_http_spdy_connection_t *sc)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2148 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2149 u_char *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2150 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2151 ngx_chain_t *cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2152 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2153 ngx_http_spdy_out_frame_t *frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2154
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2155 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2156 "spdy send SETTINGS frame");
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2157
5519
22c249dac7c1 SPDY: the SETTINGS frame should be allocated from sc->pool.
Valentin Bartenev <vbart@nginx.com>
parents: 5518
diff changeset
2158 frame = ngx_palloc(sc->pool, sizeof(ngx_http_spdy_out_frame_t));
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2159 if (frame == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2160 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2161 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2162
5519
22c249dac7c1 SPDY: the SETTINGS frame should be allocated from sc->pool.
Valentin Bartenev <vbart@nginx.com>
parents: 5518
diff changeset
2163 cl = ngx_alloc_chain_link(sc->pool);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2164 if (cl == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2165 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2166 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2167
5519
22c249dac7c1 SPDY: the SETTINGS frame should be allocated from sc->pool.
Valentin Bartenev <vbart@nginx.com>
parents: 5518
diff changeset
2168 buf = ngx_create_temp_buf(sc->pool, NGX_SPDY_FRAME_HEADER_SIZE
22c249dac7c1 SPDY: the SETTINGS frame should be allocated from sc->pool.
Valentin Bartenev <vbart@nginx.com>
parents: 5518
diff changeset
2169 + NGX_SPDY_SETTINGS_NUM_SIZE
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2170 + 2 * NGX_SPDY_SETTINGS_PAIR_SIZE);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2171 if (buf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2172 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2173 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2174
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2175 buf->last_buf = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2176
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2177 cl->buf = buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2178 cl->next = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2179
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2180 frame->first = cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2181 frame->last = cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2182 frame->handler = ngx_http_spdy_settings_frame_handler;
5518
ec9e9da4c1fb SPDY: fixed possible uninitialized memory access.
Valentin Bartenev <vbart@nginx.com>
parents: 5510
diff changeset
2183 frame->stream = NULL;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2184 #if (NGX_DEBUG)
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2185 frame->length = NGX_SPDY_SETTINGS_NUM_SIZE
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2186 + 2 * NGX_SPDY_SETTINGS_PAIR_SIZE;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2187 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2188 frame->priority = NGX_SPDY_HIGHEST_PRIORITY;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2189 frame->blocked = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2190
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2191 p = buf->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2192
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2193 p = ngx_spdy_frame_write_head(p, NGX_SPDY_SETTINGS);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2194 p = ngx_spdy_frame_write_flags_and_len(p, NGX_SPDY_FLAG_CLEAR_SETTINGS,
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2195 NGX_SPDY_SETTINGS_NUM_SIZE
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2196 + 2 * NGX_SPDY_SETTINGS_PAIR_SIZE);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2197
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2198 p = ngx_spdy_frame_aligned_write_uint32(p, 2);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2199
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2200 sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2201 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2202
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2203 p = ngx_spdy_frame_write_flags_and_id(p, 0, NGX_SPDY_SETTINGS_MAX_STREAMS);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2204 p = ngx_spdy_frame_aligned_write_uint32(p, sscf->concurrent_streams);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2205
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2206 p = ngx_spdy_frame_write_flags_and_id(p, 0, NGX_SPDY_SETTINGS_INIT_WINDOW);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2207 p = ngx_spdy_frame_aligned_write_uint32(p, NGX_SPDY_STREAM_WINDOW);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2208
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2209 buf->last = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2210
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2211 ngx_http_spdy_queue_frame(sc, frame);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2212
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2213 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2214 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2215
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2216
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2217 ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2218 ngx_http_spdy_settings_frame_handler(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2219 ngx_http_spdy_out_frame_t *frame)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2220 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2221 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2222
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2223 buf = frame->first->buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2224
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2225 if (buf->pos != buf->last) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2226 return NGX_AGAIN;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2227 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2228
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2229 ngx_free_chain(sc->pool, frame->first);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2230
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2231 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2232 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2233
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2234
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2235 static ngx_http_spdy_out_frame_t *
5529
e4adaa47af65 SPDY: store the length of frame instead of its whole size.
Valentin Bartenev <vbart@nginx.com>
parents: 5528
diff changeset
2236 ngx_http_spdy_get_ctl_frame(ngx_http_spdy_connection_t *sc, size_t length,
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2237 ngx_uint_t priority)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2238 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2239 ngx_chain_t *cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2240 ngx_http_spdy_out_frame_t *frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2241
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2242 frame = sc->free_ctl_frames;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2243
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2244 if (frame) {
5528
d5de6c25b759 SPDY: use frame->next pointer to chain free frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5527
diff changeset
2245 sc->free_ctl_frames = frame->next;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2246
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2247 cl = frame->first;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2248 cl->buf->pos = cl->buf->start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2249
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2250 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2251 frame = ngx_palloc(sc->pool, sizeof(ngx_http_spdy_out_frame_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2252 if (frame == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2253 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2254 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2255
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2256 cl = ngx_alloc_chain_link(sc->pool);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2257 if (cl == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2258 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2259 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2260
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2261 cl->buf = ngx_create_temp_buf(sc->pool,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2262 NGX_SPDY_CTL_FRAME_BUFFER_SIZE);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2263 if (cl->buf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2264 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2265 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2266
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2267 cl->buf->last_buf = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2268
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2269 frame->first = cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2270 frame->last = cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2271 frame->handler = ngx_http_spdy_ctl_frame_handler;
5518
ec9e9da4c1fb SPDY: fixed possible uninitialized memory access.
Valentin Bartenev <vbart@nginx.com>
parents: 5510
diff changeset
2272 frame->stream = NULL;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2273 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2274
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2275 #if (NGX_DEBUG)
5529
e4adaa47af65 SPDY: store the length of frame instead of its whole size.
Valentin Bartenev <vbart@nginx.com>
parents: 5528
diff changeset
2276 if (length > NGX_SPDY_CTL_FRAME_BUFFER_SIZE - NGX_SPDY_FRAME_HEADER_SIZE) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2277 ngx_log_error(NGX_LOG_ALERT, sc->pool->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2278 "requested control frame is too large: %uz", length);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2279 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2280 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2281
5529
e4adaa47af65 SPDY: store the length of frame instead of its whole size.
Valentin Bartenev <vbart@nginx.com>
parents: 5528
diff changeset
2282 frame->length = length;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2283 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2284
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2285 frame->priority = priority;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2286 frame->blocked = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2287
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2288 return frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2289 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2290
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2291
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2292 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2293 ngx_http_spdy_ctl_frame_handler(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2294 ngx_http_spdy_out_frame_t *frame)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2295 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2296 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2297
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2298 buf = frame->first->buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2299
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2300 if (buf->pos != buf->last) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2301 return NGX_AGAIN;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2302 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2303
5528
d5de6c25b759 SPDY: use frame->next pointer to chain free frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5527
diff changeset
2304 frame->next = sc->free_ctl_frames;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2305 sc->free_ctl_frames = frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2306
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2307 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2308 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2309
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2310
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2311 static ngx_http_spdy_stream_t *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2312 ngx_http_spdy_create_stream(ngx_http_spdy_connection_t *sc, ngx_uint_t id,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2313 ngx_uint_t priority)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2314 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2315 ngx_log_t *log;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2316 ngx_uint_t index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2317 ngx_event_t *rev, *wev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2318 ngx_connection_t *fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2319 ngx_http_log_ctx_t *ctx;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2320 ngx_http_request_t *r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2321 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2322 ngx_http_core_srv_conf_t *cscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2323 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2324
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2325 fc = sc->free_fake_connections;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2326
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2327 if (fc) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2328 sc->free_fake_connections = fc->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2329
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2330 rev = fc->read;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2331 wev = fc->write;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2332 log = fc->log;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2333 ctx = log->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2334
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2335 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2336 fc = ngx_palloc(sc->pool, sizeof(ngx_connection_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2337 if (fc == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2338 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2339 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2340
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2341 rev = ngx_palloc(sc->pool, sizeof(ngx_event_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2342 if (rev == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2343 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2344 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2345
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2346 wev = ngx_palloc(sc->pool, sizeof(ngx_event_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2347 if (wev == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2348 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2349 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2350
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2351 log = ngx_palloc(sc->pool, sizeof(ngx_log_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2352 if (log == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2353 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2354 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2355
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2356 ctx = ngx_palloc(sc->pool, sizeof(ngx_http_log_ctx_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2357 if (ctx == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2358 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2359 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2360
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2361 ctx->connection = fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2362 ctx->request = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2363 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2364
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2365 ngx_memcpy(log, sc->connection->log, sizeof(ngx_log_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2366
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2367 log->data = ctx;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2368
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2369 ngx_memzero(rev, sizeof(ngx_event_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2370
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2371 rev->data = fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2372 rev->ready = 1;
5403
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
2373 rev->handler = ngx_http_spdy_close_stream_handler;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2374 rev->log = log;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2375
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2376 ngx_memcpy(wev, rev, sizeof(ngx_event_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2377
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2378 wev->write = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2379
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2380 ngx_memcpy(fc, sc->connection, sizeof(ngx_connection_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2381
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2382 fc->data = sc->http_connection;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2383 fc->read = rev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2384 fc->write = wev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2385 fc->sent = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2386 fc->log = log;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2387 fc->buffered = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2388 fc->sndlowat = 1;
5182
7a015bbda96f SPDY: set NGX_TCP_NODELAY_DISABLED for fake connections.
Valentin Bartenev <vbart@nginx.com>
parents: 5121
diff changeset
2389 fc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2390
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2391 r = ngx_http_create_request(fc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2392 if (r == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2393 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2394 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2395
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2396 r->valid_location = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2397
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2398 fc->data = r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2399 sc->connection->requests++;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2400
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2401 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2402
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2403 r->header_in = ngx_create_temp_buf(r->pool,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2404 cscf->client_header_buffer_size);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2405 if (r->header_in == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2406 ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2407 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2408 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2409
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2410 r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2411
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2412 stream = ngx_pcalloc(r->pool, sizeof(ngx_http_spdy_stream_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2413 if (stream == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2414 ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2415 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2416 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2417
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2418 r->spdy_stream = stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2419
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2420 stream->id = id;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2421 stream->request = r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2422 stream->connection = sc;
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2423
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2424 stream->send_window = sc->init_window;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2425 stream->recv_window = NGX_SPDY_STREAM_WINDOW;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2426
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2427 stream->priority = priority;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2428
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2429 sscf = ngx_http_get_module_srv_conf(r, ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2430
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2431 index = ngx_http_spdy_stream_index(sscf, id);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2432
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2433 stream->index = sc->streams_index[index];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2434 sc->streams_index[index] = stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2435
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2436 sc->processing++;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2437
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2438 return stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2439 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2440
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2441
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2442 static ngx_http_spdy_stream_t *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2443 ngx_http_spdy_get_stream_by_id(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2444 ngx_uint_t sid)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2445 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2446 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2447 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2448
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2449 sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2450 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2451
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2452 stream = sc->streams_index[ngx_http_spdy_stream_index(sscf, sid)];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2453
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2454 while (stream) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2455 if (stream->id == sid) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2456 return stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2457 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2458
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2459 stream = stream->index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2460 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2461
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2462 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2463 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2464
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2465
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2466 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2467 ngx_http_spdy_parse_header(ngx_http_request_t *r)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2468 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2469 u_char *p, *end, ch;
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2470 ngx_uint_t hash;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2471 ngx_http_core_srv_conf_t *cscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2472
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2473 enum {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2474 sw_name_len = 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2475 sw_name,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2476 sw_value_len,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2477 sw_value
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2478 } state;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2479
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2480 state = r->state;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2481
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2482 p = r->header_in->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2483 end = r->header_in->last;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2484
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2485 switch (state) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2486
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2487 case sw_name_len:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2488
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2489 if (end - p < NGX_SPDY_NV_NLEN_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2490 return NGX_AGAIN;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2491 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2492
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2493 r->lowcase_index = ngx_spdy_frame_parse_uint32(p);
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2494
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2495 if (r->lowcase_index == 0) {
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2496 return NGX_ERROR;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2497 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2498
5323
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2499 /* null-terminate the previous header value */
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2500 *p = '\0';
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2501
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2502 p += NGX_SPDY_NV_NLEN_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2503
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2504 r->invalid_header = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2505
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2506 state = sw_name;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2507
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2508 /* fall through */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2509
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2510 case sw_name:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2511
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2512 if ((ngx_uint_t) (end - p) < r->lowcase_index) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2513 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2514 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2515
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2516 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2517
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2518 r->header_name_start = p;
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2519 r->header_name_end = p + r->lowcase_index;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2520
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2521 if (p[0] == ':') {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2522 p++;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2523 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2524
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2525 hash = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2526
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2527 for ( /* void */ ; p != r->header_name_end; p++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2528
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2529 ch = *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2530
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2531 hash = ngx_hash(hash, ch);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2532
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2533 if ((ch >= 'a' && ch <= 'z')
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2534 || (ch == '-')
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2535 || (ch >= '0' && ch <= '9')
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2536 || (ch == '_' && cscf->underscores_in_headers))
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2537 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2538 continue;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2539 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2540
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2541 switch (ch) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2542 case '\0':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2543 case LF:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2544 case CR:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2545 case ':':
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2546 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2547 "client sent invalid header name: \"%*s\"",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2548 r->lowcase_index, r->header_name_start);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2549
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2550 return NGX_HTTP_PARSE_INVALID_HEADER;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2551 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2552
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2553 if (ch >= 'A' && ch <= 'Z') {
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2554 return NGX_ERROR;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2555 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2556
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2557 r->invalid_header = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2558 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2559
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2560 r->header_hash = hash;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2561
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2562 state = sw_value_len;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2563
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2564 /* fall through */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2565
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2566 case sw_value_len:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2567
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2568 if (end - p < NGX_SPDY_NV_VLEN_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2569 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2570 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2571
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2572 r->lowcase_index = ngx_spdy_frame_parse_uint32(p);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2573
5323
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2574 /* null-terminate header name */
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2575 *p = '\0';
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2576
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2577 p += NGX_SPDY_NV_VLEN_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2578
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2579 state = sw_value;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2580
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2581 /* fall through */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2582
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2583 case sw_value:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2584
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2585 if ((ngx_uint_t) (end - p) < r->lowcase_index) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2586 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2587 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2588
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2589 r->header_start = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2590
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2591 while (r->lowcase_index--) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2592 ch = *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2593
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2594 if (ch == '\0') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2595
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2596 if (p == r->header_start) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2597 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2598 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2599
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2600 r->header_end = p;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2601 r->header_in->pos = p + 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2602
5762
b522d5b137fd SPDY: fix support for headers with multiple values.
Piotr Sikora <piotr@cloudflare.com>
parents: 5696
diff changeset
2603 r->state = sw_value;
b522d5b137fd SPDY: fix support for headers with multiple values.
Piotr Sikora <piotr@cloudflare.com>
parents: 5696
diff changeset
2604
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2605 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2606 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2607
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2608 if (ch == CR || ch == LF) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2609 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2610 "client sent header \"%*s\" with "
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2611 "invalid value: \"%*s\\%c...\"",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2612 r->header_name_end - r->header_name_start,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2613 r->header_name_start,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2614 p - r->header_start,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2615 r->header_start,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2616 ch == CR ? 'r' : 'n');
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2617
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2618 return NGX_HTTP_PARSE_INVALID_HEADER;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2619 }
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2620
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2621 p++;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2622 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2623
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2624 r->header_end = p;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2625 r->header_in->pos = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2626
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2627 r->state = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2628
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2629 return NGX_DONE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2630 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2631
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2632 r->header_in->pos = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2633 r->state = state;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2634
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2635 return NGX_AGAIN;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2636 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2637
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2638
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2639 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2640 ngx_http_spdy_alloc_large_header_buffer(ngx_http_request_t *r)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2641 {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2642 u_char *old, *new, *p;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2643 size_t rest;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2644 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2645 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2646 ngx_http_core_srv_conf_t *cscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2647
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2648 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2649 "spdy alloc large header buffer");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2650
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2651 stream = r->spdy_stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2652
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2653 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2654
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2655 if (stream->header_buffers
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2656 == (ngx_uint_t) cscf->large_client_header_buffers.num)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2657 {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2658 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2659 "client sent too large request");
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2660
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2661 return NGX_DECLINED;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2662 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2663
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2664 rest = r->header_in->last - r->header_in->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2665
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2666 /*
5904
abb466a57a22 SPDY: fixed check for too long header name or value.
Valentin Bartenev <vbart@nginx.com>
parents: 5903
diff changeset
2667 * One more byte is needed for null-termination
abb466a57a22 SPDY: fixed check for too long header name or value.
Valentin Bartenev <vbart@nginx.com>
parents: 5903
diff changeset
2668 * and another one for further progress.
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2669 */
5904
abb466a57a22 SPDY: fixed check for too long header name or value.
Valentin Bartenev <vbart@nginx.com>
parents: 5903
diff changeset
2670 if (rest > cscf->large_client_header_buffers.size - 2) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2671 p = r->header_in->pos;
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2672
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2673 if (rest > NGX_MAX_ERROR_STR - 300) {
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2674 rest = NGX_MAX_ERROR_STR - 300;
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2675 }
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2676
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2677 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
5899
234c5ecb00c0 SPDY: fixed "too long header line" logging.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5821
diff changeset
2678 "client sent too long header name or value: \"%*s...\"",
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2679 rest, p);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2680
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2681 return NGX_DECLINED;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2682 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2683
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2684 buf = ngx_create_temp_buf(r->pool, cscf->large_client_header_buffers.size);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2685 if (buf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2686 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2687 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2688
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2689 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2690 "spdy large header alloc: %p %uz",
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2691 buf->pos, buf->end - buf->last);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2692
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2693 old = r->header_in->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2694 new = buf->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2695
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2696 if (rest) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2697 buf->last = ngx_cpymem(new, old, rest);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2698 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2699
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2700 r->header_in = buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2701
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2702 stream->header_buffers++;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2703
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2704 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2705 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2706
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2707
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2708 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2709 ngx_http_spdy_handle_request_header(ngx_http_request_t *r)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2710 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2711 ngx_uint_t i;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2712 ngx_table_elt_t *h;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2713 ngx_http_core_srv_conf_t *cscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2714 ngx_http_spdy_request_header_t *sh;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2715
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2716 if (r->invalid_header) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2717 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2718
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2719 if (cscf->ignore_invalid_headers) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2720 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2721 "client sent invalid header: \"%*s\"",
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2722 r->header_end - r->header_name_start,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2723 r->header_name_start);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2724 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2725 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2726
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2727 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2728
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2729 if (r->header_name_start[0] == ':') {
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2730 r->header_name_start++;
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2731
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2732 for (i = 0; i < NGX_SPDY_REQUEST_HEADERS; i++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2733 sh = &ngx_http_spdy_request_headers[i];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2734
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2735 if (sh->hash != r->header_hash
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2736 || sh->len != r->header_name_end - r->header_name_start
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2737 || ngx_strncmp(sh->header, r->header_name_start, sh->len) != 0)
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2738 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2739 continue;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2740 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2741
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2742 return sh->handler(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2743 }
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2744
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2745 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2746 "client sent invalid header name: \":%*s\"",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2747 r->header_end - r->header_name_start,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2748 r->header_name_start);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2749
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2750 return NGX_HTTP_PARSE_INVALID_HEADER;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2751 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2752
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2753 h = ngx_list_push(&r->headers_in.headers);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2754 if (h == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2755 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2756 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2757
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2758 h->hash = r->header_hash;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2759
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2760 h->key.len = r->header_name_end - r->header_name_start;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2761 h->key.data = r->header_name_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2762
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2763 h->value.len = r->header_end - r->header_start;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2764 h->value.data = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2765
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2766 h->lowcase_key = h->key.data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2767
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2768 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2769 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2770
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2771
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2772 void
5225
15a7deeaa19a Use "void" for functions with empty parameter list.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5182
diff changeset
2773 ngx_http_spdy_request_headers_init(void)
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2774 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2775 ngx_uint_t i;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2776 ngx_http_spdy_request_header_t *h;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2777
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2778 for (i = 0; i < NGX_SPDY_REQUEST_HEADERS; i++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2779 h = &ngx_http_spdy_request_headers[i];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2780 h->hash = ngx_hash_key(h->header, h->len);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2781 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2782 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2783
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2784
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2785 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2786 ngx_http_spdy_parse_method(ngx_http_request_t *r)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2787 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2788 size_t k, len;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2789 ngx_uint_t n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2790 const u_char *p, *m;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2791
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2792 /*
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2793 * This array takes less than 256 sequential bytes,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2794 * and if typical CPU cache line size is 64 bytes,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2795 * it is prefetched for 4 load operations.
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2796 */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2797 static const struct {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2798 u_char len;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2799 const u_char method[11];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2800 uint32_t value;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2801 } tests[] = {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2802 { 3, "GET", NGX_HTTP_GET },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2803 { 4, "POST", NGX_HTTP_POST },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2804 { 4, "HEAD", NGX_HTTP_HEAD },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2805 { 7, "OPTIONS", NGX_HTTP_OPTIONS },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2806 { 8, "PROPFIND", NGX_HTTP_PROPFIND },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2807 { 3, "PUT", NGX_HTTP_PUT },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2808 { 5, "MKCOL", NGX_HTTP_MKCOL },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2809 { 6, "DELETE", NGX_HTTP_DELETE },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2810 { 4, "COPY", NGX_HTTP_COPY },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2811 { 4, "MOVE", NGX_HTTP_MOVE },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2812 { 9, "PROPPATCH", NGX_HTTP_PROPPATCH },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2813 { 4, "LOCK", NGX_HTTP_LOCK },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2814 { 6, "UNLOCK", NGX_HTTP_UNLOCK },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2815 { 5, "PATCH", NGX_HTTP_PATCH },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2816 { 5, "TRACE", NGX_HTTP_TRACE }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2817 }, *test;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2818
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2819 if (r->method_name.len) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2820 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2821 "client sent duplicate :method header");
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2822
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2823 return NGX_HTTP_PARSE_INVALID_HEADER;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2824 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2825
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2826 len = r->header_end - r->header_start;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2827
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2828 r->method_name.len = len;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2829 r->method_name.data = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2830
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2831 test = tests;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2832 n = sizeof(tests) / sizeof(tests[0]);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2833
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2834 do {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2835 if (len == test->len) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2836 p = r->method_name.data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2837 m = test->method;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2838 k = len;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2839
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2840 do {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2841 if (*p++ != *m++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2842 goto next;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2843 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2844 } while (--k);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2845
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2846 r->method = test->value;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2847 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2848 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2849
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2850 next:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2851 test++;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2852
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2853 } while (--n);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2854
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2855 p = r->method_name.data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2856
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2857 do {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2858 if ((*p < 'A' || *p > 'Z') && *p != '_') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2859 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2860 "client sent invalid method: \"%V\"",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2861 &r->method_name);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2862
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2863 return NGX_HTTP_PARSE_INVALID_HEADER;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2864 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2865
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2866 p++;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2867
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2868 } while (--len);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2869
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2870 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2871 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2872
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2873
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2874 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2875 ngx_http_spdy_parse_scheme(ngx_http_request_t *r)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2876 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2877 if (r->schema_start) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2878 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2879 "client sent duplicate :schema header");
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2880
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2881 return NGX_HTTP_PARSE_INVALID_HEADER;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2882 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2883
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2884 r->schema_start = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2885 r->schema_end = r->header_end;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2886
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2887 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2888 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2889
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2890
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2891 static ngx_int_t
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2892 ngx_http_spdy_parse_host(ngx_http_request_t *r)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2893 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2894 ngx_table_elt_t *h;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2895
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2896 if (r->headers_in.host) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2897 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2898 "client sent duplicate :host header");
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2899
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2900 return NGX_HTTP_PARSE_INVALID_HEADER;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2901 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2902
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2903 h = ngx_list_push(&r->headers_in.headers);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2904 if (h == NULL) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2905 return NGX_ERROR;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2906 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2907
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2908 r->headers_in.host = h;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2909
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2910 h->hash = r->header_hash;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2911
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2912 h->key.len = r->header_name_end - r->header_name_start;
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2913 h->key.data = r->header_name_start;
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2914
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2915 h->value.len = r->header_end - r->header_start;
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2916 h->value.data = r->header_start;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2917
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2918 h->lowcase_key = h->key.data;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2919
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2920 return NGX_OK;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2921 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2922
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2923
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2924 static ngx_int_t
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2925 ngx_http_spdy_parse_path(ngx_http_request_t *r)
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2926 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2927 if (r->unparsed_uri.len) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2928 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2929 "client sent duplicate :path header");
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2930
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2931 return NGX_HTTP_PARSE_INVALID_HEADER;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2932 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2933
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2934 r->uri_start = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2935 r->uri_end = r->header_end;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2936
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2937 if (ngx_http_parse_uri(r) != NGX_OK) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2938 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2939 "client sent invalid URI: \"%*s\"",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2940 r->uri_end - r->uri_start, r->uri_start);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2941
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2942 return NGX_HTTP_PARSE_INVALID_HEADER;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2943 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2944
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2945 if (ngx_http_process_request_uri(r) != NGX_OK) {
5691
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2946 /*
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2947 * request has been finalized already
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2948 * in ngx_http_process_request_uri()
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2949 */
31349361558e SPDY: ngx_http_spdy_state_headers() error handling cleanup.
Valentin Bartenev <vbart@nginx.com>
parents: 5690
diff changeset
2950 return NGX_ABORT;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2951 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2952
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2953 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2954 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2955
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2956
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2957 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2958 ngx_http_spdy_parse_version(ngx_http_request_t *r)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2959 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2960 u_char *p, ch;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2961
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2962 if (r->http_protocol.len) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2963 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2964 "client sent duplicate :version header");
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2965
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2966 return NGX_HTTP_PARSE_INVALID_HEADER;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2967 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2968
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2969 p = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2970
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2971 if (r->header_end - p < 8 || !(ngx_str5cmp(p, 'H', 'T', 'T', 'P', '/'))) {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2972 goto invalid;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2973 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2974
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2975 ch = *(p + 5);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2976
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2977 if (ch < '1' || ch > '9') {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2978 goto invalid;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2979 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2980
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2981 r->http_major = ch - '0';
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2982
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2983 for (p += 6; p != r->header_end - 2; p++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2984
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2985 ch = *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2986
5574
cff36d2d7fe6 SPDY: fixed parsing of http version.
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5553
diff changeset
2987 if (ch == '.') {
cff36d2d7fe6 SPDY: fixed parsing of http version.
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5553
diff changeset
2988 break;
cff36d2d7fe6 SPDY: fixed parsing of http version.
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5553
diff changeset
2989 }
cff36d2d7fe6 SPDY: fixed parsing of http version.
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5553
diff changeset
2990
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2991 if (ch < '0' || ch > '9') {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2992 goto invalid;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2993 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2994
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2995 r->http_major = r->http_major * 10 + ch - '0';
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2996 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2997
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2998 if (*p != '.') {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
2999 goto invalid;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3000 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3001
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3002 ch = *(p + 1);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3003
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3004 if (ch < '0' || ch > '9') {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3005 goto invalid;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3006 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3007
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3008 r->http_minor = ch - '0';
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3009
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3010 for (p += 2; p != r->header_end; p++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3011
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3012 ch = *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3013
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3014 if (ch < '0' || ch > '9') {
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3015 goto invalid;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3016 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3017
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3018 r->http_minor = r->http_minor * 10 + ch - '0';
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3019 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3020
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
3021 r->http_protocol.len = r->header_end - r->header_start;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3022 r->http_protocol.data = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3023 r->http_version = r->http_major * 1000 + r->http_minor;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3024
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3025 return NGX_OK;
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3026
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3027 invalid:
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3028
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3029 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3030 "client sent invalid http version: \"%*s\"",
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3031 r->header_end - r->header_start, r->header_start);
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3032
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3033 return NGX_HTTP_PARSE_INVALID_HEADER;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3034 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3035
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3036
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3037 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3038 ngx_http_spdy_construct_request_line(ngx_http_request_t *r)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3039 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3040 u_char *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3041
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3042 if (r->method_name.len == 0
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3043 || r->unparsed_uri.len == 0
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3044 || r->http_protocol.len == 0)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3045 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3046 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3047 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3048 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3049
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3050 r->request_line.len = r->method_name.len + 1
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3051 + r->unparsed_uri.len + 1
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3052 + r->http_protocol.len;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3053
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3054 p = ngx_pnalloc(r->pool, r->request_line.len + 1);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3055 if (p == NULL) {
5686
5cf537731218 SPDY: fixed one case of improper memory allocation error handling.
Valentin Bartenev <vbart@nginx.com>
parents: 5665
diff changeset
3056 ngx_http_spdy_close_stream(r->spdy_stream,
5cf537731218 SPDY: fixed one case of improper memory allocation error handling.
Valentin Bartenev <vbart@nginx.com>
parents: 5665
diff changeset
3057 NGX_HTTP_INTERNAL_SERVER_ERROR);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3058 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3059 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3060
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3061 r->request_line.data = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3062
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3063 p = ngx_cpymem(p, r->method_name.data, r->method_name.len);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3064
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3065 *p++ = ' ';
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3066
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3067 p = ngx_cpymem(p, r->unparsed_uri.data, r->unparsed_uri.len);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3068
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3069 *p++ = ' ';
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3070
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3071 ngx_memcpy(p, r->http_protocol.data, r->http_protocol.len + 1);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3072
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3073 /* some modules expect the space character after method name */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3074 r->method_name.data = r->request_line.data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3075
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3076 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3077 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3078
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3079
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3080 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3081 ngx_http_spdy_run_request(ngx_http_request_t *r)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3082 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3083 ngx_uint_t i;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3084 ngx_list_part_t *part;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3085 ngx_table_elt_t *h;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3086 ngx_http_header_t *hh;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3087 ngx_http_core_main_conf_t *cmcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3088
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3089 if (ngx_http_spdy_construct_request_line(r) != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3090 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3091 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3092
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3093 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3094 "spdy http request line: \"%V\"", &r->request_line);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3095
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3096 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3097
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3098 part = &r->headers_in.headers.part;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3099 h = part->elts;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3100
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3101 for (i = 0 ;; i++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3102
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3103 if (i >= part->nelts) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3104 if (part->next == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3105 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3106 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3107
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3108 part = part->next;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3109 h = part->elts;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3110 i = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3111 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3112
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3113 hh = ngx_hash_find(&cmcf->headers_in_hash, h[i].hash,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3114 h[i].lowcase_key, h[i].key.len);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3115
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3116 if (hh && hh->handler(r, &h[i], hh->offset) != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3117 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3118 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3119
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3120 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3121 "spdy http header: \"%V: %V\"", &h[i].key, &h[i].value);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3122 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3123
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3124 r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3125
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3126 if (ngx_http_process_request_header(r) != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3127 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3128 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3129
5641
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
3130 if (r->headers_in.content_length_n > 0 && r->spdy_stream->in_closed) {
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
3131 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
3132 "client prematurely closed stream");
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
3133
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
3134 r->spdy_stream->skip_data = NGX_SPDY_DATA_ERROR;
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
3135
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
3136 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
3137 return;
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
3138 }
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
3139
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3140 ngx_http_process_request(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3141 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3142
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3143
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3144 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3145 ngx_http_spdy_init_request_body(ngx_http_request_t *r)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3146 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3147 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3148 ngx_temp_file_t *tf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3149 ngx_http_request_body_t *rb;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3150 ngx_http_core_loc_conf_t *clcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3151
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3152 rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3153 if (rb == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3154 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3155 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3156
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3157 r->request_body = rb;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3158
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3159 if (r->spdy_stream->in_closed) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3160 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3161 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3162
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3163 rb->rest = r->headers_in.content_length_n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3164
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3165 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3166
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3167 if (r->request_body_in_file_only
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3168 || rb->rest > (off_t) clcf->client_body_buffer_size
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3169 || rb->rest < 0)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3170 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3171 tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3172 if (tf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3173 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3174 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3175
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3176 tf->file.fd = NGX_INVALID_FILE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3177 tf->file.log = r->connection->log;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3178 tf->path = clcf->client_body_temp_path;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3179 tf->pool = r->pool;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3180 tf->warn = "a client request body is buffered to a temporary file";
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3181 tf->log_level = r->request_body_file_log_level;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3182 tf->persistent = r->request_body_in_persistent_file;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3183 tf->clean = r->request_body_in_clean_file;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3184
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3185 if (r->request_body_file_group_access) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3186 tf->access = 0660;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3187 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3188
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3189 rb->temp_file = tf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3190
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3191 if (r->spdy_stream->in_closed
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3192 && ngx_create_temp_file(&tf->file, tf->path, tf->pool,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3193 tf->persistent, tf->clean, tf->access)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3194 != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3195 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3196 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3197 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3198
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3199 buf = ngx_calloc_buf(r->pool);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3200 if (buf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3201 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3202 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3203
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3204 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3205
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3206 if (rb->rest == 0) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3207 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3208 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3209
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3210 buf = ngx_create_temp_buf(r->pool, (size_t) rb->rest);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3211 if (buf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3212 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3213 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3214 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3215
5281
7542b72fe4b1 SPDY: fixed segfault with "client_body_in_file_only" enabled.
Valentin Bartenev <vbart@nginx.com>
parents: 5225
diff changeset
3216 rb->buf = buf;
7542b72fe4b1 SPDY: fixed segfault with "client_body_in_file_only" enabled.
Valentin Bartenev <vbart@nginx.com>
parents: 5225
diff changeset
3217
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3218 rb->bufs = ngx_alloc_chain_link(r->pool);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3219 if (rb->bufs == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3220 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3221 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3222
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3223 rb->bufs->buf = buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3224 rb->bufs->next = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3225
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3226 rb->rest = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3227
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3228 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3229 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3230
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3231
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3232 ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3233 ngx_http_spdy_read_request_body(ngx_http_request_t *r,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3234 ngx_http_client_body_handler_pt post_handler)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3235 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3236 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3237
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3238 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3239 "spdy read request body");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3240
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3241 stream = r->spdy_stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3242
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3243 switch (stream->skip_data) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3244
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3245 case NGX_SPDY_DATA_DISCARD:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3246 post_handler(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3247 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3248
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3249 case NGX_SPDY_DATA_ERROR:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3250 if (r->headers_in.content_length_n == -1) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3251 return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3252 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3253 return NGX_HTTP_BAD_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3254 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3255
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3256 case NGX_SPDY_DATA_INTERNAL_ERROR:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3257 return NGX_HTTP_INTERNAL_SERVER_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3258 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3259
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3260 if (!r->request_body && ngx_http_spdy_init_request_body(r) != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3261 stream->skip_data = NGX_SPDY_DATA_INTERNAL_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3262 return NGX_HTTP_INTERNAL_SERVER_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3263 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3264
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3265 if (stream->in_closed) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3266 post_handler(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3267 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3268 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3269
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3270 r->request_body->post_handler = post_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3271
5402
4d0c70541784 SPDY: fixed connection leak while waiting for request body.
Valentin Bartenev <vbart@nginx.com>
parents: 5325
diff changeset
3272 r->read_event_handler = ngx_http_test_reading;
4d0c70541784 SPDY: fixed connection leak while waiting for request body.
Valentin Bartenev <vbart@nginx.com>
parents: 5325
diff changeset
3273 r->write_event_handler = ngx_http_request_empty_handler;
4d0c70541784 SPDY: fixed connection leak while waiting for request body.
Valentin Bartenev <vbart@nginx.com>
parents: 5325
diff changeset
3274
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3275 return NGX_AGAIN;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3276 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3277
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3278
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3279 static ngx_int_t
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3280 ngx_http_spdy_terminate_stream(ngx_http_spdy_connection_t *sc,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3281 ngx_http_spdy_stream_t *stream, ngx_uint_t status)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3282 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3283 ngx_event_t *rev;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3284 ngx_connection_t *fc;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3285
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3286 if (ngx_http_spdy_send_rst_stream(sc, stream->id, status,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3287 NGX_SPDY_HIGHEST_PRIORITY)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3288 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3289 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3290 return NGX_ERROR;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3291 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3292
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3293 stream->out_closed = 1;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3294
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3295 fc = stream->request->connection;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3296 fc->error = 1;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3297
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3298 rev = fc->read;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3299 rev->handler(rev);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3300
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3301 return NGX_OK;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3302 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3303
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3304
5403
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3305 static void
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3306 ngx_http_spdy_close_stream_handler(ngx_event_t *ev)
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3307 {
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3308 ngx_connection_t *fc;
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3309 ngx_http_request_t *r;
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3310
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3311 fc = ev->data;
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3312 r = fc->data;
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3313
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3314 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3315 "spdy close stream handler");
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3316
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3317 ngx_http_spdy_close_stream(r->spdy_stream, 0);
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3318 }
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3319
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3320
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3321 void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3322 ngx_http_spdy_close_stream(ngx_http_spdy_stream_t *stream, ngx_int_t rc)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3323 {
5923
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3324 int tcp_nodelay;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3325 ngx_event_t *ev;
5923
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3326 ngx_connection_t *c, *fc;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3327 ngx_http_core_loc_conf_t *clcf;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3328 ngx_http_spdy_stream_t **index, *s;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3329 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3330 ngx_http_spdy_connection_t *sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3331
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3332 sc = stream->connection;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3333
5510
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3334 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3335 "spdy close stream %ui, queued %ui, processing %ui",
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3336 stream->id, stream->queued, sc->processing);
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3337
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3338 fc = stream->request->connection;
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3339
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3340 if (stream->queued) {
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3341 fc->write->handler = ngx_http_spdy_close_stream_handler;
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3342 return;
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3343 }
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3344
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3345 if (!stream->out_closed) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3346 if (ngx_http_spdy_send_rst_stream(sc, stream->id,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3347 NGX_SPDY_INTERNAL_ERROR,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3348 stream->priority)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3349 != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3350 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3351 sc->connection->error = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3352 }
5923
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3353
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3354 } else {
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3355 c = sc->connection;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3356
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3357 if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3358 if (ngx_tcp_push(c->fd) == -1) {
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3359 ngx_connection_error(c, ngx_socket_errno,
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3360 ngx_tcp_push_n " failed");
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3361 c->error = 1;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3362 tcp_nodelay = 0;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3363
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3364 } else {
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3365 c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3366 tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3367 }
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3368
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3369 } else {
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3370 tcp_nodelay = 1;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3371 }
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3372
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3373 clcf = ngx_http_get_module_loc_conf(stream->request,
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3374 ngx_http_core_module);
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3375
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3376 if (tcp_nodelay
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3377 && clcf->tcp_nodelay
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3378 && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3379 {
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3380 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3381
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3382 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3383 (const void *) &tcp_nodelay, sizeof(int))
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3384 == -1)
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3385 {
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3386 #if (NGX_SOLARIS)
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3387 /* Solaris returns EINVAL if a socket has been shut down */
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3388 c->log_error = NGX_ERROR_IGNORE_EINVAL;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3389 #endif
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3390
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3391 ngx_connection_error(c, ngx_socket_errno,
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3392 "setsockopt(TCP_NODELAY) failed");
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3393
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3394 c->log_error = NGX_ERROR_INFO;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3395 c->error = 1;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3396
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3397 } else {
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3398 c->tcp_nodelay = NGX_TCP_NODELAY_SET;
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3399 }
2c10db908b8c SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5904
diff changeset
3400 }
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3401 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3402
5524
03c198bb2acf SPDY: fixed possible segfault.
Valentin Bartenev <vbart@nginx.com>
parents: 5520
diff changeset
3403 if (sc->stream == stream) {
03c198bb2acf SPDY: fixed possible segfault.
Valentin Bartenev <vbart@nginx.com>
parents: 5520
diff changeset
3404 sc->stream = NULL;
03c198bb2acf SPDY: fixed possible segfault.
Valentin Bartenev <vbart@nginx.com>
parents: 5520
diff changeset
3405 }
03c198bb2acf SPDY: fixed possible segfault.
Valentin Bartenev <vbart@nginx.com>
parents: 5520
diff changeset
3406
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3407 sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3408 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3409
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3410 index = sc->streams_index + ngx_http_spdy_stream_index(sscf, stream->id);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3411
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3412 for ( ;; ) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3413 s = *index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3414
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3415 if (s == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3416 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3417 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3418
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3419 if (s == stream) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3420 *index = s->index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3421 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3422 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3423
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3424 index = &s->index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3425 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3426
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3427 ngx_http_free_request(stream->request, rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3428
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3429 ev = fc->read;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3430
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3431 if (ev->active || ev->disabled) {
5325
abf7813b927e SPDY: alert about activated fake events instead of deleting them.
Valentin Bartenev <vbart@nginx.com>
parents: 5324
diff changeset
3432 ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3433 "fake read event was activated");
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3434 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3435
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3436 if (ev->timer_set) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3437 ngx_del_timer(ev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3438 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3439
5821
3f5f0ab59b35 Events: processing of posted events changed from LIFO to FIFO.
Valentin Bartenev <vbart@nginx.com>
parents: 5762
diff changeset
3440 if (ev->posted) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3441 ngx_delete_posted_event(ev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3442 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3443
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3444 ev = fc->write;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3445
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3446 if (ev->active || ev->disabled) {
5325
abf7813b927e SPDY: alert about activated fake events instead of deleting them.
Valentin Bartenev <vbart@nginx.com>
parents: 5324
diff changeset
3447 ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
5693
701d6e17e42c SPDY: improved logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5692
diff changeset
3448 "fake write event was activated");
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3449 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3450
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3451 if (ev->timer_set) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3452 ngx_del_timer(ev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3453 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3454
5821
3f5f0ab59b35 Events: processing of posted events changed from LIFO to FIFO.
Valentin Bartenev <vbart@nginx.com>
parents: 5762
diff changeset
3455 if (ev->posted) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3456 ngx_delete_posted_event(ev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3457 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3458
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3459 fc->data = sc->free_fake_connections;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3460 sc->free_fake_connections = fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3461
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3462 sc->processing--;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3463
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3464 if (sc->processing || sc->blocked) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3465 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3466 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3467
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3468 ev = sc->connection->read;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3469
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3470 ev->handler = ngx_http_spdy_handle_connection_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3471 ngx_post_event(ev, &ngx_posted_events);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3472 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3473
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3474
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3475 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3476 ngx_http_spdy_handle_connection_handler(ngx_event_t *rev)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3477 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3478 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3479
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3480 rev->handler = ngx_http_spdy_read_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3481
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3482 if (rev->ready) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3483 ngx_http_spdy_read_handler(rev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3484 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3485 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3486
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3487 c = rev->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3488
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3489 ngx_http_spdy_handle_connection(c->data);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3490 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3491
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3492
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3493 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3494 ngx_http_spdy_keepalive_handler(ngx_event_t *rev)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3495 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3496 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3497 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3498 ngx_http_spdy_connection_t *sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3499
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3500 c = rev->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3501
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3502 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "spdy keepalive handler");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3503
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3504 if (rev->timedout || c->close) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3505 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3506 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3507 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3508
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3509 #if (NGX_HAVE_KQUEUE)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3510
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3511 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3512 if (rev->pending_eof) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3513 c->log->handler = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3514 ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3515 "kevent() reported that client %V closed "
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3516 "keepalive connection", &c->addr_text);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3517 #if (NGX_HTTP_SSL)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3518 if (c->ssl) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3519 c->ssl->no_send_shutdown = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3520 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3521 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3522 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3523 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3524 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3525 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3526
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3527 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3528
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3529 c->destroyed = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3530 c->idle = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3531 ngx_reusable_connection(c, 0);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3532
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3533 sc = c->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3534
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3535 sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3536 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3537
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3538 sc->pool = ngx_create_pool(sscf->pool_size, sc->connection->log);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3539 if (sc->pool == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3540 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3541 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3542 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3543
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3544 sc->streams_index = ngx_pcalloc(sc->pool,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3545 ngx_http_spdy_streams_index_size(sscf)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3546 * sizeof(ngx_http_spdy_stream_t *));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3547 if (sc->streams_index == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3548 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3549 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3550 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3551
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3552 c->write->handler = ngx_http_spdy_write_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3553
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3554 rev->handler = ngx_http_spdy_read_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3555 ngx_http_spdy_read_handler(rev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3556 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3557
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3558
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3559 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3560 ngx_http_spdy_finalize_connection(ngx_http_spdy_connection_t *sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3561 ngx_int_t rc)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3562 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3563 ngx_uint_t i, size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3564 ngx_event_t *ev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3565 ngx_connection_t *c, *fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3566 ngx_http_request_t *r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3567 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3568 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3569
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3570 c = sc->connection;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3571
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3572 if (!sc->processing) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3573 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3574 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3575 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3576
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3577 c->error = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3578 c->read->handler = ngx_http_empty_handler;
5404
db85dacfa013 SPDY: set empty write handler during connection finalization.
Valentin Bartenev <vbart@nginx.com>
parents: 5403
diff changeset
3579 c->write->handler = ngx_http_empty_handler;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3580
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3581 sc->last_out = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3582
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3583 sc->blocked = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3584
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3585 sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3586 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3587
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3588 size = ngx_http_spdy_streams_index_size(sscf);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3589
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3590 for (i = 0; i < size; i++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3591 stream = sc->streams_index[i];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3592
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3593 while (stream) {
5493
916cb6d28f6a SPDY: fixed possible request hang.
Valentin Bartenev <vbart@nginx.com>
parents: 5465
diff changeset
3594 stream->handled = 0;
916cb6d28f6a SPDY: fixed possible request hang.
Valentin Bartenev <vbart@nginx.com>
parents: 5465
diff changeset
3595
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3596 r = stream->request;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3597 fc = r->connection;
5493
916cb6d28f6a SPDY: fixed possible request hang.
Valentin Bartenev <vbart@nginx.com>
parents: 5465
diff changeset
3598
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3599 fc->error = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3600
5508
9053fdcea4b7 SPDY: better name for queued frames counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5507
diff changeset
3601 if (stream->queued) {
9053fdcea4b7 SPDY: better name for queued frames counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5507
diff changeset
3602 stream->queued = 0;
5465
a279d2a33dbf SPDY: drop the "delayed" flag when finalizing connection.
Valentin Bartenev <vbart@nginx.com>
parents: 5404
diff changeset
3603
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3604 ev = fc->write;
5465
a279d2a33dbf SPDY: drop the "delayed" flag when finalizing connection.
Valentin Bartenev <vbart@nginx.com>
parents: 5404
diff changeset
3605 ev->delayed = 0;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3606
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3607 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3608 ev = fc->read;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3609 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3610
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3611 stream = stream->index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3612
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3613 ev->eof = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3614 ev->handler(ev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3615 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3616 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3617
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3618 sc->blocked = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3619
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3620 if (sc->processing) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3621 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3622 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3623
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3624 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3625 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3626
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3627
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3628 static ngx_int_t
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3629 ngx_http_spdy_adjust_windows(ngx_http_spdy_connection_t *sc, ssize_t delta)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3630 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3631 ngx_uint_t i, size;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3632 ngx_event_t *wev;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3633 ngx_http_spdy_stream_t *stream, *sn;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3634 ngx_http_spdy_srv_conf_t *sscf;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3635
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3636 sscf = ngx_http_get_module_srv_conf(sc->http_connection->conf_ctx,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3637 ngx_http_spdy_module);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3638
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3639 size = ngx_http_spdy_streams_index_size(sscf);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3640
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3641 for (i = 0; i < size; i++) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3642
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3643 for (stream = sc->streams_index[i]; stream; stream = sn) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3644 sn = stream->index;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3645
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3646 if (delta > 0
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3647 && stream->send_window
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3648 > (ssize_t) (NGX_SPDY_MAX_WINDOW - delta))
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3649 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3650 if (ngx_http_spdy_terminate_stream(sc, stream,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3651 NGX_SPDY_FLOW_CONTROL_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3652 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3653 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3654 return NGX_ERROR;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3655 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3656
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3657 continue;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3658 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3659
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3660 stream->send_window += delta;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3661
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3662 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3663 "spdy:%ui adjust window:%z",
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3664 stream->id, stream->send_window);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3665
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3666 if (stream->send_window > 0 && stream->exhausted) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3667 stream->exhausted = 0;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3668
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3669 wev = stream->request->connection->write;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3670
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3671 if (!wev->timer_set) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3672 wev->delayed = 0;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3673 wev->handler(wev);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3674 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3675 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3676 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3677 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3678
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3679 return NGX_OK;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3680 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3681
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3682
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3683 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3684 ngx_http_spdy_pool_cleanup(void *data)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3685 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3686 ngx_http_spdy_connection_t *sc = data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3687
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3688 if (sc->pool) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3689 ngx_destroy_pool(sc->pool);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3690 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3691 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3692
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3693
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3694 static void *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3695 ngx_http_spdy_zalloc(void *opaque, u_int items, u_int size)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3696 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3697 ngx_http_spdy_connection_t *sc = opaque;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3698
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3699 return ngx_palloc(sc->connection->pool, items * size);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3700 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3701
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3702
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3703 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3704 ngx_http_spdy_zfree(void *opaque, void *address)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3705 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3706 #if 0
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3707 ngx_http_spdy_connection_t *sc = opaque;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3708
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3709 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3710 "spdy zfree: %p", address);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3711 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3712 }