annotate src/http/ngx_http_spdy.c @ 6078:7ea6f5140ed9 stable-1.6

SPDY: push pending data while closing a stream as with keepalive. This helps to avoid delays in sending the last chunk of data because of bad interaction between Nagle's algorithm on nginx side and delayed ACK on the client side. Delays could also be caused by TCP_CORK/TCP_NOPUSH if SPDY was working without SSL and sendfile() was used.
author Valentin Bartenev <vbart@nginx.com>
date Fri, 21 Nov 2014 22:51:49 +0300
parents b6240baead00
children
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_error(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);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
108 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
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);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
128 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
129 ngx_http_spdy_connection_t *sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
130 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
131 ngx_http_spdy_connection_t *sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
132
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
133 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
134 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
135 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
136 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
137 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
138 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
139 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
140 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
141 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
142 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
143 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
144
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
145 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
146 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
147 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
148 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
149 #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
150 #define ngx_http_spdy_stream_index(sscf, sid) \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
151 ((sid >> 1) & sscf->streams_index_mask)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
152
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
153 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
154 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
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_handle_request_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_parse_method(ngx_http_request_t *r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
158 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
159 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
160 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
161 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
162
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
163 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
164 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
165 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
166
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
167 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
168 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
169
5403
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
170 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
171
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
172 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
173 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
174 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
175 ngx_int_t rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
176
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
177 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
178 ssize_t delta);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
179
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
180 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
181
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
182 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
183 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
184
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
185
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
186 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
187 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
188 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
189 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
190 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
191 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
192 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
193 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
194 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
195 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
196 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
197 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
198 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
199 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
200 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
201 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
202 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
203 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
204 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
205 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
206 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
207 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
208 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
209 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
210 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
211 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
212 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
213 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
214 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
215 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
216 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
217 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
218 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
219 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
220 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
221 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
222 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
223 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
224 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
225 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
226 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
227 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
228 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
229 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
230 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
231 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
232 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
233 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
234 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
235 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
236 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
237 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
238 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
239 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
240 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
241 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
242 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
243 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
244 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
245 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
246 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
247 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
248 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
249 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
250 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
251 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
252 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
253 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
254 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
255 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
256 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
257 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
258 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
259 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
260 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
261 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
262 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
263 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
264 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
265 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
266 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
267 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
268 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
269 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
270 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
271 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
272 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
273 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
274 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
275 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
276 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
277 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
278 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
279 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
280 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
281 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
282 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
283 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
284 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
285 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
286 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
287 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
288 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
289 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
290 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
291 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
292 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
293 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
294 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
295 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
296 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
297 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
298 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
299 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
300 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
301 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
302 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
303 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
304 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
305 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
306 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
307 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
308 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
309 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
310 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
311 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
312 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
313 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
314 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
315 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
316 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
317 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
318 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
319 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
320 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
321 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
322 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
323 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
324 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
325 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
326 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
327 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
328 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
329 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
330 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
331 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
332 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
333 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
334 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
335 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
336 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
337 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
338 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
339 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
340 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
341 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
342 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
343 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
344 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
345 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
346 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
347 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
348 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
349 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
350 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
351 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
352 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
353 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
354 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
355 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
356 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
357 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
358 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
359 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
360 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
361 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
362 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
363 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
364 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
365 };
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
366
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
367
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
368 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
369 { 0, 6, "method", ngx_http_spdy_parse_method },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
370 { 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
371 { 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
372 { 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
373 { 0, 7, "version", ngx_http_spdy_parse_version },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
374 };
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
375
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
376 #define NGX_SPDY_REQUEST_HEADERS \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
377 (sizeof(ngx_http_spdy_request_headers) \
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
378 / sizeof(ngx_http_spdy_request_header_t))
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
379
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
380
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
381 void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
382 ngx_http_spdy_init(ngx_event_t *rev)
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 int rc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
385 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
386 ngx_pool_cleanup_t *cln;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
387 ngx_http_connection_t *hc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
388 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
389 ngx_http_spdy_main_conf_t *smcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
390 ngx_http_spdy_connection_t *sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
391
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
392 c = rev->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
393 hc = c->data;
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 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
396 "init spdy request");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
397
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
398 c->log->action = "processing SPDY";
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 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
401
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
402 if (smcf->recv_buffer == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
403 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
404 if (smcf->recv_buffer == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
405 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
406 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
407 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
408 }
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 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
411 if (sc == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
412 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
413 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
414 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
415
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
416 sc->connection = c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
417 sc->http_connection = hc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
418
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
419 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
420 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
421
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
422 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
423
5526
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
424 sc->handler = ngx_http_spdy_state_head;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
425
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
426 if (hc->proxy_protocol) {
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
427 c->log->action = "reading PROXY protocol";
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
428 sc->handler = ngx_http_spdy_proxy_protocol;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
429 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
430
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
431 sc->zstream_in.zalloc = ngx_http_spdy_zalloc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
432 sc->zstream_in.zfree = ngx_http_spdy_zfree;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
433 sc->zstream_in.opaque = sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
434
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
435 rc = inflateInit(&sc->zstream_in);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
436 if (rc != Z_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
437 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
438 "inflateInit() failed: %d", rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
439 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
440 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
441 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
442
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
443 sc->zstream_out.zalloc = ngx_http_spdy_zalloc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
444 sc->zstream_out.zfree = ngx_http_spdy_zfree;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
445 sc->zstream_out.opaque = sc;
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 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
448
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
449 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
450 Z_DEFLATED, 11, 4, Z_DEFAULT_STRATEGY);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
451
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
452 if (rc != Z_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
453 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
454 "deflateInit2() failed: %d", rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
455 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
456 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
457 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
458
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
459 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
460 sizeof(ngx_http_spdy_dict));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
461 if (rc != Z_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
462 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
463 "deflateSetDictionary() failed: %d", rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
464 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
465 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
466 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
467
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
468 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
469 if (sc->pool == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
470 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
471 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
472 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
473
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
474 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
475 if (cln == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
476 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
477 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
478 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
479
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
480 cln->handler = ngx_http_spdy_pool_cleanup;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
481 cln->data = sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
482
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
483 sc->streams_index = ngx_pcalloc(sc->pool,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
484 ngx_http_spdy_streams_index_size(sscf)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
485 * sizeof(ngx_http_spdy_stream_t *));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
486 if (sc->streams_index == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
487 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
488 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
489 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
490
5526
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
491 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
492 ngx_http_close_connection(c);
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
493 return;
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
494 }
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
495
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
496 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
497 - sc->recv_window)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
498 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
499 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
500 ngx_http_close_connection(c);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
501 return;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
502 }
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 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
505
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
506 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
507 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
508
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
509 c->data = sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
510
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
511 rev->handler = ngx_http_spdy_read_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
512 c->write->handler = ngx_http_spdy_write_handler;
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 ngx_http_spdy_read_handler(rev);
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
517
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
518 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
519 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
520 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
521 u_char *p, *end;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
522 size_t available;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
523 ssize_t n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
524 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
525 ngx_http_spdy_main_conf_t *smcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
526 ngx_http_spdy_connection_t *sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
527
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
528 c = rev->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
529 sc = c->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
530
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
531 if (rev->timedout) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
532 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
533 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
534 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
535 }
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 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
538
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
539 sc->blocked = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
540
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
541 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
542 ngx_http_spdy_module);
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 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
545
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
546 do {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
547 p = smcf->recv_buffer;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
548
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
549 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
550 end = p + sc->buffer_used;
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 n = c->recv(c, end, available);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
553
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
554 if (n == NGX_AGAIN) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
555 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
556 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
557
5509
877a7bd72070 SPDY: better name for flag that indicates incomplete frame state.
Valentin Bartenev <vbart@nginx.com>
parents: 5508
diff changeset
558 if (n == 0 && (sc->incomplete || sc->processing)) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
559 ngx_log_error(NGX_LOG_INFO, c->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
560 "client closed prematurely connection");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
561 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
562
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
563 if (n == 0 || n == NGX_ERROR) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
564 ngx_http_spdy_finalize_connection(sc,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
565 NGX_HTTP_CLIENT_CLOSED_REQUEST);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
566 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
567 }
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 end += n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
570
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
571 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
572 sc->incomplete = 0;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
573
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
574 do {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
575 p = sc->handler(sc, p, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
576
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
577 if (p == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
578 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
579 }
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 (p != end);
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 } while (rev->ready);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
584
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
585 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
586 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
587 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
588 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
589
5520
a336cbc3dd44 SPDY: send output queue after processing of read event.
Valentin Bartenev <vbart@nginx.com>
parents: 5519
diff changeset
590 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
591 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
592 return;
a336cbc3dd44 SPDY: send output queue after processing of read event.
Valentin Bartenev <vbart@nginx.com>
parents: 5519
diff changeset
593 }
a336cbc3dd44 SPDY: send output queue after processing of read event.
Valentin Bartenev <vbart@nginx.com>
parents: 5519
diff changeset
594
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
595 sc->blocked = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
596
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
597 if (sc->processing) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
598 if (rev->timer_set) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
599 ngx_del_timer(rev);
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 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
602 }
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 ngx_http_spdy_handle_connection(sc);
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
607
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
608 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
609 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
610 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
611 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
612 ngx_queue_t *q;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
613 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
614 ngx_http_spdy_stream_t *stream;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
615 ngx_http_spdy_connection_t *sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
616
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
617 c = wev->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
618 sc = c->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
619
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
620 if (wev->timedout) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
621 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
622 "spdy write event timed out");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
623 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
624 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
625 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
626
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
627 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
628
5493
916cb6d28f6a SPDY: fixed possible request hang.
Valentin Bartenev <vbart@nginx.com>
parents: 5465
diff changeset
629 sc->blocked = 1;
5121
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 rc = ngx_http_spdy_send_output_queue(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
632
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
633 if (rc == NGX_ERROR) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
634 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
635 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
636 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
637
5530
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
638 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
639 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
640
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
641 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
642
827e53c136b0 SPDY: use ngx_queue_t to queue streams for post processing.
Valentin Bartenev <vbart@nginx.com>
parents: 5529
diff changeset
643 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
644
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
645 stream->handled = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
646
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
647 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
648 "spdy run stream %ui", stream->id);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
649
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
650 wev = stream->request->connection->write;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
651 wev->handler(wev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
652 }
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 sc->blocked = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
655
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
656 if (rc == NGX_AGAIN) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
657 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
658 }
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 ngx_http_spdy_handle_connection(sc);
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
663
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
664 ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
665 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
666 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
667 ngx_chain_t *cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
668 ngx_event_t *wev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
669 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
670 ngx_http_core_loc_conf_t *clcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
671 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
672
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
673 c = sc->connection;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
674
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
675 if (c->error) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
676 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
677 }
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 wev = c->write;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
680
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
681 if (!wev->ready) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
682 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
683 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
684
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
685 cl = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
686 out = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
687
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
688 for (frame = sc->last_out; frame; frame = fn) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
689 frame->last->next = cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
690 cl = frame->first;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
691
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
692 fn = frame->next;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
693 frame->next = out;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
694 out = frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
695
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
696 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
697 "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
698 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
699 out->blocked, out->length);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
700 }
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 cl = c->send_chain(c, cl, 0);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
703
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
704 if (cl == NGX_CHAIN_ERROR) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
705 c->error = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
706
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
707 if (!sc->blocked) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
708 ngx_post_event(wev, &ngx_posted_events);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
709 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
710
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
711 return NGX_ERROR;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
714 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
715 ngx_http_core_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
716
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
717 if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
718 return NGX_ERROR; /* FIXME */
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 if (cl) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
722 ngx_add_timer(wev, clcf->send_timeout);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
723
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
724 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
725 if (wev->timer_set) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
726 ngx_del_timer(wev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
727 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
728 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
729
5528
d5de6c25b759 SPDY: use frame->next pointer to chain free frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5527
diff changeset
730 for ( /* void */ ; out; out = fn) {
d5de6c25b759 SPDY: use frame->next pointer to chain free frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5527
diff changeset
731 fn = out->next;
d5de6c25b759 SPDY: use frame->next pointer to chain free frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5527
diff changeset
732
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
733 if (out->handler(sc, out) != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
734 out->blocked = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
735 out->priority = NGX_SPDY_HIGHEST_PRIORITY;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
736 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
737 }
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 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
740 "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
741 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
742 out->blocked, out->length);
5121
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 frame = NULL;
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 for ( /* void */ ; out; out = fn) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
748 fn = out->next;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
749 out->next = frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
750 frame = out;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
751 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
752
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
753 sc->last_out = frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
754
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
755 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
756 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
757
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 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
760 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
761 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
762 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
763 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
764
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
765 if (sc->last_out || sc->processing) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
766 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
767 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
768
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
769 c = sc->connection;
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 if (c->error) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
772 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
773 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
774 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
775
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
776 if (c->buffered) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
777 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
778 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
779
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
780 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
781 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
782 if (sc->incomplete) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
783 ngx_add_timer(c->read, sscf->recv_timeout);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
784 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
785 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
786
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
787 if (ngx_terminate || ngx_exiting) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
788 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
789 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
790 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
791
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
792 ngx_destroy_pool(sc->pool);
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 sc->pool = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
795 sc->free_ctl_frames = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
796 sc->free_fake_connections = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
797
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
798 #if (NGX_HTTP_SSL)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
799 if (c->ssl) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
800 ngx_ssl_free_buffer(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
801 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
802 #endif
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 c->destroyed = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
805 c->idle = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
806 ngx_reusable_connection(c, 1);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
807
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
808 c->write->handler = ngx_http_empty_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
809 c->read->handler = ngx_http_spdy_keepalive_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
810
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
811 if (c->write->timer_set) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
812 ngx_del_timer(c->write);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
813 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
814
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
815 ngx_add_timer(c->read, sscf->keepalive_timeout);
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
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 static u_char *
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
820 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
821 u_char *end)
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
822 {
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
823 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
824
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
825 if (pos == NULL) {
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
826 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
827 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
828
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
829 sc->connection->log->action = "processing SPDY";
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
830
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
831 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
832 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
833
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
834
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents: 5590
diff changeset
835 static u_char *
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
836 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
837 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
838 {
5643
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
839 uint32_t head, flen;
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
840 ngx_uint_t type;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
841
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
842 if (end - pos < NGX_SPDY_FRAME_HEADER_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
843 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
844 ngx_http_spdy_state_head);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
845 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
846
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
847 head = ngx_spdy_frame_parse_uint32(pos);
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 pos += sizeof(uint32_t);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
850
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
851 flen = ngx_spdy_frame_parse_uint32(pos);
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 sc->flags = ngx_spdy_frame_flags(flen);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
854 sc->length = ngx_spdy_frame_length(flen);
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 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
5507
a30bba3c72e8 SPDY: fixed format specifiers in logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5493
diff changeset
859 "spdy process frame head:%08XD f:%Xd l:%uz",
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
860 head, sc->flags, sc->length);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
861
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
862 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
863 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
864
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
865 switch (type) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
866
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
867 case NGX_SPDY_SYN_STREAM:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
868 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
869
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
870 case NGX_SPDY_SYN_REPLY:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
871 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
872
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
873 case NGX_SPDY_RST_STREAM:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
874 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
875
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
876 case NGX_SPDY_SETTINGS:
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
877 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
878
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
879 case NGX_SPDY_PING:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
880 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
881
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
882 case NGX_SPDY_GOAWAY:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
883 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
884
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
885 case NGX_SPDY_HEADERS:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
886 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
887
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
888 case NGX_SPDY_WINDOW_UPDATE:
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
889 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
890
5643
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
891 default:
436f3605195a SPDY: consistently handle control frames with unknown type.
Valentin Bartenev <vbart@nginx.com>
parents: 5642
diff changeset
892 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
893 "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
894 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
895 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
896 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
897
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
898 if (ngx_spdy_data_frame_check(head)) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
899 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
900 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
901 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
902
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
903
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
904 /* TODO version & type check */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
905 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
906 "spdy unknown frame");
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 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
909 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
910
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
911
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
912 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
913 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
914 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
915 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
916 ngx_uint_t sid, prio;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
917 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
918 ngx_http_spdy_srv_conf_t *sscf;
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 if (end - pos < NGX_SPDY_SYN_STREAM_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
921 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
922 ngx_http_spdy_state_syn_stream);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
923 }
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 if (sc->length <= NGX_SPDY_SYN_STREAM_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
926 /* TODO logging */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
927 return ngx_http_spdy_state_protocol_error(sc);
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
930 sc->length -= NGX_SPDY_SYN_STREAM_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
931
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
932 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
933 prio = pos[8] >> 5;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
934
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
935 pos += NGX_SPDY_SYN_STREAM_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
936
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
937 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
938 "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
939
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
940 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
941 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
942
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
943 if (sc->processing >= sscf->concurrent_streams) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
944
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
945 ngx_log_error(NGX_LOG_INFO, sc->connection->log, 0,
5652
b6240baead00 SPDY: fixed typo in log message.
Valentin Bartenev <vbart@nginx.com>
parents: 5650
diff changeset
946 "spdy concurrent streams exceeded %ui", sc->processing);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
947
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
948 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
949 prio)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
950 != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
951 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
952 return ngx_http_spdy_state_internal_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
953 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
954
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
955 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
956 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
957
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
958 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
959 if (stream == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
960 return ngx_http_spdy_state_internal_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
961 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
962
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
963 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
964
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
965 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
966 + NGX_SPDY_SYN_STREAM_SIZE
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
967 + sc->length;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
968
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
969 sc->stream = stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
970
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
971 sc->last_sid = sid;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
972
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
973 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
974 }
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
977 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
978 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
979 u_char *end)
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 int z;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
982 size_t size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
983 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
984 ngx_int_t rc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
985 ngx_uint_t complete;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
986 ngx_http_request_t *r;
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 size = end - pos;
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 if (size == 0) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
991 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
992 ngx_http_spdy_state_headers);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
993 }
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 if (size >= sc->length) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
996 size = sc->length;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
997 complete = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
998
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
999 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1000 complete = 0;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1003 r = sc->stream->request;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1004
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1005 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1006 "spdy process HEADERS %uz of %uz", size, sc->length);
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 buf = r->header_in;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1009
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1010 sc->zstream_in.next_in = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1011 sc->zstream_in.avail_in = size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1012 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
1013
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1014 /* 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
1015 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
1016
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1017 z = inflate(&sc->zstream_in, Z_NO_FLUSH);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1018
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1019 if (z == Z_NEED_DICT) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1020 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
1021 sizeof(ngx_http_spdy_dict));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1022 if (z != Z_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1023 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
1024 "spdy inflateSetDictionary() failed: %d", z);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1025 ngx_http_spdy_close_stream(sc->stream, 0);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1026 return ngx_http_spdy_state_protocol_error(sc);
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 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
1030 "spdy inflateSetDictionary(): %d", z);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1031
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1032 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
1033 : Z_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1034 }
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 if (z != Z_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1037 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
1038 "spdy inflate() failed: %d", z);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1039 ngx_http_spdy_close_stream(sc->stream, 0);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1040 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1041 }
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 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
1044 "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
1045 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
1046 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
1047 z);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1048
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1049 sc->length -= sc->zstream_in.next_in - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1050 pos = sc->zstream_in.next_in;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1051
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1052 buf->last = sc->zstream_in.next_out;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1053
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1054 if (r->headers_in.headers.part.elts == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1055
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1056 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
1057
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1058 if (complete) {
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1059 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1060 "client sent SYN_STREAM frame "
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1061 "with invalid HEADERS block");
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1062 ngx_http_spdy_close_stream(sc->stream, NGX_HTTP_BAD_REQUEST);
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1063 return ngx_http_spdy_state_protocol_error(sc);
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1064 }
372cc6e532a6 SPDY: detect premature end of frame while start parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5618
diff changeset
1065
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1066 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
1067 ngx_http_spdy_state_headers);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1068 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1069
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1070 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
1071
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1072 buf->pos += NGX_SPDY_NV_NUM_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1073
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1074 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1075 "spdy HEADERS block consists of %ui entries",
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1076 sc->entries);
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1077
5589
a9116d9b63f9 SPDY: constant number of preallocated structures for headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5574
diff changeset
1078 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
1079 sizeof(ngx_table_elt_t))
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1080 != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1081 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1082 ngx_http_spdy_close_stream(sc->stream,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1083 NGX_HTTP_INTERNAL_SERVER_ERROR);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1084 return ngx_http_spdy_state_headers_error(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1085 }
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 (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
1088 sizeof(ngx_table_elt_t *))
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1089 != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1090 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1091 ngx_http_spdy_close_stream(sc->stream,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1092 NGX_HTTP_INTERNAL_SERVER_ERROR);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1093 return ngx_http_spdy_state_headers_error(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1094 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1095 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1096
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1097 while (sc->entries) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1098
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1099 rc = ngx_http_spdy_parse_header(r);
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 switch (rc) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1102
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1103 case NGX_DONE:
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1104 sc->entries--;
5121
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 case NGX_OK:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1107 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1108
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1109 case NGX_AGAIN:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1110
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1111 if (sc->zstream_in.avail_in) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1112
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1113 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
1114
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1115 if (rc == NGX_DECLINED) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1116 /* TODO logging */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1117 ngx_http_finalize_request(r,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1118 NGX_HTTP_REQUEST_HEADER_TOO_LARGE);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1119 return ngx_http_spdy_state_headers_error(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1120 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1122 if (rc != NGX_OK) {
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);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1125 return ngx_http_spdy_state_headers_error(sc, pos, end);
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
5323
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1128 /* 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
1129 *buf->pos = '\0';
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1130
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1131 buf = r->header_in;
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 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
1134
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1135 /* one byte is reserved for null-termination */
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1136 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
1137
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1138 z = inflate(&sc->zstream_in, Z_NO_FLUSH);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1139
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1140 if (z != Z_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1141 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
1142 "spdy inflate() failed: %d", z);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1143 ngx_http_spdy_close_stream(sc->stream, 0);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1144 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1145 }
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 sc->length -= sc->zstream_in.next_in - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1148 pos = sc->zstream_in.next_in;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1149
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1150 buf->last = sc->zstream_in.next_out;
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 continue;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1153 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1154
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1155 if (complete) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1156 /* TODO: improve error message */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1157 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
1158 "spdy again while last chunk");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1159 ngx_http_spdy_close_stream(sc->stream, 0);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1160 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1161 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1162
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1163 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
1164 ngx_http_spdy_state_headers);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1165
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1166 case NGX_HTTP_PARSE_INVALID_REQUEST:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1167
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1168 /* TODO: improve error message */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1169 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
1170 "client sent invalid header line");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1171
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1172 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
1173
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1174 return ngx_http_spdy_state_headers_error(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1175
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1176 default: /* NGX_HTTP_PARSE_INVALID_HEADER */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1177
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1178 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
1179 "client sent invalid HEADERS spdy frame");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1180 ngx_http_spdy_close_stream(sc->stream, NGX_HTTP_BAD_REQUEST);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1181 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1182 }
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 /* a header line has been parsed successfully */
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 rc = ngx_http_spdy_handle_request_header(r);
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 if (rc != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1189 if (rc == NGX_HTTP_PARSE_INVALID_HEADER) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1190 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
1191 "client sent invalid HEADERS spdy frame");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1192 ngx_http_spdy_close_stream(sc->stream, NGX_HTTP_BAD_REQUEST);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1193 return ngx_http_spdy_state_protocol_error(sc);
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 if (rc == NGX_HTTP_PARSE_INVALID_REQUEST) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1197 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
1198 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1199
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1200 return ngx_http_spdy_state_headers_error(sc, pos, end);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1201 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1202 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1203
5626
2411d4b5be2c SPDY: better detect if headers block has wrong entries count.
Valentin Bartenev <vbart@nginx.com>
parents: 5625
diff changeset
1204 if (buf->pos != buf->last || sc->zstream_in.avail_in) {
2411d4b5be2c SPDY: better detect if headers block has wrong entries count.
Valentin Bartenev <vbart@nginx.com>
parents: 5625
diff changeset
1205 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
2411d4b5be2c SPDY: better detect if headers block has wrong entries count.
Valentin Bartenev <vbart@nginx.com>
parents: 5625
diff changeset
1206 "client sent SYN_STREAM frame "
2411d4b5be2c SPDY: better detect if headers block has wrong entries count.
Valentin Bartenev <vbart@nginx.com>
parents: 5625
diff changeset
1207 "with invalid HEADERS block");
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1208 ngx_http_spdy_close_stream(sc->stream, NGX_HTTP_BAD_REQUEST);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1209 return ngx_http_spdy_state_protocol_error(sc);
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1212 if (!complete) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1213 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
1214 ngx_http_spdy_state_headers);
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
5323
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1217 /* 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
1218 *buf->pos = '\0';
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
1219
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1220 ngx_http_spdy_run_request(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1221
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1222 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
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1226 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1227 ngx_http_spdy_state_headers_error(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
1228 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1229 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1230 if (sc->connection->error) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1231 return ngx_http_spdy_state_internal_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1232 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1233
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1234 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
1235 }
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1238 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1239 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
1240 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1241 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1242 int n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1243 size_t size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1244 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
1245
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1246 if (sc->length == 0) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1247 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
1248 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1249
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1250 size = end - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1251
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1252 if (size == 0) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1253 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
1254 ngx_http_spdy_state_headers_skip);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1255 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1256
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1257 sc->zstream_in.next_in = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1258 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
1259
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1260 while (sc->zstream_in.avail_in) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1261 sc->zstream_in.next_out = buffer;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1262 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
1263
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1264 n = inflate(&sc->zstream_in, Z_NO_FLUSH);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1265
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1266 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
1267 "spdy inflate(): %d", n);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1268
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1269 if (n != Z_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1270 /* TODO: logging */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1271 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1272 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1273 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1274
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1275 pos = sc->zstream_in.next_in;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1276
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1277 if (size < sc->length) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1278 sc->length -= size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1279 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
1280 ngx_http_spdy_state_headers_skip);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1281 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1282
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1283 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
1284 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1285
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 static u_char *
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1288 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
1289 u_char *end)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1290 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1291 size_t delta;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1292 ngx_uint_t sid;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1293 ngx_event_t *wev;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1294 ngx_queue_t *q;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1295 ngx_http_spdy_stream_t *stream;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1296
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1297 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
1298 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
1299 ngx_http_spdy_state_window_update);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1300 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1301
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1302 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
1303 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
1304 "client sent WINDOW_UPDATE frame "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1305 "with incorrect length %uz", sc->length);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1306
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1307 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
1308 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1309
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1310 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
1311
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1312 pos += NGX_SPDY_SID_SIZE;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1313
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1314 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
1315
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1316 pos += NGX_SPDY_DELTA_SIZE;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1317
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1318 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
1319 "spdy WINDOW_UPDATE sid:%ui delta:%ui", sid, delta);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1320
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1321 if (sid) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1322 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
1323
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1324 if (stream == NULL) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1325 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
1326 "client sent WINDOW_UPDATE frame "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1327 "for unknown stream %ui", sid);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1328
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1329 if (ngx_http_spdy_send_rst_stream(sc, sid, NGX_SPDY_INVALID_STREAM,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1330 NGX_SPDY_LOWEST_PRIORITY)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1331 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1332 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1333 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
1334 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1335
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1336 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
1337 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1338
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1339 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
1340
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1341 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
1342 "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
1343 "received WINDOW_UPDATE frame with delta %uz "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1344 "that is not allowed for window %z",
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1345 sid, delta, stream->send_window);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1346
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1347 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
1348 NGX_SPDY_FLOW_CONTROL_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1349 == NGX_ERROR)
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 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
1352 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1353
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1354 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
1355 }
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 stream->send_window += delta;
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 if (stream->exhausted) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1360 stream->exhausted = 0;
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 wev = stream->request->connection->write;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1363
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1364 if (!wev->timer_set) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1365 wev->delayed = 0;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1366 wev->handler(wev);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1367 }
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
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1370 } else {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1371 sc->send_window += delta;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1372
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1373 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
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 connection flow control: "
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 "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1377 "that is not allowed for window %uz",
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1378 delta, sc->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 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
1381 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1382
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1383 while (!ngx_queue_empty(&sc->waiting)) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1384 q = ngx_queue_head(&sc->waiting);
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 ngx_queue_remove(q);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1387
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1388 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
1389
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1390 stream->handled = 0;
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 wev = stream->request->connection->write;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1393
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1394 if (!wev->timer_set) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1395 wev->delayed = 0;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1396 wev->handler(wev);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1397
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1398 if (sc->send_window == 0) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1399 break;
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 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1404
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1405 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
1406 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1407
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1408
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1409 static u_char *
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1410 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
1411 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1412 {
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1413 ngx_http_spdy_stream_t *stream;
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 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
1416 "spdy DATA frame");
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1417
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1418 if (sc->length > sc->recv_window) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1419 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
1420 "client violated connection flow control: length of "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1421 "received DATA frame %uz, while available window %uz",
5649
e1dcb983d6b3 SPDY: fixed arguments supplied for an error message.
Valentin Bartenev <vbart@nginx.com>
parents: 5643
diff changeset
1422 sc->length, sc->recv_window);
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1423
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1424 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
1425 }
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 sc->recv_window -= sc->length;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1428
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1429 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
1430
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1431 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
1432 NGX_SPDY_MAX_WINDOW
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1433 - sc->recv_window)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1434 == NGX_ERROR)
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 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
1437 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1438
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1439 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
1440 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1441
5650
363395795384 SPDY: moved a variable initialization near to its check.
Valentin Bartenev <vbart@nginx.com>
parents: 5649
diff changeset
1442 stream = sc->stream;
363395795384 SPDY: moved a variable initialization near to its check.
Valentin Bartenev <vbart@nginx.com>
parents: 5649
diff changeset
1443
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1444 if (stream == NULL) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1445 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
1446 }
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 if (sc->length > stream->recv_window) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1449 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
1450 "client violated flow control for stream %ui: length of "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1451 "received DATA frame %uz, while available window %uz",
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1452 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
1453
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1454 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
1455 NGX_SPDY_FLOW_CONTROL_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1456 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1457 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1458 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
1459 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1460
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1461 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
1462 }
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 stream->recv_window -= sc->length;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1465
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1466 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
1467
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1468 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
1469 NGX_SPDY_STREAM_WINDOW
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1470 - stream->recv_window)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1471 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1472 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1473 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
1474 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1475
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1476 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
1477 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1478
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1479 if (stream->in_closed) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1480 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
1481 "client sent DATA frame for half closed stream %ui",
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1482 stream->id);
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 (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
1485 NGX_SPDY_STREAM_ALREADY_CLOSED)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1486 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1487 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1488 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
1489 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1490
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1491 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
1492 }
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_read_data(sc, pos, end);
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
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1498 static u_char *
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1499 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
1500 u_char *end)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1501 {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1502 size_t size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1503 ssize_t n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1504 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1505 ngx_int_t rc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1506 ngx_temp_file_t *tf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1507 ngx_http_request_t *r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1508 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1509 ngx_http_request_body_t *rb;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1510 ngx_http_core_loc_conf_t *clcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1511
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1512 stream = sc->stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1513
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1514 if (stream == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1515 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
1516 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1517
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1518 if (stream->skip_data) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1519
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1520 if (sc->flags & NGX_SPDY_FLAG_FIN) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1521 stream->in_closed = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1522 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1523
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1524 /* TODO log and accounting */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1525 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
1526 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1527
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1528 size = end - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1529
5642
d2ac5cf4056d SPDY: refactored ngx_http_spdy_state_read_data().
Valentin Bartenev <vbart@nginx.com>
parents: 5641
diff changeset
1530 if (size > sc->length) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1531 size = sc->length;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1532 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1533
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1534 r = stream->request;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1535
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1536 if (r->request_body == NULL
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1537 && 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
1538 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1539 stream->skip_data = NGX_SPDY_DATA_INTERNAL_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1540 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
1541 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1542
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1543 rb = r->request_body;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1544 tf = rb->temp_file;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1545 buf = rb->buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1546
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1547 if (size) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1548 rb->rest += size;
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 (r->headers_in.content_length_n != -1
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1551 && r->headers_in.content_length_n < rb->rest)
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 /* TODO logging */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1554 stream->skip_data = NGX_SPDY_DATA_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1555 goto error;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1556
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1557 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1558 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
1559
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1560 if (clcf->client_max_body_size
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1561 && clcf->client_max_body_size < rb->rest)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1562 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1563 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1564 "client intended to send too large chunked "
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1565 "body: %O bytes",
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1566 rb->rest);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1567
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1568 stream->skip_data = NGX_SPDY_DATA_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1569 goto error;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1570 }
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
5627
d74889fbf06d SPDY: fixed the DATA frame length handling in case of some errors.
Valentin Bartenev <vbart@nginx.com>
parents: 5626
diff changeset
1573 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
1574
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1575 if (tf) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1576 buf->start = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1577 buf->pos = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1578
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1579 pos += size;
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 buf->end = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1582 buf->last = pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1583
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1584 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
1585
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1586 /* 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
1587
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1588 if (n == NGX_ERROR) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1589 stream->skip_data = NGX_SPDY_DATA_INTERNAL_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1590 goto error;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1591 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1592
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1593 tf->offset += n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1594
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1595 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1596 buf->last = ngx_cpymem(buf->last, pos, size);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1597 pos += size;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1600 r->request_length += size;
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
5642
d2ac5cf4056d SPDY: refactored ngx_http_spdy_state_read_data().
Valentin Bartenev <vbart@nginx.com>
parents: 5641
diff changeset
1603 if (sc->length) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1604 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
1605 ngx_http_spdy_state_read_data);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1606 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1607
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1608 if (sc->flags & NGX_SPDY_FLAG_FIN) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1609
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1610 stream->in_closed = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1611
5628
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1612 if (r->headers_in.content_length_n < 0) {
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1613 r->headers_in.content_length_n = rb->rest;
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1614
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1615 } 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
1616 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
1617 "client prematurely closed stream: "
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1618 "%O of %O bytes of request body received",
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1619 rb->rest, r->headers_in.content_length_n);
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1620
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1621 stream->skip_data = NGX_SPDY_DATA_ERROR;
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1622 goto error;
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1623 }
a24f88eff684 SPDY: detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5627
diff changeset
1624
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1625 if (tf) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1626 ngx_memzero(buf, sizeof(ngx_buf_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1627
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1628 buf->in_file = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1629 buf->file_last = tf->file.offset;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1630 buf->file = &tf->file;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1631
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1632 rb->buf = NULL;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1635 if (rb->post_handler) {
5402
4d0c70541784 SPDY: fixed connection leak while waiting for request body.
Valentin Bartenev <vbart@nginx.com>
parents: 5325
diff changeset
1636 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
1637 rb->post_handler(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1638 }
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 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
1642
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1643 error:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1644
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1645 if (rb->post_handler) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1646
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1647 if (stream->skip_data == NGX_SPDY_DATA_ERROR) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1648 rc = (r->headers_in.content_length_n == -1)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1649 ? NGX_HTTP_REQUEST_ENTITY_TOO_LARGE
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1650 : NGX_HTTP_BAD_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1651
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1652 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1653 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1654 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1655
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1656 ngx_http_finalize_request(r, rc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1657 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1658
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1659 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
1660 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1661
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1662
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1663 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1664 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
1665 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1666 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1667 ngx_uint_t sid, status;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1668 ngx_event_t *ev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1669 ngx_connection_t *fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1670 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1671
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1672 if (end - pos < NGX_SPDY_RST_STREAM_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1673 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
1674 ngx_http_spdy_state_rst_stream);
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1677 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
1678 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
1679 "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
1680 sc->length);
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1681
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1682 return ngx_http_spdy_state_protocol_error(sc);
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1685 sid = ngx_spdy_frame_parse_sid(pos);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1686
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1687 pos += NGX_SPDY_SID_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1688
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1689 status = ngx_spdy_frame_parse_uint32(pos);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1690
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1691 pos += sizeof(uint32_t);
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 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
1694 "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
1695
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1696 stream = ngx_http_spdy_get_stream_by_id(sc, sid);
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1697 if (stream == NULL) {
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1698 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, sc->connection->log, 0,
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1699 "unknown stream, probably it has been closed already");
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1700 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
1701 }
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1702
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1703 stream->in_closed = 1;
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1704 stream->out_closed = 1;
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1705
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1706 fc = stream->request->connection;
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1707 fc->error = 1;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1708
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1709 switch (status) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1710
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1711 case NGX_SPDY_CANCEL:
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1712 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
1713 "client canceled stream %ui", sid);
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1714 break;
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1715
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1716 case NGX_SPDY_INTERNAL_ERROR:
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1717 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
1718 "client terminated stream %ui because of internal error",
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1719 sid);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1720 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1721
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1722 default:
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1723 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
1724 "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
1725 sid, status);
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1726 break;
5121
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
5527
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1729 ev = fc->read;
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1730 ev->handler(ev);
f3f7b72ca6e9 SPDY: proper handling of all RST_STREAM statuses.
Valentin Bartenev <vbart@nginx.com>
parents: 5526
diff changeset
1731
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1732 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
1733 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1734
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1735
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1736 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1737 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
1738 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1739 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1740 u_char *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1741 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1742 ngx_http_spdy_out_frame_t *frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1743
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1744 if (end - pos < NGX_SPDY_PING_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1745 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
1746 ngx_http_spdy_state_ping);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1747 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1748
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1749 if (sc->length != NGX_SPDY_PING_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1750 /* TODO logging */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1751 return ngx_http_spdy_state_protocol_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1752 }
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 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
1755 "spdy PING frame");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1756
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1757 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
1758 NGX_SPDY_HIGHEST_PRIORITY);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1759 if (frame == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1760 return ngx_http_spdy_state_internal_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1761 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1762
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1763 buf = frame->first->buf;
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 p = buf->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1766
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1767 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
1768 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
1769
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1770 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
1771
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1772 buf->last = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1773
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1774 ngx_http_spdy_queue_frame(sc, frame);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1775
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1776 pos += NGX_SPDY_PING_SIZE;
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 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
1779 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1780
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1781
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1782 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1783 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
1784 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1785 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1786 size_t size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1787
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1788 size = end - pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1789
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1790 if (size < sc->length) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1791 sc->length -= size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1792 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
1793 ngx_http_spdy_state_skip);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1794 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1795
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1796 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
1797 }
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 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1801 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
1802 u_char *end)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1803 {
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1804 ngx_uint_t fid, val;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1805
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1806 if (sc->entries == 0) {
5121
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 if (end - pos < NGX_SPDY_SETTINGS_NUM_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1809 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
1810 ngx_http_spdy_state_settings);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1811 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1812
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1813 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
1814
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1815 pos += NGX_SPDY_SETTINGS_NUM_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1816 sc->length -= NGX_SPDY_SETTINGS_NUM_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1817
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1818 if (sc->length < sc->entries * NGX_SPDY_SETTINGS_PAIR_SIZE) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1819 /* TODO logging */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1820 return ngx_http_spdy_state_protocol_error(sc);
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1823 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
1824 "spdy SETTINGS frame consists of %ui entries",
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1825 sc->entries);
5121
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
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1828 while (sc->entries) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1829 if (end - pos < NGX_SPDY_SETTINGS_PAIR_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1830 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
1831 ngx_http_spdy_state_settings);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1832 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1833
5525
206c56e23a96 SPDY: better name for frame entries counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5524
diff changeset
1834 sc->entries--;
5526
2c6f82c0cec2 SPDY: removed state to check first SETTINGS frame.
Valentin Bartenev <vbart@nginx.com>
parents: 5525
diff changeset
1835 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
1836
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1837 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
1838
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1839 pos += NGX_SPDY_SETTINGS_FID_SIZE;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1840
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1841 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
1842
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1843 pos += NGX_SPDY_SETTINGS_VAL_SIZE;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1844
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1845 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
1846 "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
1847 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
1848
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1849 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
1850 continue;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1851 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1852
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1853 switch (ngx_spdy_frame_id(fid)) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1854
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1855 case NGX_SPDY_SETTINGS_INIT_WINDOW:
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1856
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1857 if (val > NGX_SPDY_MAX_WINDOW) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1858 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
1859 "client sent SETTINGS frame with "
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1860 "incorrect INIT_WINDOW value: %ui", val);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1861
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1862 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
1863 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1864
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1865 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
1866 != NGX_OK)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1867 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1868 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
1869 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1870
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1871 sc->init_window = val;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1872
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1873 continue;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1874 }
5121
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1877 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
1878 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1879
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1880
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1881 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1882 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
1883 u_char *end)
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 sc->handler = ngx_http_spdy_state_head;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1886 return pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1887 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1888
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1889
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1890 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1891 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
1892 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
1893 {
5616
b93db4e4ff77 SPDY: improved ngx_http_spdy_state_save() check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5606
diff changeset
1894 size_t size;
b93db4e4ff77 SPDY: improved ngx_http_spdy_state_save() check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5606
diff changeset
1895
b93db4e4ff77 SPDY: improved ngx_http_spdy_state_save() check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5606
diff changeset
1896 size = end - pos;
b93db4e4ff77 SPDY: improved ngx_http_spdy_state_save() check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5606
diff changeset
1897
b93db4e4ff77 SPDY: improved ngx_http_spdy_state_save() check.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5606
diff changeset
1898 if (size > NGX_SPDY_STATE_BUFFER_SIZE) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1899 ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1900 "spdy state buffer overflow: "
5618
c15350f4071c SPDY: improved ngx_http_spdy_state_save() again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5616
diff changeset
1901 "%uz bytes required", size);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1902 return ngx_http_spdy_state_internal_error(sc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1903 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1904
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1905 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
1906
5618
c15350f4071c SPDY: improved ngx_http_spdy_state_save() again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5616
diff changeset
1907 sc->buffer_used = size;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1908 sc->handler = handler;
5509
877a7bd72070 SPDY: better name for flag that indicates incomplete frame state.
Valentin Bartenev <vbart@nginx.com>
parents: 5508
diff changeset
1909 sc->incomplete = 1;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1910
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1911 return end;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1912 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1913
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1914
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1915 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1916 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
1917 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1918 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
1919 "spdy state protocol error");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1920
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1921 /* TODO */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1922 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
1923 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1924 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1925
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1926
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1927 static u_char *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1928 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
1929 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1930 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
1931 "spdy state internal error");
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 /* TODO */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1934 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
1935 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1936 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1937
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1938
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1939 static ngx_int_t
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1940 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
1941 ngx_uint_t delta)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1942 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1943 u_char *p;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1944 ngx_buf_t *buf;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1945 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
1946
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1947 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
1948 "spdy write WINDOW_UPDATE sid:%ui delta:%ui", sid, delta);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1949
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1950 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
1951 NGX_SPDY_HIGHEST_PRIORITY);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1952 if (frame == NULL) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1953 return NGX_ERROR;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1954 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1955
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1956 buf = frame->first->buf;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1957
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1958 p = buf->pos;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1959
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1960 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
1961 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
1962
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1963 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
1964 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
1965
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1966 buf->last = p;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1967
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1968 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
1969
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1970 return NGX_OK;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1971 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1972
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1973
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
1974 static ngx_int_t
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1975 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
1976 ngx_uint_t status, ngx_uint_t priority)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1977 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1978 u_char *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1979 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1980 ngx_http_spdy_out_frame_t *frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1981
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1982 if (sc->connection->error) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1983 return NGX_OK;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1986 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
1987 "spdy write RST_STREAM sid:%ui st:%ui", sid, status);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1988
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1989 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
1990 priority);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1991 if (frame == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1992 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1993 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1994
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1995 buf = frame->first->buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1996
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1997 p = buf->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1998
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
1999 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
2000 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
2001
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2002 p = ngx_spdy_frame_write_sid(p, sid);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2003 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
2004
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2005 buf->last = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2006
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2007 ngx_http_spdy_queue_frame(sc, frame);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2008
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2009 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2010 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2011
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2012
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2013 #if 0
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2014 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2015 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
2016 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2017 u_char *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2018 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2019 ngx_http_spdy_out_frame_t *frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2020
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2021 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
2022 "spdy create GOAWAY sid:%ui", sc->last_sid);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2023
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2024 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
2025 NGX_SPDY_HIGHEST_PRIORITY);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2026 if (frame == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2027 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2028 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2029
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2030 buf = frame->first->buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2031
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2032 p = buf->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2033
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2034 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
2035 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
2036
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2037 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
2038
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2039 buf->last = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2040
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2041 ngx_http_spdy_queue_frame(sc, frame);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2042
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2043 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2044 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2045 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2046
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2047
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2048 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2049 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
2050 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2051 u_char *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2052 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2053 ngx_chain_t *cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2054 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2055 ngx_http_spdy_out_frame_t *frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2056
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2057 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
2058 "spdy create SETTINGS frame");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2059
5519
22c249dac7c1 SPDY: the SETTINGS frame should be allocated from sc->pool.
Valentin Bartenev <vbart@nginx.com>
parents: 5518
diff changeset
2060 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
2061 if (frame == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2062 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2063 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2064
5519
22c249dac7c1 SPDY: the SETTINGS frame should be allocated from sc->pool.
Valentin Bartenev <vbart@nginx.com>
parents: 5518
diff changeset
2065 cl = ngx_alloc_chain_link(sc->pool);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2066 if (cl == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2067 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2068 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2069
5519
22c249dac7c1 SPDY: the SETTINGS frame should be allocated from sc->pool.
Valentin Bartenev <vbart@nginx.com>
parents: 5518
diff changeset
2070 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
2071 + NGX_SPDY_SETTINGS_NUM_SIZE
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2072 + 2 * NGX_SPDY_SETTINGS_PAIR_SIZE);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2073 if (buf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2074 return NGX_ERROR;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2077 buf->last_buf = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2078
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2079 cl->buf = buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2080 cl->next = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2081
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2082 frame->first = cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2083 frame->last = cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2084 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
2085 frame->stream = NULL;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2086 #if (NGX_DEBUG)
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2087 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
2088 + 2 * NGX_SPDY_SETTINGS_PAIR_SIZE;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2089 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2090 frame->priority = NGX_SPDY_HIGHEST_PRIORITY;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2091 frame->blocked = 0;
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 p = buf->pos;
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 = 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
2096 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
2097 NGX_SPDY_SETTINGS_NUM_SIZE
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2098 + 2 * NGX_SPDY_SETTINGS_PAIR_SIZE);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2099
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2100 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
2101
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2102 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
2103 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2104
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2105 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
2106 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
2107
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2108 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
2109 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
2110
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2111 buf->last = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2112
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2113 ngx_http_spdy_queue_frame(sc, frame);
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 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2116 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2117
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_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2120 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
2121 ngx_http_spdy_out_frame_t *frame)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2122 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2123 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2124
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2125 buf = frame->first->buf;
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 if (buf->pos != buf->last) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2128 return NGX_AGAIN;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2131 ngx_free_chain(sc->pool, frame->first);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2132
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2133 return NGX_OK;
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
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 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
2138 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
2139 ngx_uint_t priority)
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 ngx_chain_t *cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2142 ngx_http_spdy_out_frame_t *frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2143
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2144 frame = sc->free_ctl_frames;
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 if (frame) {
5528
d5de6c25b759 SPDY: use frame->next pointer to chain free frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5527
diff changeset
2147 sc->free_ctl_frames = frame->next;
5121
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 cl = frame->first;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2150 cl->buf->pos = cl->buf->start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2151
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2152 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2153 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
2154 if (frame == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2155 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2156 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2157
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2158 cl = ngx_alloc_chain_link(sc->pool);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2159 if (cl == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2160 return NULL;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2163 cl->buf = ngx_create_temp_buf(sc->pool,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2164 NGX_SPDY_CTL_FRAME_BUFFER_SIZE);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2165 if (cl->buf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2166 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2167 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2168
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2169 cl->buf->last_buf = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2170
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2171 frame->first = cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2172 frame->last = cl;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2173 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
2174 frame->stream = NULL;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2175 }
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 #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
2178 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
2179 ngx_log_error(NGX_LOG_ALERT, sc->pool->log, 0,
5529
e4adaa47af65 SPDY: store the length of frame instead of its whole size.
Valentin Bartenev <vbart@nginx.com>
parents: 5528
diff changeset
2180 "requested control frame is too big: %uz", length);
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2181 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2182 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2183
5529
e4adaa47af65 SPDY: store the length of frame instead of its whole size.
Valentin Bartenev <vbart@nginx.com>
parents: 5528
diff changeset
2184 frame->length = length;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2185 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2186
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2187 frame->priority = priority;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2188 frame->blocked = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2189
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2190 return frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2191 }
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2194 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2195 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
2196 ngx_http_spdy_out_frame_t *frame)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2197 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2198 ngx_buf_t *buf;
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 buf = frame->first->buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2201
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2202 if (buf->pos != buf->last) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2203 return NGX_AGAIN;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2204 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2205
5528
d5de6c25b759 SPDY: use frame->next pointer to chain free frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5527
diff changeset
2206 frame->next = sc->free_ctl_frames;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2207 sc->free_ctl_frames = frame;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2208
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2209 return NGX_OK;
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
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 static ngx_http_spdy_stream_t *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2214 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
2215 ngx_uint_t priority)
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_log_t *log;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2218 ngx_uint_t index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2219 ngx_event_t *rev, *wev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2220 ngx_connection_t *fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2221 ngx_http_log_ctx_t *ctx;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2222 ngx_http_request_t *r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2223 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2224 ngx_http_core_srv_conf_t *cscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2225 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2226
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2227 fc = sc->free_fake_connections;
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 if (fc) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2230 sc->free_fake_connections = fc->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2231
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2232 rev = fc->read;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2233 wev = fc->write;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2234 log = fc->log;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2235 ctx = log->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2236
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2237 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2238 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
2239 if (fc == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2240 return NULL;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2243 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
2244 if (rev == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2245 return NULL;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2248 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
2249 if (wev == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2250 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2251 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2252
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2253 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
2254 if (log == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2255 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2256 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2257
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2258 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
2259 if (ctx == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2260 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2261 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2262
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2263 ctx->connection = fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2264 ctx->request = 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 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
2268
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2269 log->data = ctx;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2270
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2271 ngx_memzero(rev, sizeof(ngx_event_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2272
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2273 rev->data = fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2274 rev->ready = 1;
5403
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
2275 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
2276 rev->log = log;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2277
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2278 ngx_memcpy(wev, rev, sizeof(ngx_event_t));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2279
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2280 wev->write = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2281
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2282 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
2283
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2284 fc->data = sc->http_connection;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2285 fc->read = rev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2286 fc->write = wev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2287 fc->sent = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2288 fc->log = log;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2289 fc->buffered = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2290 fc->sndlowat = 1;
5182
7a015bbda96f SPDY: set NGX_TCP_NODELAY_DISABLED for fake connections.
Valentin Bartenev <vbart@nginx.com>
parents: 5121
diff changeset
2291 fc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2292
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2293 r = ngx_http_create_request(fc);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2294 if (r == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2295 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2296 }
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 r->valid_location = 1;
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 fc->data = r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2301 sc->connection->requests++;
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 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
2304
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2305 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
2306 cscf->client_header_buffer_size);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2307 if (r->header_in == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2308 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
2309 return NULL;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2312 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
2313
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2314 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
2315 if (stream == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2316 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
2317 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2318 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2319
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2320 r->spdy_stream = stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2321
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2322 stream->id = id;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2323 stream->request = r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2324 stream->connection = sc;
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2325
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2326 stream->send_window = sc->init_window;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2327 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
2328
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2329 stream->priority = priority;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2330
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2331 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
2332
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2333 index = ngx_http_spdy_stream_index(sscf, id);
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 stream->index = sc->streams_index[index];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2336 sc->streams_index[index] = stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2337
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2338 sc->processing++;
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 return stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2341 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2342
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2343
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2344 static ngx_http_spdy_stream_t *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2345 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
2346 ngx_uint_t sid)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2347 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2348 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2349 ngx_http_spdy_srv_conf_t *sscf;
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 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
2352 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2353
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2354 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
2355
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2356 while (stream) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2357 if (stream->id == sid) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2358 return stream;
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 stream = stream->index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2362 }
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 return NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2365 }
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2368 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2369 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
2370 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2371 u_char *p, *end, ch;
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2372 ngx_uint_t hash;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2373 ngx_http_core_srv_conf_t *cscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2374
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2375 enum {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2376 sw_name_len = 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2377 sw_name,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2378 sw_value_len,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2379 sw_value
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2380 } state;
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 state = r->state;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2383
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2384 p = r->header_in->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2385 end = r->header_in->last;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2386
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2387 switch (state) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2388
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2389 case sw_name_len:
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 if (end - p < NGX_SPDY_NV_NLEN_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2392 return NGX_AGAIN;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2393 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2394
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2395 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
2396
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2397 if (r->lowcase_index == 0) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2398 return NGX_HTTP_PARSE_INVALID_HEADER;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2399 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2400
5323
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2401 /* 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
2402 *p = '\0';
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2403
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2404 p += NGX_SPDY_NV_NLEN_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2405
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2406 r->invalid_header = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2407
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2408 state = sw_name;
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 /* fall through */
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 case sw_name:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2413
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2414 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
2415 break;
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 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
2419
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2420 r->header_name_start = p;
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2421 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
2422
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2423 if (p[0] == ':') {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2424 p++;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2425 }
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 hash = 0;
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 for ( /* void */ ; p != r->header_name_end; p++) {
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 ch = *p;
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 hash = ngx_hash(hash, ch);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2434
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2435 if ((ch >= 'a' && ch <= 'z')
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2436 || (ch == '-')
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2437 || (ch >= '0' && ch <= '9')
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2438 || (ch == '_' && cscf->underscores_in_headers))
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 continue;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2443 switch (ch) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2444 case '\0':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2445 case LF:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2446 case CR:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2447 case ':':
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2448 return NGX_HTTP_PARSE_INVALID_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2449 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2450
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2451 if (ch >= 'A' && ch <= 'Z') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2452 return NGX_HTTP_PARSE_INVALID_HEADER;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2455 r->invalid_header = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2456 }
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 r->header_hash = hash;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2459
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2460 state = sw_value_len;
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 /* fall through */
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 case sw_value_len:
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 if (end - p < NGX_SPDY_NV_VLEN_SIZE) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2467 break;
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
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2470 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
2471
5323
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2472 /* null-terminate header name */
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2473 *p = '\0';
2be1a9ce9d8e SPDY: fixed corruption of headers with names longer than 255.
Valentin Bartenev <vbart@nginx.com>
parents: 5281
diff changeset
2474
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2475 p += NGX_SPDY_NV_VLEN_SIZE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2476
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2477 state = sw_value;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2478
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2479 /* fall through */
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2480
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2481 case sw_value:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2482
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2483 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
2484 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2485 }
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 r->header_start = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2488
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2489 while (r->lowcase_index--) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2490 ch = *p;
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 if (ch == '\0') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2493
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2494 if (p == r->header_start) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2495 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2496 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2497
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2498 r->header_end = p;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2499 r->header_in->pos = p + 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2500
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2501 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2502 }
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 if (ch == CR || ch == LF) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2505 return NGX_HTTP_PARSE_INVALID_HEADER;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2506 }
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2507
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2508 p++;
5121
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
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2511 r->header_end = p;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2512 r->header_in->pos = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2513
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2514 r->state = 0;
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 return NGX_DONE;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2519 r->header_in->pos = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2520 r->state = state;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2521
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2522 return NGX_AGAIN;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2523 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2524
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2525
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2526 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2527 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
2528 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2529 u_char *old, *new;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2530 size_t rest;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2531 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2532 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2533 ngx_http_core_srv_conf_t *cscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2534
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2535 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
2536 "spdy alloc large header buffer");
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 stream = r->spdy_stream;
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 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
2541
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2542 if (stream->header_buffers
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2543 == (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
2544 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2545 return NGX_DECLINED;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2546 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2547
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2548 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
2549
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2550 if (rest >= cscf->large_client_header_buffers.size) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2551 return NGX_DECLINED;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2554 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
2555 if (buf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2556 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2557 }
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
5507
a30bba3c72e8 SPDY: fixed format specifiers in logging.
Valentin Bartenev <vbart@nginx.com>
parents: 5493
diff changeset
2560 "spdy large header alloc: %p %z",
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2561 buf->pos, buf->end - buf->last);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2562
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2563 old = r->header_in->pos;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2564 new = buf->pos;
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 if (rest) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2567 buf->last = ngx_cpymem(new, old, rest);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2568 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2569
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2570 r->header_in = buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2571
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2572 stream->header_buffers++;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2573
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2574 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2575 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2576
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2577
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2578 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2579 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
2580 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2581 ngx_uint_t i;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2582 ngx_table_elt_t *h;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2583 ngx_http_core_srv_conf_t *cscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2584 ngx_http_spdy_request_header_t *sh;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2585
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2586 if (r->invalid_header) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2587 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
2588
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2589 if (cscf->ignore_invalid_headers) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2590 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
2591 "client sent invalid header: \"%*s\"",
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2592 r->header_end - r->header_name_start,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2593 r->header_name_start);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2594 return NGX_OK;
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
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2597 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2598
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2599 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
2600 r->header_name_start++;
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2601
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2602 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
2603 sh = &ngx_http_spdy_request_headers[i];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2604
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2605 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
2606 || 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
2607 || 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
2608 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2609 continue;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2610 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2611
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2612 return sh->handler(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2613 }
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2614
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2615 return NGX_HTTP_PARSE_INVALID_REQUEST;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2616 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2617
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2618 h = ngx_list_push(&r->headers_in.headers);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2619 if (h == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2620 ngx_http_spdy_close_stream(r->spdy_stream,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2621 NGX_HTTP_INTERNAL_SERVER_ERROR);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2622 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2623 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2624
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2625 h->hash = r->header_hash;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2626
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2627 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
2628 h->key.data = r->header_name_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2629
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2630 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
2631 h->value.data = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2632
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2633 h->lowcase_key = h->key.data;
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_OK;
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 void
5225
15a7deeaa19a Use "void" for functions with empty parameter list.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5182
diff changeset
2640 ngx_http_spdy_request_headers_init(void)
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2641 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2642 ngx_uint_t i;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2643 ngx_http_spdy_request_header_t *h;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2644
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2645 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
2646 h = &ngx_http_spdy_request_headers[i];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2647 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
2648 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2649 }
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2652 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2653 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
2654 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2655 size_t k, len;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2656 ngx_uint_t n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2657 const u_char *p, *m;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2658
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2659 /*
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2660 * This array takes less than 256 sequential bytes,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2661 * 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
2662 * it is prefetched for 4 load operations.
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 static const struct {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2665 u_char len;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2666 const u_char method[11];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2667 uint32_t value;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2668 } tests[] = {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2669 { 3, "GET", NGX_HTTP_GET },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2670 { 4, "POST", NGX_HTTP_POST },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2671 { 4, "HEAD", NGX_HTTP_HEAD },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2672 { 7, "OPTIONS", NGX_HTTP_OPTIONS },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2673 { 8, "PROPFIND", NGX_HTTP_PROPFIND },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2674 { 3, "PUT", NGX_HTTP_PUT },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2675 { 5, "MKCOL", NGX_HTTP_MKCOL },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2676 { 6, "DELETE", NGX_HTTP_DELETE },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2677 { 4, "COPY", NGX_HTTP_COPY },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2678 { 4, "MOVE", NGX_HTTP_MOVE },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2679 { 9, "PROPPATCH", NGX_HTTP_PROPPATCH },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2680 { 4, "LOCK", NGX_HTTP_LOCK },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2681 { 6, "UNLOCK", NGX_HTTP_UNLOCK },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2682 { 5, "PATCH", NGX_HTTP_PATCH },
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2683 { 5, "TRACE", NGX_HTTP_TRACE }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2684 }, *test;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2685
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2686 if (r->method_name.len) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2687 return NGX_HTTP_PARSE_INVALID_HEADER;
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
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2690 len = r->header_end - r->header_start;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2691
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2692 r->method_name.len = len;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2693 r->method_name.data = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2694
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2695 test = tests;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2696 n = sizeof(tests) / sizeof(tests[0]);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2697
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2698 do {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2699 if (len == test->len) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2700 p = r->method_name.data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2701 m = test->method;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2702 k = len;
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 do {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2705 if (*p++ != *m++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2706 goto next;
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 } while (--k);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2709
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2710 r->method = test->value;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2711 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2712 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2713
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2714 next:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2715 test++;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2716
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2717 } while (--n);
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 p = r->method_name.data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2720
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2721 do {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2722 if ((*p < 'A' || *p > 'Z') && *p != '_') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2723 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
2724 "client sent invalid method");
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2725 return NGX_HTTP_PARSE_INVALID_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2726 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2727
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2728 p++;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2729
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2730 } while (--len);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2731
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2732 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2733 }
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2736 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2737 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
2738 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2739 if (r->schema_start) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2740 return NGX_HTTP_PARSE_INVALID_HEADER;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2743 r->schema_start = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2744 r->schema_end = r->header_end;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2745
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2746 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2747 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2748
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2749
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2750 static ngx_int_t
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2751 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
2752 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2753 ngx_table_elt_t *h;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2754
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2755 if (r->headers_in.host) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2756 return NGX_HTTP_PARSE_INVALID_HEADER;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2757 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2758
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2759 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
2760 if (h == NULL) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2761 ngx_http_spdy_close_stream(r->spdy_stream,
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2762 NGX_HTTP_INTERNAL_SERVER_ERROR);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2763 return NGX_ERROR;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2764 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2765
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2766 r->headers_in.host = h;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2767
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2768 h->hash = r->header_hash;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2769
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2770 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
2771 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
2772
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2773 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
2774 h->value.data = r->header_start;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2775
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2776 h->lowcase_key = h->key.data;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2777
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2778 return NGX_OK;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2779 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2780
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2781
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2782 static ngx_int_t
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
2783 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
2784 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2785 if (r->unparsed_uri.len) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2786 return NGX_HTTP_PARSE_INVALID_HEADER;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2789 r->uri_start = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2790 r->uri_end = r->header_end;
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 if (ngx_http_parse_uri(r) != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2793 return NGX_HTTP_PARSE_INVALID_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2794 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2795
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2796 if (ngx_http_process_request_uri(r) != NGX_OK) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2797 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2798 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2799
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2800 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2801 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2802
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2803
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2804 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2805 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
2806 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2807 u_char *p, ch;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2808
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2809 if (r->http_protocol.len) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2810 return NGX_HTTP_PARSE_INVALID_HEADER;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2811 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2812
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2813 p = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2814
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2815 if (r->header_end - p < 8 || !(ngx_str5cmp(p, 'H', 'T', 'T', 'P', '/'))) {
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2816 return NGX_HTTP_PARSE_INVALID_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2817 }
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 ch = *(p + 5);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2820
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2821 if (ch < '1' || ch > '9') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2822 return NGX_HTTP_PARSE_INVALID_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2823 }
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 r->http_major = ch - '0';
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2826
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2827 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
2828
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2829 ch = *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2830
5574
cff36d2d7fe6 SPDY: fixed parsing of http version.
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5553
diff changeset
2831 if (ch == '.') {
cff36d2d7fe6 SPDY: fixed parsing of http version.
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5553
diff changeset
2832 break;
cff36d2d7fe6 SPDY: fixed parsing of http version.
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5553
diff changeset
2833 }
cff36d2d7fe6 SPDY: fixed parsing of http version.
Xiaochen Wang <wangxiaochen0@gmail.com>
parents: 5553
diff changeset
2834
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2835 if (ch < '0' || ch > '9') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2836 return NGX_HTTP_PARSE_INVALID_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2837 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2838
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2839 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
2840 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2841
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2842 if (*p != '.') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2843 return NGX_HTTP_PARSE_INVALID_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2844 }
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 ch = *(p + 1);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2847
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2848 if (ch < '0' || ch > '9') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2849 return NGX_HTTP_PARSE_INVALID_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2850 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2851
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2852 r->http_minor = ch - '0';
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2853
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2854 for (p += 2; p != r->header_end; p++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2855
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2856 ch = *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2857
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2858 if (ch < '0' || ch > '9') {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2859 return NGX_HTTP_PARSE_INVALID_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2860 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2861
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2862 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
2863 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2864
5590
6808ea2d69e4 SPDY: fixed potential integer overflow while parsing headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5589
diff changeset
2865 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
2866 r->http_protocol.data = r->header_start;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2867 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
2868
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2869 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2870 }
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 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2874 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
2875 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2876 u_char *p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2877
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2878 if (r->method_name.len == 0
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2879 || r->unparsed_uri.len == 0
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2880 || r->http_protocol.len == 0)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2881 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2882 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
2883 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2884 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2885
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2886 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
2887 + r->unparsed_uri.len + 1
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2888 + r->http_protocol.len;
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 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
2891 if (p == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2892 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2893 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2894 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2895
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2896 r->request_line.data = p;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2897
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2898 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
2899
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2900 *p++ = ' ';
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2901
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2902 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
2903
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2904 *p++ = ' ';
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2905
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2906 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
2907
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2908 /* 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
2909 r->method_name.data = r->request_line.data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2910
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2911 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2912 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2913
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2914
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2915 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2916 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
2917 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2918 ngx_uint_t i;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2919 ngx_list_part_t *part;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2920 ngx_table_elt_t *h;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2921 ngx_http_header_t *hh;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2922 ngx_http_core_main_conf_t *cmcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2923
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2924 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
2925 return;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2928 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
2929 "spdy http request line: \"%V\"", &r->request_line);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2930
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2931 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
2932
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2933 part = &r->headers_in.headers.part;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2934 h = part->elts;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2935
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2936 for (i = 0 ;; i++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2937
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2938 if (i >= part->nelts) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2939 if (part->next == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2940 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2941 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2942
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2943 part = part->next;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2944 h = part->elts;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2945 i = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2946 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2947
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2948 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
2949 h[i].lowcase_key, h[i].key.len);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2950
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2951 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
2952 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2953 }
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2956 "http header: \"%V: %V\"", &h[i].key, &h[i].value);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2957 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2958
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2959 r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2960
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2961 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
2962 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2963 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2964
5641
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
2965 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
2966 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
2967 "client prematurely closed stream");
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
2968
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
2969 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
2970
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
2971 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
2972 return;
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
2973 }
0aeb6f63d242 SPDY: better detect premature closing of stream.
Valentin Bartenev <vbart@nginx.com>
parents: 5628
diff changeset
2974
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2975 ngx_http_process_request(r);
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2978
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2979 static ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2980 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
2981 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2982 ngx_buf_t *buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2983 ngx_temp_file_t *tf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2984 ngx_http_request_body_t *rb;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2985 ngx_http_core_loc_conf_t *clcf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2986
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2987 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
2988 if (rb == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2989 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2990 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2991
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2992 r->request_body = rb;
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 if (r->spdy_stream->in_closed) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2995 return NGX_OK;
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 rb->rest = r->headers_in.content_length_n;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
2999
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3000 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
3001
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3002 if (r->request_body_in_file_only
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3003 || 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
3004 || rb->rest < 0)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3005 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3006 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
3007 if (tf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3008 return NGX_ERROR;
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3011 tf->file.fd = NGX_INVALID_FILE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3012 tf->file.log = r->connection->log;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3013 tf->path = clcf->client_body_temp_path;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3014 tf->pool = r->pool;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3015 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
3016 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
3017 tf->persistent = r->request_body_in_persistent_file;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3018 tf->clean = r->request_body_in_clean_file;
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 if (r->request_body_file_group_access) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3021 tf->access = 0660;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3022 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3023
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3024 rb->temp_file = tf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3025
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3026 if (r->spdy_stream->in_closed
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3027 && 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
3028 tf->persistent, tf->clean, tf->access)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3029 != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3030 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3031 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3032 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3033
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3034 buf = ngx_calloc_buf(r->pool);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3035 if (buf == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3036 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3037 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3038
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3039 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3040
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3041 if (rb->rest == 0) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3042 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3043 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3044
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3045 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
3046 if (buf == NULL) {
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
5281
7542b72fe4b1 SPDY: fixed segfault with "client_body_in_file_only" enabled.
Valentin Bartenev <vbart@nginx.com>
parents: 5225
diff changeset
3051 rb->buf = buf;
7542b72fe4b1 SPDY: fixed segfault with "client_body_in_file_only" enabled.
Valentin Bartenev <vbart@nginx.com>
parents: 5225
diff changeset
3052
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3053 rb->bufs = ngx_alloc_chain_link(r->pool);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3054 if (rb->bufs == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3055 return NGX_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3056 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3057
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3058 rb->bufs->buf = buf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3059 rb->bufs->next = NULL;
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 rb->rest = 0;
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 return NGX_OK;
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
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 ngx_int_t
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3068 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
3069 ngx_http_client_body_handler_pt post_handler)
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_http_spdy_stream_t *stream;
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 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
3074 "spdy read request body");
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 stream = r->spdy_stream;
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 switch (stream->skip_data) {
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 case NGX_SPDY_DATA_DISCARD:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3081 post_handler(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3082 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3083
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3084 case NGX_SPDY_DATA_ERROR:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3085 if (r->headers_in.content_length_n == -1) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3086 return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3087 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3088 return NGX_HTTP_BAD_REQUEST;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3089 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3090
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3091 case NGX_SPDY_DATA_INTERNAL_ERROR:
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3092 return NGX_HTTP_INTERNAL_SERVER_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3093 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3094
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3095 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
3096 stream->skip_data = NGX_SPDY_DATA_INTERNAL_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3097 return NGX_HTTP_INTERNAL_SERVER_ERROR;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3098 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3099
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3100 if (stream->in_closed) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3101 post_handler(r);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3102 return NGX_OK;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3103 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3104
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3105 r->request_body->post_handler = post_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3106
5402
4d0c70541784 SPDY: fixed connection leak while waiting for request body.
Valentin Bartenev <vbart@nginx.com>
parents: 5325
diff changeset
3107 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
3108 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
3109
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3110 return NGX_AGAIN;
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
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3114 static ngx_int_t
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3115 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
3116 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
3117 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3118 ngx_event_t *rev;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3119 ngx_connection_t *fc;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3120
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3121 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
3122 NGX_SPDY_HIGHEST_PRIORITY)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3123 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3124 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3125 return NGX_ERROR;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3126 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3127
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3128 stream->out_closed = 1;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3129
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3130 fc = stream->request->connection;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3131 fc->error = 1;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3132
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3133 rev = fc->read;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3134 rev->handler(rev);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3135
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3136 return NGX_OK;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3137 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3138
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3139
5403
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3140 static void
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3141 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
3142 {
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3143 ngx_connection_t *fc;
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3144 ngx_http_request_t *r;
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3145
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3146 fc = ev->data;
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3147 r = fc->data;
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3148
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3149 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
3150 "spdy close stream handler");
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3151
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3152 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
3153 }
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3154
7e062646da6f SPDY: fixed connection leak while waiting for request headers.
Valentin Bartenev <vbart@nginx.com>
parents: 5402
diff changeset
3155
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3156 void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3157 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
3158 {
6078
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3159 int tcp_nodelay;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3160 ngx_event_t *ev;
6078
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3161 ngx_connection_t *c, *fc;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3162 ngx_http_core_loc_conf_t *clcf;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3163 ngx_http_spdy_stream_t **index, *s;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3164 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3165 ngx_http_spdy_connection_t *sc;
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 sc = stream->connection;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3168
5510
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3169 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
3170 "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
3171 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
3172
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3173 fc = stream->request->connection;
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3174
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3175 if (stream->queued) {
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3176 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
3177 return;
3ff29c30effb SPDY: elimination of r->blocked counter usage for queuing frames.
Valentin Bartenev <vbart@nginx.com>
parents: 5509
diff changeset
3178 }
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3179
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3180 if (!stream->out_closed) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3181 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
3182 NGX_SPDY_INTERNAL_ERROR,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3183 stream->priority)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3184 != NGX_OK)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3185 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3186 sc->connection->error = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3187 }
6078
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3188
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3189 } else {
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3190 c = sc->connection;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3191
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3192 if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3193 if (ngx_tcp_push(c->fd) == -1) {
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3194 ngx_connection_error(c, ngx_socket_errno,
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3195 ngx_tcp_push_n " failed");
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3196 c->error = 1;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3197 tcp_nodelay = 0;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3198
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3199 } else {
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3200 c->tcp_nopush = NGX_TCP_NOPUSH_UNSET;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3201 tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3202 }
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3203
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3204 } else {
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3205 tcp_nodelay = 1;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3206 }
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3207
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3208 clcf = ngx_http_get_module_loc_conf(stream->request,
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3209 ngx_http_core_module);
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3210
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3211 if (tcp_nodelay
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3212 && clcf->tcp_nodelay
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3213 && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3214 {
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3215 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "tcp_nodelay");
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3216
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3217 if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3218 (const void *) &tcp_nodelay, sizeof(int))
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3219 == -1)
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3220 {
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3221 #if (NGX_SOLARIS)
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3222 /* Solaris returns EINVAL if a socket has been shut down */
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3223 c->log_error = NGX_ERROR_IGNORE_EINVAL;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3224 #endif
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3225
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3226 ngx_connection_error(c, ngx_socket_errno,
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3227 "setsockopt(TCP_NODELAY) failed");
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3228
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3229 c->log_error = NGX_ERROR_INFO;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3230 c->error = 1;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3231
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3232 } else {
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3233 c->tcp_nodelay = NGX_TCP_NODELAY_SET;
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3234 }
7ea6f5140ed9 SPDY: push pending data while closing a stream as with keepalive.
Valentin Bartenev <vbart@nginx.com>
parents: 5652
diff changeset
3235 }
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3236 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3237
5524
03c198bb2acf SPDY: fixed possible segfault.
Valentin Bartenev <vbart@nginx.com>
parents: 5520
diff changeset
3238 if (sc->stream == stream) {
03c198bb2acf SPDY: fixed possible segfault.
Valentin Bartenev <vbart@nginx.com>
parents: 5520
diff changeset
3239 sc->stream = NULL;
03c198bb2acf SPDY: fixed possible segfault.
Valentin Bartenev <vbart@nginx.com>
parents: 5520
diff changeset
3240 }
03c198bb2acf SPDY: fixed possible segfault.
Valentin Bartenev <vbart@nginx.com>
parents: 5520
diff changeset
3241
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3242 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
3243 ngx_http_spdy_module);
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 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
3246
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3247 for ( ;; ) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3248 s = *index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3249
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3250 if (s == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3251 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3252 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3253
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3254 if (s == stream) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3255 *index = s->index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3256 break;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3257 }
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 index = &s->index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3260 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3261
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3262 ngx_http_free_request(stream->request, rc);
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 ev = fc->read;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3265
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3266 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
3267 ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
abf7813b927e SPDY: alert about activated fake events instead of deleting them.
Valentin Bartenev <vbart@nginx.com>
parents: 5324
diff changeset
3268 "spdy fake read event was activated");
5121
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3271 if (ev->timer_set) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3272 ngx_del_timer(ev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3273 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3274
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3275 if (ev->prev) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3276 ngx_delete_posted_event(ev);
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
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3279 ev = fc->write;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3280
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3281 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
3282 ngx_log_error(NGX_LOG_ALERT, sc->connection->log, 0,
abf7813b927e SPDY: alert about activated fake events instead of deleting them.
Valentin Bartenev <vbart@nginx.com>
parents: 5324
diff changeset
3283 "spdy fake write event was activated");
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3284 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3285
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3286 if (ev->timer_set) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3287 ngx_del_timer(ev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3288 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3289
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3290 if (ev->prev) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3291 ngx_delete_posted_event(ev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3292 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3293
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3294 fc->data = sc->free_fake_connections;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3295 sc->free_fake_connections = fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3296
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3297 sc->processing--;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3298
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3299 if (sc->processing || sc->blocked) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3300 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3301 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3302
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3303 ev = sc->connection->read;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3304
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3305 ev->handler = ngx_http_spdy_handle_connection_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3306 ngx_post_event(ev, &ngx_posted_events);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3307 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3308
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3309
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3310 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3311 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
3312 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3313 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3314
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3315 rev->handler = ngx_http_spdy_read_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3316
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3317 if (rev->ready) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3318 ngx_http_spdy_read_handler(rev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3319 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3320 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3321
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3322 c = rev->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3323
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3324 ngx_http_spdy_handle_connection(c->data);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3325 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3326
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3327
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3328 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3329 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
3330 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3331 ngx_connection_t *c;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3332 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3333 ngx_http_spdy_connection_t *sc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3334
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3335 c = rev->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3336
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3337 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
3338
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3339 if (rev->timedout || c->close) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3340 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3341 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3342 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3343
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3344 #if (NGX_HAVE_KQUEUE)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3345
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3346 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3347 if (rev->pending_eof) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3348 c->log->handler = NULL;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3349 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
3350 "kevent() reported that client %V closed "
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3351 "keepalive connection", &c->addr_text);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3352 #if (NGX_HTTP_SSL)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3353 if (c->ssl) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3354 c->ssl->no_send_shutdown = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3355 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3356 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3357 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3358 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3359 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3360 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3361
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3362 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3363
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3364 c->destroyed = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3365 c->idle = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3366 ngx_reusable_connection(c, 0);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3367
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3368 sc = c->data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3369
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3370 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
3371 ngx_http_spdy_module);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3372
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3373 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
3374 if (sc->pool == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3375 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3376 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3377 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3378
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3379 sc->streams_index = ngx_pcalloc(sc->pool,
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3380 ngx_http_spdy_streams_index_size(sscf)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3381 * sizeof(ngx_http_spdy_stream_t *));
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3382 if (sc->streams_index == NULL) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3383 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3384 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3385 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3386
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3387 c->write->handler = ngx_http_spdy_write_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3388
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3389 rev->handler = ngx_http_spdy_read_handler;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3390 ngx_http_spdy_read_handler(rev);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3391 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3392
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3393
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3394 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3395 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
3396 ngx_int_t rc)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3397 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3398 ngx_uint_t i, size;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3399 ngx_event_t *ev;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3400 ngx_connection_t *c, *fc;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3401 ngx_http_request_t *r;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3402 ngx_http_spdy_stream_t *stream;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3403 ngx_http_spdy_srv_conf_t *sscf;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3404
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3405 c = sc->connection;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3406
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3407 if (!sc->processing) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3408 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3409 return;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3410 }
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 c->error = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3413 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
3414 c->write->handler = ngx_http_empty_handler;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3415
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3416 sc->last_out = NULL;
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 sc->blocked = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3419
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3420 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
3421 ngx_http_spdy_module);
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 size = ngx_http_spdy_streams_index_size(sscf);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3424
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3425 for (i = 0; i < size; i++) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3426 stream = sc->streams_index[i];
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3427
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3428 while (stream) {
5493
916cb6d28f6a SPDY: fixed possible request hang.
Valentin Bartenev <vbart@nginx.com>
parents: 5465
diff changeset
3429 stream->handled = 0;
916cb6d28f6a SPDY: fixed possible request hang.
Valentin Bartenev <vbart@nginx.com>
parents: 5465
diff changeset
3430
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3431 r = stream->request;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3432 fc = r->connection;
5493
916cb6d28f6a SPDY: fixed possible request hang.
Valentin Bartenev <vbart@nginx.com>
parents: 5465
diff changeset
3433
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3434 fc->error = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3435
5508
9053fdcea4b7 SPDY: better name for queued frames counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5507
diff changeset
3436 if (stream->queued) {
9053fdcea4b7 SPDY: better name for queued frames counter.
Valentin Bartenev <vbart@nginx.com>
parents: 5507
diff changeset
3437 stream->queued = 0;
5465
a279d2a33dbf SPDY: drop the "delayed" flag when finalizing connection.
Valentin Bartenev <vbart@nginx.com>
parents: 5404
diff changeset
3438
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3439 ev = fc->write;
5465
a279d2a33dbf SPDY: drop the "delayed" flag when finalizing connection.
Valentin Bartenev <vbart@nginx.com>
parents: 5404
diff changeset
3440 ev->delayed = 0;
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3441
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3442 } else {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3443 ev = fc->read;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3444 }
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 stream = stream->index;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3447
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3448 ev->eof = 1;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3449 ev->handler(ev);
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 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3452
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3453 sc->blocked = 0;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3454
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3455 if (sc->processing) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3456 return;
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 ngx_http_close_connection(c);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3460 }
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
5549
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3463 static ngx_int_t
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3464 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
3465 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3466 ngx_uint_t i, size;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3467 ngx_event_t *wev;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3468 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
3469 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
3470
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3471 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
3472 ngx_http_spdy_module);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3473
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3474 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
3475
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3476 for (i = 0; i < size; i++) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3477
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3478 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
3479 sn = stream->index;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3480
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3481 if (delta > 0
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3482 && stream->send_window
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3483 > (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
3484 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3485 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
3486 NGX_SPDY_FLOW_CONTROL_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3487 == NGX_ERROR)
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3488 {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3489 return NGX_ERROR;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3490 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3491
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3492 continue;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3493 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3494
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3495 stream->send_window += delta;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3496
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3497 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
3498 "spdy:%ui adjust window:%z",
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3499 stream->id, stream->send_window);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3500
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3501 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
3502 stream->exhausted = 0;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3503
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3504 wev = stream->request->connection->write;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3505
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3506 if (!wev->timer_set) {
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3507 wev->delayed = 0;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3508 wev->handler(wev);
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3509 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3510 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3511 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3512 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3513
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3514 return NGX_OK;
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3515 }
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3516
39d7eef2e332 SPDY: protocol implementation switched to spdy/3.1.
Valentin Bartenev <vbart@nginx.com>
parents: 5530
diff changeset
3517
5121
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3518 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3519 ngx_http_spdy_pool_cleanup(void *data)
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 ngx_http_spdy_connection_t *sc = data;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3522
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3523 if (sc->pool) {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3524 ngx_destroy_pool(sc->pool);
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
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 static void *
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3530 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
3531 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3532 ngx_http_spdy_connection_t *sc = opaque;
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3533
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3534 return ngx_palloc(sc->connection->pool, items * size);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3535 }
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3536
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 static void
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3539 ngx_http_spdy_zfree(void *opaque, void *address)
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3540 {
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3541 #if 0
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3542 ngx_http_spdy_connection_t *sc = opaque;
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 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
3545 "spdy zfree: %p", address);
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3546 #endif
c0f7b94e88ba Preliminary experimental support for SPDY draft 2.
Valentin Bartenev <vbart@nginx.com>
parents:
diff changeset
3547 }