Annotation of embedaddon/nginx/src/http/ngx_http_spdy.h, revision 1.1.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>