Annotation of embedaddon/nginx/src/http/ngx_http_spdy.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) Nginx, Inc.
! 3: * Copyright (C) Valentin V. Bartenev
! 4: */
! 5:
! 6:
! 7: #ifndef _NGX_HTTP_SPDY_H_INCLUDED_
! 8: #define _NGX_HTTP_SPDY_H_INCLUDED_
! 9:
! 10:
! 11: #include <ngx_config.h>
! 12: #include <ngx_core.h>
! 13: #include <ngx_http.h>
! 14:
! 15: #include <zlib.h>
! 16:
! 17:
! 18: #define NGX_SPDY_VERSION 2
! 19:
! 20: #ifdef TLSEXT_TYPE_next_proto_neg
! 21: #define NGX_SPDY_NPN_ADVERTISE "\x06spdy/2"
! 22: #define NGX_SPDY_NPN_NEGOTIATED "spdy/2"
! 23: #endif
! 24:
! 25: #define NGX_SPDY_STATE_BUFFER_SIZE 16
! 26:
! 27: #define NGX_SPDY_CTL_BIT 1
! 28:
! 29: #define NGX_SPDY_SYN_STREAM 1
! 30: #define NGX_SPDY_SYN_REPLY 2
! 31: #define NGX_SPDY_RST_STREAM 3
! 32: #define NGX_SPDY_SETTINGS 4
! 33: #define NGX_SPDY_NOOP 5
! 34: #define NGX_SPDY_PING 6
! 35: #define NGX_SPDY_GOAWAY 7
! 36: #define NGX_SPDY_HEADERS 8
! 37:
! 38: #define NGX_SPDY_FRAME_HEADER_SIZE 8
! 39:
! 40: #define NGX_SPDY_SID_SIZE 4
! 41:
! 42: #define NGX_SPDY_SYN_STREAM_SIZE 10
! 43: #define NGX_SPDY_SYN_REPLY_SIZE 6
! 44: #define NGX_SPDY_RST_STREAM_SIZE 8
! 45: #define NGX_SPDY_PING_SIZE 4
! 46: #define NGX_SPDY_GOAWAY_SIZE 4
! 47: #define NGX_SPDY_NV_NUM_SIZE 2
! 48: #define NGX_SPDY_NV_NLEN_SIZE 2
! 49: #define NGX_SPDY_NV_VLEN_SIZE 2
! 50: #define NGX_SPDY_SETTINGS_NUM_SIZE 4
! 51: #define NGX_SPDY_SETTINGS_IDF_SIZE 4
! 52: #define NGX_SPDY_SETTINGS_VAL_SIZE 4
! 53:
! 54: #define NGX_SPDY_SETTINGS_PAIR_SIZE \
! 55: (NGX_SPDY_SETTINGS_IDF_SIZE + NGX_SPDY_SETTINGS_VAL_SIZE)
! 56:
! 57: #define NGX_SPDY_HIGHEST_PRIORITY 0
! 58: #define NGX_SPDY_LOWEST_PRIORITY 3
! 59:
! 60: #define NGX_SPDY_FLAG_FIN 0x01
! 61: #define NGX_SPDY_FLAG_UNIDIRECTIONAL 0x02
! 62: #define NGX_SPDY_FLAG_CLEAR_SETTINGS 0x01
! 63:
! 64: #define NGX_SPDY_MAX_FRAME_SIZE ((1 << 24) - 1)
! 65:
! 66: #define NGX_SPDY_DATA_DISCARD 1
! 67: #define NGX_SPDY_DATA_ERROR 2
! 68: #define NGX_SPDY_DATA_INTERNAL_ERROR 3
! 69:
! 70:
! 71: typedef struct ngx_http_spdy_connection_s ngx_http_spdy_connection_t;
! 72: typedef struct ngx_http_spdy_out_frame_s ngx_http_spdy_out_frame_t;
! 73:
! 74:
! 75: typedef u_char *(*ngx_http_spdy_handler_pt) (ngx_http_spdy_connection_t *sc,
! 76: u_char *pos, u_char *end);
! 77:
! 78: struct ngx_http_spdy_connection_s {
! 79: ngx_connection_t *connection;
! 80: ngx_http_connection_t *http_connection;
! 81:
! 82: ngx_uint_t processing;
! 83:
! 84: u_char buffer[NGX_SPDY_STATE_BUFFER_SIZE];
! 85: size_t buffer_used;
! 86: ngx_http_spdy_handler_pt handler;
! 87:
! 88: z_stream zstream_in;
! 89: z_stream zstream_out;
! 90:
! 91: ngx_pool_t *pool;
! 92:
! 93: ngx_http_spdy_out_frame_t *free_ctl_frames;
! 94: ngx_connection_t *free_fake_connections;
! 95:
! 96: ngx_http_spdy_stream_t **streams_index;
! 97:
! 98: ngx_http_spdy_out_frame_t *last_out;
! 99: ngx_http_spdy_stream_t *last_stream;
! 100:
! 101: ngx_http_spdy_stream_t *stream;
! 102:
! 103: ngx_uint_t headers;
! 104: size_t length;
! 105: u_char flags;
! 106:
! 107: ngx_uint_t last_sid;
! 108:
! 109: unsigned blocked:2;
! 110: unsigned waiting:1; /* FIXME better name */
! 111: };
! 112:
! 113:
! 114: struct ngx_http_spdy_stream_s {
! 115: ngx_uint_t id;
! 116: ngx_http_request_t *request;
! 117: ngx_http_spdy_connection_t *connection;
! 118: ngx_http_spdy_stream_t *index;
! 119: ngx_http_spdy_stream_t *next;
! 120:
! 121: ngx_uint_t header_buffers;
! 122: ngx_uint_t waiting;
! 123: ngx_http_spdy_out_frame_t *free_frames;
! 124: ngx_chain_t *free_data_headers;
! 125:
! 126: unsigned priority:2;
! 127: unsigned handled:1;
! 128: unsigned in_closed:1;
! 129: unsigned out_closed:1;
! 130: unsigned skip_data:2;
! 131: };
! 132:
! 133:
! 134: struct ngx_http_spdy_out_frame_s {
! 135: ngx_http_spdy_out_frame_t *next;
! 136: ngx_chain_t *first;
! 137: ngx_chain_t *last;
! 138: ngx_int_t (*handler)(ngx_http_spdy_connection_t *sc,
! 139: ngx_http_spdy_out_frame_t *frame);
! 140:
! 141: ngx_http_spdy_out_frame_t *free;
! 142:
! 143: ngx_http_spdy_stream_t *stream;
! 144: size_t size;
! 145:
! 146: ngx_uint_t priority;
! 147: unsigned blocked:1;
! 148: unsigned fin:1;
! 149: };
! 150:
! 151:
! 152: static ngx_inline void
! 153: ngx_http_spdy_queue_frame(ngx_http_spdy_connection_t *sc,
! 154: ngx_http_spdy_out_frame_t *frame)
! 155: {
! 156: ngx_http_spdy_out_frame_t **out;
! 157:
! 158: for (out = &sc->last_out; *out; out = &(*out)->next)
! 159: {
! 160: if (frame->priority >= (*out)->priority) {
! 161: break;
! 162: }
! 163: }
! 164:
! 165: frame->next = *out;
! 166: *out = frame;
! 167: }
! 168:
! 169:
! 170: static ngx_inline void
! 171: ngx_http_spdy_queue_blocked_frame(ngx_http_spdy_connection_t *sc,
! 172: ngx_http_spdy_out_frame_t *frame)
! 173: {
! 174: ngx_http_spdy_out_frame_t **out;
! 175:
! 176: for (out = &sc->last_out; *out && !(*out)->blocked; out = &(*out)->next)
! 177: {
! 178: if (frame->priority >= (*out)->priority) {
! 179: break;
! 180: }
! 181: }
! 182:
! 183: frame->next = *out;
! 184: *out = frame;
! 185: }
! 186:
! 187:
! 188: void ngx_http_spdy_init(ngx_event_t *rev);
! 189: void ngx_http_spdy_request_headers_init();
! 190:
! 191: ngx_int_t ngx_http_spdy_read_request_body(ngx_http_request_t *r,
! 192: ngx_http_client_body_handler_pt post_handler);
! 193:
! 194: void ngx_http_spdy_close_stream(ngx_http_spdy_stream_t *stream, ngx_int_t rc);
! 195:
! 196: ngx_int_t ngx_http_spdy_send_output_queue(ngx_http_spdy_connection_t *sc);
! 197:
! 198:
! 199: #define ngx_spdy_frame_aligned_write_uint16(p, s) \
! 200: (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t))
! 201:
! 202: #define ngx_spdy_frame_aligned_write_uint32(p, s) \
! 203: (*(uint32_t *) (p) = htonl((uint32_t) (s)), (p) + sizeof(uint32_t))
! 204:
! 205: #if (NGX_HAVE_NONALIGNED)
! 206:
! 207: #define ngx_spdy_frame_write_uint16 ngx_spdy_frame_aligned_write_uint16
! 208: #define ngx_spdy_frame_write_uint32 ngx_spdy_frame_aligned_write_uint32
! 209:
! 210: #else
! 211:
! 212: #define ngx_spdy_frame_write_uint16(p, s) \
! 213: ((p)[0] = (u_char) (s) >> 8, (p)[1] = (u_char) (s), (p) + sizeof(uint16_t))
! 214:
! 215: #define ngx_spdy_frame_write_uint32(p, s) \
! 216: ((p)[0] = (u_char) (s) >> 24, \
! 217: (p)[1] = (u_char) (s) >> 16, \
! 218: (p)[2] = (u_char) (s) >> 8, \
! 219: (p)[3] = (u_char) (s), (p) + sizeof(uint32_t))
! 220:
! 221: #endif
! 222:
! 223:
! 224: #define ngx_spdy_ctl_frame_head(t) \
! 225: ((uint32_t) NGX_SPDY_CTL_BIT << 31 | NGX_SPDY_VERSION << 16 | (t))
! 226:
! 227: #define ngx_spdy_frame_write_head(p, t) \
! 228: ngx_spdy_frame_aligned_write_uint32(p, ngx_spdy_ctl_frame_head(t))
! 229:
! 230: #define ngx_spdy_frame_write_flags_and_len(p, f, l) \
! 231: ngx_spdy_frame_aligned_write_uint32(p, (f) << 24 | (l))
! 232:
! 233: #define ngx_spdy_frame_write_sid ngx_spdy_frame_aligned_write_uint32
! 234:
! 235: #endif /* _NGX_HTTP_SPDY_H_INCLUDED_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>