mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-03 15:41:47 +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 */
							 |