mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-10-30 21:51:40 +01:00 
			
		
		
		
	
		
			
	
	
		
			167 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			167 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * 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
 | ||
|  |      ealier.  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 */
 |