src/http/v3/ngx_http_v3.h - nginx source code

Data types defined

Macros defined

Source code


  1. /*
  2. * Copyright (C) Roman Arutyunyan
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #ifndef _NGX_HTTP_V3_H_INCLUDED_
  6. #define _NGX_HTTP_V3_H_INCLUDED_


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

  10. #include <ngx_http_v3_parse.h>
  11. #include <ngx_http_v3_encode.h>
  12. #include <ngx_http_v3_uni.h>
  13. #include <ngx_http_v3_table.h>


  14. #define NGX_HTTP_V3_ALPN_PROTO                     "\x02h3"
  15. #define NGX_HTTP_V3_HQ_ALPN_PROTO                  "\x0Ahq-interop"
  16. #define NGX_HTTP_V3_HQ_PROTO                       "hq-interop"

  17. #define NGX_HTTP_V3_VARLEN_INT_LEN                 4
  18. #define NGX_HTTP_V3_PREFIX_INT_LEN                 11

  19. #define NGX_HTTP_V3_STREAM_CONTROL                 0x00
  20. #define NGX_HTTP_V3_STREAM_PUSH                    0x01
  21. #define NGX_HTTP_V3_STREAM_ENCODER                 0x02
  22. #define NGX_HTTP_V3_STREAM_DECODER                 0x03

  23. #define NGX_HTTP_V3_FRAME_DATA                     0x00
  24. #define NGX_HTTP_V3_FRAME_HEADERS                  0x01
  25. #define NGX_HTTP_V3_FRAME_CANCEL_PUSH              0x03
  26. #define NGX_HTTP_V3_FRAME_SETTINGS                 0x04
  27. #define NGX_HTTP_V3_FRAME_PUSH_PROMISE             0x05
  28. #define NGX_HTTP_V3_FRAME_GOAWAY                   0x07
  29. #define NGX_HTTP_V3_FRAME_MAX_PUSH_ID              0x0d

  30. #define NGX_HTTP_V3_PARAM_MAX_TABLE_CAPACITY       0x01
  31. #define NGX_HTTP_V3_PARAM_MAX_FIELD_SECTION_SIZE   0x06
  32. #define NGX_HTTP_V3_PARAM_BLOCKED_STREAMS          0x07

  33. #define NGX_HTTP_V3_MAX_TABLE_CAPACITY             4096

  34. #define NGX_HTTP_V3_STREAM_CLIENT_CONTROL          0
  35. #define NGX_HTTP_V3_STREAM_SERVER_CONTROL          1
  36. #define NGX_HTTP_V3_STREAM_CLIENT_ENCODER          2
  37. #define NGX_HTTP_V3_STREAM_SERVER_ENCODER          3
  38. #define NGX_HTTP_V3_STREAM_CLIENT_DECODER          4
  39. #define NGX_HTTP_V3_STREAM_SERVER_DECODER          5
  40. #define NGX_HTTP_V3_MAX_KNOWN_STREAM               6
  41. #define NGX_HTTP_V3_MAX_UNI_STREAMS                3

  42. /* HTTP/3 errors */
  43. #define NGX_HTTP_V3_ERR_NO_ERROR                   0x100
  44. #define NGX_HTTP_V3_ERR_GENERAL_PROTOCOL_ERROR     0x101
  45. #define NGX_HTTP_V3_ERR_INTERNAL_ERROR             0x102
  46. #define NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR      0x103
  47. #define NGX_HTTP_V3_ERR_CLOSED_CRITICAL_STREAM     0x104
  48. #define NGX_HTTP_V3_ERR_FRAME_UNEXPECTED           0x105
  49. #define NGX_HTTP_V3_ERR_FRAME_ERROR                0x106
  50. #define NGX_HTTP_V3_ERR_EXCESSIVE_LOAD             0x107
  51. #define NGX_HTTP_V3_ERR_ID_ERROR                   0x108
  52. #define NGX_HTTP_V3_ERR_SETTINGS_ERROR             0x109
  53. #define NGX_HTTP_V3_ERR_MISSING_SETTINGS           0x10a
  54. #define NGX_HTTP_V3_ERR_REQUEST_REJECTED           0x10b
  55. #define NGX_HTTP_V3_ERR_REQUEST_CANCELLED          0x10c
  56. #define NGX_HTTP_V3_ERR_REQUEST_INCOMPLETE         0x10d
  57. #define NGX_HTTP_V3_ERR_CONNECT_ERROR              0x10f
  58. #define NGX_HTTP_V3_ERR_VERSION_FALLBACK           0x110

  59. /* QPACK errors */
  60. #define NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED       0x200
  61. #define NGX_HTTP_V3_ERR_ENCODER_STREAM_ERROR       0x201
  62. #define NGX_HTTP_V3_ERR_DECODER_STREAM_ERROR       0x202


  63. #define ngx_http_v3_get_session(c)                                            \
  64.     ((ngx_http_v3_session_t *) ((c)->quic ? (c)->quic->parent->data           \
  65.                                           : (c)->data))

  66. #define ngx_http_quic_get_connection(c)                                       \
  67.     (ngx_http_v3_get_session(c)->http_connection)

  68. #define ngx_http_v3_get_module_loc_conf(c, module)                            \
  69.     ngx_http_get_module_loc_conf(ngx_http_quic_get_connection(c)->conf_ctx,   \
  70.                                  module)

  71. #define ngx_http_v3_get_module_srv_conf(c, module)                            \
  72.     ngx_http_get_module_srv_conf(ngx_http_quic_get_connection(c)->conf_ctx,   \
  73.                                  module)

  74. #define ngx_http_v3_finalize_connection(c, code, reason)                      \
  75.     ngx_quic_finalize_connection((c)->quic ? (c)->quic->parent : (c),         \
  76.                                  code, reason)

  77. #define ngx_http_v3_shutdown_connection(c, code, reason)                      \
  78.     ngx_quic_shutdown_connection((c)->quic ? (c)->quic->parent : (c),         \
  79.                                  code, reason)


  80. typedef struct {
  81.     ngx_flag_t                    enable;
  82.     ngx_flag_t                    enable_hq;
  83.     size_t                        max_table_capacity;
  84.     ngx_uint_t                    max_blocked_streams;
  85.     ngx_uint_t                    max_concurrent_streams;
  86.     ngx_quic_conf_t               quic;
  87. } ngx_http_v3_srv_conf_t;


  88. struct ngx_http_v3_parse_s {
  89.     size_t                        header_limit;
  90.     ngx_http_v3_parse_headers_t   headers;
  91.     ngx_http_v3_parse_data_t      body;
  92.     ngx_array_t                  *cookies;
  93. };


  94. struct ngx_http_v3_session_s {
  95.     ngx_http_connection_t        *http_connection;

  96.     ngx_http_v3_dynamic_table_t   table;

  97.     ngx_event_t                   keepalive;
  98.     ngx_uint_t                    nrequests;

  99.     ngx_queue_t                   blocked;
  100.     ngx_uint_t                    nblocked;

  101.     uint64_t                      next_request_id;

  102.     off_t                         total_bytes;
  103.     off_t                         payload_bytes;

  104.     unsigned                      goaway:1;
  105.     unsigned                      hq:1;

  106.     ngx_connection_t             *known_streams[NGX_HTTP_V3_MAX_KNOWN_STREAM];
  107. };


  108. void ngx_http_v3_init_stream(ngx_connection_t *c);
  109. void ngx_http_v3_reset_stream(ngx_connection_t *c);
  110. ngx_int_t ngx_http_v3_init_session(ngx_connection_t *c);
  111. ngx_int_t ngx_http_v3_check_flood(ngx_connection_t *c);
  112. ngx_int_t ngx_http_v3_init(ngx_connection_t *c);
  113. void ngx_http_v3_shutdown(ngx_connection_t *c);

  114. ngx_int_t ngx_http_v3_read_request_body(ngx_http_request_t *r);
  115. ngx_int_t ngx_http_v3_read_unbuffered_request_body(ngx_http_request_t *r);


  116. extern ngx_module_t  ngx_http_v3_module;


  117. #endif /* _NGX_HTTP_V3_H_INCLUDED_ */