src/http/ngx_http_spdy.h - nginx-1.7.10

Data types defined

Functions defined

Macros defined

Source code

  1. /*
  2. * Copyright (C) Nginx, Inc.
  3. * Copyright (C) Valentin V. Bartenev
  4. */


  5. #ifndef _NGX_HTTP_SPDY_H_INCLUDED_
  6. #define _NGX_HTTP_SPDY_H_INCLUDED_


  7. #include <ngx_config.h>
  8. #include <ngx_core.h>
  9. #include <ngx_http.h>

  10. #include <zlib.h>


  11. #define NGX_SPDY_VERSION              3

  12. #define NGX_SPDY_NPN_ADVERTISE        "\x08spdy/3.1"
  13. #define NGX_SPDY_NPN_NEGOTIATED       "spdy/3.1"

  14. #define NGX_SPDY_STATE_BUFFER_SIZE    16

  15. #define NGX_SPDY_CTL_BIT              1

  16. #define NGX_SPDY_SYN_STREAM           1
  17. #define NGX_SPDY_SYN_REPLY            2
  18. #define NGX_SPDY_RST_STREAM           3
  19. #define NGX_SPDY_SETTINGS             4
  20. #define NGX_SPDY_PING                 6
  21. #define NGX_SPDY_GOAWAY               7
  22. #define NGX_SPDY_HEADERS              8
  23. #define NGX_SPDY_WINDOW_UPDATE        9

  24. #define NGX_SPDY_FRAME_HEADER_SIZE    8

  25. #define NGX_SPDY_SID_SIZE             4
  26. #define NGX_SPDY_DELTA_SIZE           4

  27. #define NGX_SPDY_SYN_STREAM_SIZE      10
  28. #define NGX_SPDY_SYN_REPLY_SIZE       4
  29. #define NGX_SPDY_RST_STREAM_SIZE      8
  30. #define NGX_SPDY_PING_SIZE            4
  31. #define NGX_SPDY_GOAWAY_SIZE          8
  32. #define NGX_SPDY_WINDOW_UPDATE_SIZE   8
  33. #define NGX_SPDY_NV_NUM_SIZE          4
  34. #define NGX_SPDY_NV_NLEN_SIZE         4
  35. #define NGX_SPDY_NV_VLEN_SIZE         4
  36. #define NGX_SPDY_SETTINGS_NUM_SIZE    4
  37. #define NGX_SPDY_SETTINGS_FID_SIZE    4
  38. #define NGX_SPDY_SETTINGS_VAL_SIZE    4

  39. #define NGX_SPDY_SETTINGS_PAIR_SIZE                                           \
  40.     (NGX_SPDY_SETTINGS_FID_SIZE + NGX_SPDY_SETTINGS_VAL_SIZE)

  41. #define NGX_SPDY_HIGHEST_PRIORITY     0
  42. #define NGX_SPDY_LOWEST_PRIORITY      7

  43. #define NGX_SPDY_FLAG_FIN             0x01
  44. #define NGX_SPDY_FLAG_UNIDIRECTIONAL  0x02
  45. #define NGX_SPDY_FLAG_CLEAR_SETTINGS  0x01

  46. #define NGX_SPDY_MAX_FRAME_SIZE       ((1 << 24) - 1)

  47. #define NGX_SPDY_DATA_DISCARD         1
  48. #define NGX_SPDY_DATA_ERROR           2
  49. #define NGX_SPDY_DATA_INTERNAL_ERROR  3


  50. typedef struct ngx_http_spdy_connection_s   ngx_http_spdy_connection_t;
  51. typedef struct ngx_http_spdy_out_frame_s    ngx_http_spdy_out_frame_t;


  52. typedef u_char *(*ngx_http_spdy_handler_pt) (ngx_http_spdy_connection_t *sc,
  53.     u_char *pos, u_char *end);

  54. struct ngx_http_spdy_connection_s {
  55.     ngx_connection_t                *connection;
  56.     ngx_http_connection_t           *http_connection;

  57.     ngx_uint_t                       processing;

  58.     size_t                           send_window;
  59.     size_t                           recv_window;
  60.     size_t                           init_window;

  61.     ngx_queue_t                      waiting;

  62.     u_char                           buffer[NGX_SPDY_STATE_BUFFER_SIZE];
  63.     size_t                           buffer_used;
  64.     ngx_http_spdy_handler_pt         handler;

  65.     z_stream                         zstream_in;
  66.     z_stream                         zstream_out;

  67.     ngx_pool_t                      *pool;

  68.     ngx_http_spdy_out_frame_t       *free_ctl_frames;
  69.     ngx_connection_t                *free_fake_connections;

  70.     ngx_http_spdy_stream_t         **streams_index;

  71.     ngx_http_spdy_out_frame_t       *last_out;

  72.     ngx_queue_t                      posted;

  73.     ngx_http_spdy_stream_t          *stream;

  74.     ngx_uint_t                       entries;
  75.     size_t                           length;
  76.     u_char                           flags;

  77.     ngx_uint_t                       last_sid;

  78.     unsigned                         blocked:1;
  79.     unsigned                         incomplete:1;
  80. };


  81. struct ngx_http_spdy_stream_s {
  82.     ngx_uint_t                       id;
  83.     ngx_http_request_t              *request;
  84.     ngx_http_spdy_connection_t      *connection;
  85.     ngx_http_spdy_stream_t          *index;

  86.     ngx_uint_t                       header_buffers;
  87.     ngx_uint_t                       queued;

  88.     /*
  89.      * A change to SETTINGS_INITIAL_WINDOW_SIZE could cause the
  90.      * send_window to become negative, hence it's signed.
  91.      */
  92.     ssize_t                          send_window;
  93.     size_t                           recv_window;

  94.     ngx_http_spdy_out_frame_t       *free_frames;
  95.     ngx_chain_t                     *free_data_headers;
  96.     ngx_chain_t                     *free_bufs;

  97.     ngx_queue_t                      queue;

  98.     unsigned                         priority:3;
  99.     unsigned                         handled:1;
  100.     unsigned                         blocked:1;
  101.     unsigned                         exhausted:1;
  102.     unsigned                         in_closed:1;
  103.     unsigned                         out_closed:1;
  104.     unsigned                         skip_data:2;
  105. };


  106. struct ngx_http_spdy_out_frame_s {
  107.     ngx_http_spdy_out_frame_t       *next;
  108.     ngx_chain_t                     *first;
  109.     ngx_chain_t                     *last;
  110.     ngx_int_t                      (*handler)(ngx_http_spdy_connection_t *sc,
  111.                                         ngx_http_spdy_out_frame_t *frame);

  112.     ngx_http_spdy_stream_t          *stream;
  113.     size_t                           length;

  114.     ngx_uint_t                       priority;
  115.     unsigned                         blocked:1;
  116.     unsigned                         fin:1;
  117. };


  118. static ngx_inline void
  119. ngx_http_spdy_queue_frame(ngx_http_spdy_connection_t *sc,
  120.     ngx_http_spdy_out_frame_t *frame)
  121. {
  122.     ngx_http_spdy_out_frame_t  **out;

  123.     for (out = &sc->last_out; *out; out = &(*out)->next)
  124.     {
  125.         /*
  126.          * NB: higher values represent lower priorities.
  127.          */
  128.         if (frame->priority >= (*out)->priority) {
  129.             break;
  130.         }
  131.     }

  132.     frame->next = *out;
  133.     *out = frame;
  134. }


  135. static ngx_inline void
  136. ngx_http_spdy_queue_blocked_frame(ngx_http_spdy_connection_t *sc,
  137.     ngx_http_spdy_out_frame_t *frame)
  138. {
  139.     ngx_http_spdy_out_frame_t  **out;

  140.     for (out = &sc->last_out; *out; out = &(*out)->next)
  141.     {
  142.         if ((*out)->blocked) {
  143.             break;
  144.         }
  145.     }

  146.     frame->next = *out;
  147.     *out = frame;
  148. }


  149. void ngx_http_spdy_init(ngx_event_t *rev);
  150. void ngx_http_spdy_request_headers_init(void);

  151. ngx_int_t ngx_http_spdy_read_request_body(ngx_http_request_t *r,
  152.     ngx_http_client_body_handler_pt post_handler);

  153. void ngx_http_spdy_close_stream(ngx_http_spdy_stream_t *stream, ngx_int_t rc);

  154. ngx_int_t ngx_http_spdy_send_output_queue(ngx_http_spdy_connection_t *sc);


  155. #define ngx_spdy_frame_aligned_write_uint16(p, s)                             \
  156.     (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t))

  157. #define ngx_spdy_frame_aligned_write_uint32(p, s)                             \
  158.     (*(uint32_t *) (p) = htonl((uint32_t) (s)), (p) + sizeof(uint32_t))

  159. #if (NGX_HAVE_NONALIGNED)

  160. #define ngx_spdy_frame_write_uint16  ngx_spdy_frame_aligned_write_uint16
  161. #define ngx_spdy_frame_write_uint32  ngx_spdy_frame_aligned_write_uint32

  162. #else

  163. #define ngx_spdy_frame_write_uint16(p, s)                                     \
  164.     ((p)[0] = (u_char) ((s) >> 8),                                            \
  165.      (p)[1] = (u_char)  (s),                                                  \
  166.      (p) + sizeof(uint16_t))

  167. #define ngx_spdy_frame_write_uint32(p, s)                                     \
  168.     ((p)[0] = (u_char) ((s) >> 24),                                           \
  169.      (p)[1] = (u_char) ((s) >> 16),                                           \
  170.      (p)[2] = (u_char) ((s) >> 8),                                            \
  171.      (p)[3] = (u_char)  (s),                                                  \
  172.      (p) + sizeof(uint32_t))

  173. #endif


  174. #define ngx_spdy_ctl_frame_head(t)                                            \
  175.     ((uint32_t) NGX_SPDY_CTL_BIT << 31 | NGX_SPDY_VERSION << 16 | (t))

  176. #define ngx_spdy_frame_write_head(p, t)                                       \
  177.     ngx_spdy_frame_aligned_write_uint32(p, ngx_spdy_ctl_frame_head(t))

  178. #define ngx_spdy_frame_write_flags_and_len(p, f, l)                           \
  179.     ngx_spdy_frame_aligned_write_uint32(p, (f) << 24 | (l))
  180. #define ngx_spdy_frame_write_flags_and_id(p, f, i)                            \
  181.     ngx_spdy_frame_aligned_write_uint32(p, (f) << 24 | (i))

  182. #define ngx_spdy_frame_write_sid     ngx_spdy_frame_aligned_write_uint32
  183. #define ngx_spdy_frame_write_window  ngx_spdy_frame_aligned_write_uint32

  184. #endif /* _NGX_HTTP_SPDY_H_INCLUDED_ */