17 #define NGX_SPDY_WRITE_BUFFERED NGX_HTTP_WRITE_BUFFERED
19 #define ngx_http_spdy_nv_nsize(h) (NGX_SPDY_NV_NLEN_SIZE + sizeof(h) - 1)
20 #define ngx_http_spdy_nv_vsize(h) (NGX_SPDY_NV_VLEN_SIZE + sizeof(h) - 1)
22 #define ngx_http_spdy_nv_write_num ngx_spdy_frame_write_uint16
23 #define ngx_http_spdy_nv_write_nlen ngx_spdy_frame_write_uint16
24 #define ngx_http_spdy_nv_write_vlen ngx_spdy_frame_write_uint16
26 #define ngx_http_spdy_nv_write_name(p, h) \
27 ngx_cpymem(ngx_http_spdy_nv_write_nlen(p, sizeof(h) - 1), h, sizeof(h) - 1)
29 #define ngx_http_spdy_nv_write_val(p, h) \
30 ngx_cpymem(ngx_http_spdy_nv_write_vlen(p, sizeof(h) - 1), h, sizeof(h) - 1)
36 ngx_http_spdy_stream_t *stream,
size_t len,
ngx_uint_t flags,
39 static ngx_int_t ngx_http_spdy_syn_frame_handler(
41 static ngx_int_t ngx_http_spdy_data_frame_handler(
43 static ngx_inline void ngx_http_spdy_handle_frame(
45 static ngx_inline void ngx_http_spdy_handle_stream(
48 static void ngx_http_spdy_filter_cleanup(
void *data);
55 ngx_http_spdy_filter_init,
70 &ngx_http_spdy_filter_module_ctx,
93 u_char *p, *buf, *last;
104 ngx_http_spdy_stream_t *stream;
107 struct sockaddr_in *sin;
109 struct sockaddr_in6 *sin6;
113 if (!r->spdy_stream) {
114 return ngx_http_next_header_filter(r);
118 "spdy header filter");
232 port = ntohs(sin6->sin6_port);
235 #if (NGX_HAVE_UNIX_DOMAIN)
242 port = ntohs(sin->sin_port);
255 port = (port == 443) ? 0 : port;
258 port = (port == 80) ? 0 : port;
265 len +=
sizeof(
":65535") - 1;
278 if (i >= part->
nelts) {
279 if (part->
next == NULL) {
288 if (header[i].hash == 0) {
344 last =
ngx_cpymem(last,
"; charset=",
sizeof(
"; charset=") - 1);
397 last =
ngx_cpymem(p,
"http",
sizeof(
"http") - 1);
405 *last++ =
':'; *last++ =
'/'; *last++ =
'/';
433 if (i >= part->
nelts) {
434 if (part->
next == NULL) {
443 if (header[i].hash == 0 || header[i].hash == 2) {
447 if ((header[i].key.len == 6
449 (u_char *)
"status", 6) == 0)
452 (u_char *)
"version", 7) == 0))
470 for (j = i + 1; ; j++) {
472 if (j >= pt->
nelts) {
473 if (pt->
next == NULL) {
482 if (h[j].hash == 0 || h[j].hash == 2
483 || h[j].key.len != header[i].
key.
len
505 stream = r->spdy_stream;
531 "spdy deflate() failed: %d", rc);
536 "spdy deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d",
576 frame->
handler = ngx_http_spdy_syn_frame_handler;
585 "spdy:%ui create SYN_REPLY frame %p: size:%uz",
586 stream->id, frame, frame->
size);
588 ngx_http_spdy_queue_blocked_frame(sc, frame);
597 cln->
handler = ngx_http_spdy_filter_cleanup;
602 return ngx_http_spdy_filter_send(c, stream);
612 ngx_http_spdy_stream_t *stream;
615 stream = r->spdy_stream;
617 if (stream == NULL) {
618 return ngx_http_next_body_filter(r, in);
622 "spdy body filter \"%V?%V\"", &r->
uri, &r->
args);
626 if (stream->waiting) {
644 "zero size buf in spdy body filter "
645 "t:%d r:%d f:%d %p %p-%p %p %O-%O",
671 if (ll->
next == NULL) {
680 "FIXME: chain too big in spdy filter: %O", size);
684 frame = ngx_http_spdy_filter_get_data_frame(stream, (
size_t) size,
690 ngx_http_spdy_queue_frame(stream->connection, frame);
696 return ngx_http_spdy_filter_send(r->
connection, stream);
701 ngx_http_spdy_filter_get_data_frame(ngx_http_spdy_stream_t *stream,
711 frame = stream->free_frames;
714 stream->free_frames = frame->
free;
725 "spdy:%ui create DATA frame %p: len:%uz fin:%ui",
726 stream->id, frame, len, fin);
733 &stream->free_data_headers);
744 p +=
sizeof(uint32_t);
771 frame->
first = first;
773 frame->
handler = ngx_http_spdy_data_frame_handler;
786 ngx_http_spdy_filter_send(
ngx_connection_t *fc, ngx_http_spdy_stream_t *stream)
793 if (stream->waiting) {
810 ngx_http_spdy_stream_t *stream;
821 "spdy:%ui SYN_REPLY frame %p was sent", stream->id, frame);
825 ngx_http_spdy_handle_frame(stream, frame);
827 ngx_http_spdy_handle_stream(sc, stream);
838 ngx_http_spdy_stream_t *stream;
848 "spdy:%ui DATA frame %p was sent partially",
856 cl->
next = stream->free_data_headers;
857 stream->free_data_headers = cl;
859 if (cl == frame->
last) {
869 if (cl != frame->
first) {
871 ngx_http_spdy_handle_stream(sc, stream);
875 "spdy:%ui DATA frame %p was sent partially",
885 if (cl == frame->
last) {
895 "spdy:%ui DATA frame %p was sent", stream->id, frame);
899 ngx_http_spdy_handle_frame(stream, frame);
901 ngx_http_spdy_handle_stream(sc, stream);
908 ngx_http_spdy_handle_frame(ngx_http_spdy_stream_t *stream,
919 stream->out_closed = 1;
922 frame->
free = stream->free_frames;
923 stream->free_frames = frame;
931 ngx_http_spdy_stream_t *stream)
935 fc = stream->request->connection;
939 if (stream->handled) {
953 ngx_http_spdy_filter_cleanup(
void *data)
955 ngx_http_spdy_stream_t *stream = data;
960 if (stream->waiting == 0) {
966 fn = &stream->connection->last_out;