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>