1 /* 2 * nghttp2 - HTTP/2 C Library 3 * 4 * Copyright (c) 2012 Tatsuhiro Tsujikawa 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining 7 * a copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sublicense, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be 15 * included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 #ifndef NGHTTP2_OUTBOUND_ITEM_H 26 #define NGHTTP2_OUTBOUND_ITEM_H 27 28 #ifdef HAVE_CONFIG_H 29 #include <config.h> 30 #endif /* HAVE_CONFIG_H */ 31 32 #include "nghttp2.h" 33 #include "nghttp2_frame.h" 34 #include "nghttp2_mem.h" 35 36 /* struct used for HEADERS and PUSH_PROMISE frame */ 37 typedef struct { 38 nghttp2_data_provider data_prd; 39 void *stream_user_data; 40 /* error code when request HEADERS is canceled by RST_STREAM while 41 it is in queue. */ 42 uint32_t error_code; 43 /* nonzero if request HEADERS is canceled. The error code is stored 44 in |error_code|. */ 45 uint8_t canceled; 46 } nghttp2_headers_aux_data; 47 48 /* struct used for DATA frame */ 49 typedef struct { 50 /** 51 * The data to be sent for this DATA frame. 52 */ 53 nghttp2_data_provider data_prd; 54 /** 55 * The flags of DATA frame. We use separate flags here and 56 * nghttp2_data frame. The latter contains flags actually sent to 57 * peer. This |flags| may contain NGHTTP2_FLAG_END_STREAM and only 58 * when |eof| becomes nonzero, flags in nghttp2_data has 59 * NGHTTP2_FLAG_END_STREAM set. 60 */ 61 uint8_t flags; 62 /** 63 * The flag to indicate whether EOF was reached or not. Initially 64 * |eof| is 0. It becomes 1 after all data were read. 65 */ 66 uint8_t eof; 67 /** 68 * The flag to indicate that NGHTTP2_DATA_FLAG_NO_COPY is used. 69 */ 70 uint8_t no_copy; 71 } nghttp2_data_aux_data; 72 73 typedef enum { 74 NGHTTP2_GOAWAY_AUX_NONE = 0x0, 75 /* indicates that session should be terminated after the 76 transmission of this frame. */ 77 NGHTTP2_GOAWAY_AUX_TERM_ON_SEND = 0x1, 78 /* indicates that this GOAWAY is just a notification for graceful 79 shutdown. No nghttp2_session.goaway_flags should be updated on 80 the reaction to this frame. */ 81 NGHTTP2_GOAWAY_AUX_SHUTDOWN_NOTICE = 0x2 82 } nghttp2_goaway_aux_flag; 83 84 /* struct used for GOAWAY frame */ 85 typedef struct { 86 /* bitwise-OR of one or more of nghttp2_goaway_aux_flag. */ 87 uint8_t flags; 88 } nghttp2_goaway_aux_data; 89 90 /* struct used for extension frame */ 91 typedef struct { 92 /* nonzero if this extension frame is serialized by library 93 function, instead of user-defined callbacks. */ 94 uint8_t builtin; 95 } nghttp2_ext_aux_data; 96 97 /* Additional data which cannot be stored in nghttp2_frame struct */ 98 typedef union { 99 nghttp2_data_aux_data data; 100 nghttp2_headers_aux_data headers; 101 nghttp2_goaway_aux_data goaway; 102 nghttp2_ext_aux_data ext; 103 } nghttp2_aux_data; 104 105 struct nghttp2_outbound_item; 106 typedef struct nghttp2_outbound_item nghttp2_outbound_item; 107 108 struct nghttp2_outbound_item { 109 nghttp2_frame frame; 110 /* Storage for extension frame payload. frame->ext.payload points 111 to this structure to avoid frequent memory allocation. */ 112 nghttp2_ext_frame_payload ext_frame_payload; 113 nghttp2_aux_data aux_data; 114 /* The priority used in priority comparion. Smaller is served 115 earlier. For PING, SETTINGS and non-DATA frames (excluding 116 response HEADERS frame) have dedicated cycle value defined above. 117 For DATA frame, cycle is computed by taking into account of 118 effective weight and frame payload length previously sent, so 119 that the amount of transmission is distributed across streams 120 proportional to effective weight (inside a tree). */ 121 uint64_t cycle; 122 nghttp2_outbound_item *qnext; 123 /* nonzero if this object is queued, except for DATA or HEADERS 124 which are attached to stream as item. */ 125 uint8_t queued; 126 }; 127 128 /* 129 * Initializes |item|. No memory allocation is done in this function. 130 * Don't call nghttp2_outbound_item_free() until frame member is 131 * initialized. 132 */ 133 void nghttp2_outbound_item_init(nghttp2_outbound_item *item); 134 135 /* 136 * Deallocates resource for |item|. If |item| is NULL, this function 137 * does nothing. 138 */ 139 void nghttp2_outbound_item_free(nghttp2_outbound_item *item, nghttp2_mem *mem); 140 141 /* 142 * queue for nghttp2_outbound_item. 143 */ 144 typedef struct { 145 nghttp2_outbound_item *head, *tail; 146 /* number of items in this queue. */ 147 size_t n; 148 } nghttp2_outbound_queue; 149 150 void nghttp2_outbound_queue_init(nghttp2_outbound_queue *q); 151 152 /* Pushes |item| into |q| */ 153 void nghttp2_outbound_queue_push(nghttp2_outbound_queue *q, 154 nghttp2_outbound_item *item); 155 156 /* Pops |item| at the top from |q|. If |q| is empty, nothing 157 happens. */ 158 void nghttp2_outbound_queue_pop(nghttp2_outbound_queue *q); 159 160 /* Returns the top item. */ 161 #define nghttp2_outbound_queue_top(Q) ((Q)->head) 162 163 /* Returns the size of the queue */ 164 #define nghttp2_outbound_queue_size(Q) ((Q)->n) 165 166 #endif /* NGHTTP2_OUTBOUND_ITEM_H */ 167