| /* |
| * nghttp2 - HTTP/2 C Library |
| * |
| * Copyright (c) 2012 Tatsuhiro Tsujikawa |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining |
| * a copy of this software and associated documentation files (the |
| * "Software"), to deal in the Software without restriction, including |
| * without limitation the rights to use, copy, modify, merge, publish, |
| * distribute, sublicense, and/or sell copies of the Software, and to |
| * permit persons to whom the Software is furnished to do so, subject to |
| * the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be |
| * included in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
| * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
| * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
| * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| #ifndef NGHTTP2_OUTBOUND_ITEM_H |
| #define NGHTTP2_OUTBOUND_ITEM_H |
| |
| #ifdef HAVE_CONFIG_H |
| # include <config.h> |
| #endif /* HAVE_CONFIG_H */ |
| |
| #include <nghttp2/nghttp2.h> |
| #include "nghttp2_frame.h" |
| #include "nghttp2_mem.h" |
| |
| /* struct used for HEADERS and PUSH_PROMISE frame */ |
| typedef struct { |
| nghttp2_data_provider data_prd; |
| void *stream_user_data; |
| /* error code when request HEADERS is canceled by RST_STREAM while |
| it is in queue. */ |
| uint32_t error_code; |
| /* nonzero if request HEADERS is canceled. The error code is stored |
| in |error_code|. */ |
| uint8_t canceled; |
| } nghttp2_headers_aux_data; |
| |
| /* struct used for DATA frame */ |
| typedef struct { |
| /** |
| * The data to be sent for this DATA frame. |
| */ |
| nghttp2_data_provider data_prd; |
| /** |
| * The flags of DATA frame. We use separate flags here and |
| * nghttp2_data frame. The latter contains flags actually sent to |
| * peer. This |flags| may contain NGHTTP2_FLAG_END_STREAM and only |
| * when |eof| becomes nonzero, flags in nghttp2_data has |
| * NGHTTP2_FLAG_END_STREAM set. |
| */ |
| uint8_t flags; |
| /** |
| * The flag to indicate whether EOF was reached or not. Initially |
| * |eof| is 0. It becomes 1 after all data were read. |
| */ |
| uint8_t eof; |
| /** |
| * The flag to indicate that NGHTTP2_DATA_FLAG_NO_COPY is used. |
| */ |
| uint8_t no_copy; |
| } nghttp2_data_aux_data; |
| |
| typedef enum { |
| NGHTTP2_GOAWAY_AUX_NONE = 0x0, |
| /* indicates that session should be terminated after the |
| transmission of this frame. */ |
| NGHTTP2_GOAWAY_AUX_TERM_ON_SEND = 0x1, |
| /* indicates that this GOAWAY is just a notification for graceful |
| shutdown. No nghttp2_session.goaway_flags should be updated on |
| the reaction to this frame. */ |
| NGHTTP2_GOAWAY_AUX_SHUTDOWN_NOTICE = 0x2 |
| } nghttp2_goaway_aux_flag; |
| |
| /* struct used for GOAWAY frame */ |
| typedef struct { |
| /* bitwise-OR of one or more of nghttp2_goaway_aux_flag. */ |
| uint8_t flags; |
| } nghttp2_goaway_aux_data; |
| |
| /* struct used for extension frame */ |
| typedef struct { |
| /* nonzero if this extension frame is serialized by library |
| function, instead of user-defined callbacks. */ |
| uint8_t builtin; |
| } nghttp2_ext_aux_data; |
| |
| /* Additional data which cannot be stored in nghttp2_frame struct */ |
| typedef union { |
| nghttp2_data_aux_data data; |
| nghttp2_headers_aux_data headers; |
| nghttp2_goaway_aux_data goaway; |
| nghttp2_ext_aux_data ext; |
| } nghttp2_aux_data; |
| |
| struct nghttp2_outbound_item; |
| typedef struct nghttp2_outbound_item nghttp2_outbound_item; |
| |
| struct nghttp2_outbound_item { |
| nghttp2_frame frame; |
| /* Storage for extension frame payload. frame->ext.payload points |
| to this structure to avoid frequent memory allocation. */ |
| nghttp2_ext_frame_payload ext_frame_payload; |
| nghttp2_aux_data aux_data; |
| /* The priority used in priority comparion. Smaller is served |
| earlier. For PING, SETTINGS and non-DATA frames (excluding |
| response HEADERS frame) have dedicated cycle value defined above. |
| For DATA frame, cycle is computed by taking into account of |
| effective weight and frame payload length previously sent, so |
| that the amount of transmission is distributed across streams |
| proportional to effective weight (inside a tree). */ |
| uint64_t cycle; |
| nghttp2_outbound_item *qnext; |
| /* nonzero if this object is queued, except for DATA or HEADERS |
| which are attached to stream as item. */ |
| uint8_t queued; |
| }; |
| |
| /* |
| * Initializes |item|. No memory allocation is done in this function. |
| * Don't call nghttp2_outbound_item_free() until frame member is |
| * initialized. |
| */ |
| void nghttp2_outbound_item_init(nghttp2_outbound_item *item); |
| |
| /* |
| * Deallocates resource for |item|. If |item| is NULL, this function |
| * does nothing. |
| */ |
| void nghttp2_outbound_item_free(nghttp2_outbound_item *item, nghttp2_mem *mem); |
| |
| /* |
| * queue for nghttp2_outbound_item. |
| */ |
| typedef struct { |
| nghttp2_outbound_item *head, *tail; |
| /* number of items in this queue. */ |
| size_t n; |
| } nghttp2_outbound_queue; |
| |
| void nghttp2_outbound_queue_init(nghttp2_outbound_queue *q); |
| |
| /* Pushes |item| into |q| */ |
| void nghttp2_outbound_queue_push(nghttp2_outbound_queue *q, |
| nghttp2_outbound_item *item); |
| |
| /* Pops |item| at the top from |q|. If |q| is empty, nothing |
| happens. */ |
| void nghttp2_outbound_queue_pop(nghttp2_outbound_queue *q); |
| |
| /* Returns the top item. */ |
| #define nghttp2_outbound_queue_top(Q) ((Q)->head) |
| |
| /* Returns the size of the queue */ |
| #define nghttp2_outbound_queue_size(Q) ((Q)->n) |
| |
| #endif /* NGHTTP2_OUTBOUND_ITEM_H */ |