87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef HV_HTTP2_DEF_H_
 | |
| #define HV_HTTP2_DEF_H_
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| 
 | |
| #define HTTP2_MAGIC             "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
 | |
| #define HTTP2_MAGIC_LEN         24
 | |
| 
 | |
| // length:3bytes + type:1byte + flags:1byte + stream_id:4bytes = 9bytes
 | |
| #define HTTP2_FRAME_HDLEN       9
 | |
| 
 | |
| #define HTTP2_UPGRADE_RESPONSE \
 | |
| "HTTP/1.1 101 Switching Protocols\r\n"\
 | |
| "Connection: Upgrade\r\n"\
 | |
| "Upgrade: h2c\r\n\r\n"
 | |
| 
 | |
| typedef enum {
 | |
|     HTTP2_DATA          = 0,
 | |
|     HTTP2_HEADERS       = 0x01,
 | |
|     HTTP2_PRIORITY      = 0x02,
 | |
|     HTTP2_RST_STREAM    = 0x03,
 | |
|     HTTP2_SETTINGS      = 0x04,
 | |
|     HTTP2_PUSH_PROMISE  = 0x05,
 | |
|     HTTP2_PING          = 0x06,
 | |
|     HTTP2_GOAWAY        = 0x07,
 | |
|     HTTP2_WINDOW_UPDATE = 0x08,
 | |
|     HTTP2_CONTINUATION  = 0x09,
 | |
|     HTTP2_ALTSVC        = 0x0a,
 | |
|     HTTP2_ORIGIN        = 0x0c
 | |
| } http2_frame_type;
 | |
| 
 | |
| typedef enum {
 | |
|     HTTP2_FLAG_NONE         = 0,
 | |
|     HTTP2_FLAG_END_STREAM   = 0x01,
 | |
|     HTTP2_FLAG_END_HEADERS  = 0x04,
 | |
|     HTTP2_FLAG_PADDED       = 0x08,
 | |
|     HTTP2_FLAG_PRIORITY     = 0x20
 | |
| } http2_flag;
 | |
| 
 | |
| typedef struct {
 | |
|     int                 length;
 | |
|     http2_frame_type    type;
 | |
|     http2_flag          flags;
 | |
|     int                 stream_id;
 | |
| } http2_frame_hd;
 | |
| 
 | |
| static inline void http2_frame_hd_pack(const http2_frame_hd* hd, unsigned char* buf) {
 | |
|     // hton
 | |
|     int length = hd->length;
 | |
|     int stream_id = hd->stream_id;
 | |
|     unsigned char* p = buf;
 | |
|     *p++ = (length >> 16) & 0xFF;
 | |
|     *p++ = (length >>  8) & 0xFF;
 | |
|     *p++ =  length        & 0xFF;
 | |
|     *p++ = (unsigned char)hd->type;
 | |
|     *p++ = (unsigned char)hd->flags;
 | |
|     *p++ = (stream_id >> 24) & 0xFF;
 | |
|     *p++ = (stream_id >> 16) & 0xFF;
 | |
|     *p++ = (stream_id >>  8) & 0xFF;
 | |
|     *p++ =  stream_id        & 0xFF;
 | |
| }
 | |
| 
 | |
| static inline void http2_frame_hd_unpack(const unsigned char* buf, http2_frame_hd* hd) {
 | |
|     // ntoh
 | |
|     const unsigned char* p = buf;
 | |
|     hd->length  = *p++ << 16;
 | |
|     hd->length += *p++ << 8;
 | |
|     hd->length += *p++;
 | |
| 
 | |
|     hd->type = (http2_frame_type)*p++;
 | |
|     hd->flags = (http2_flag)*p++;
 | |
| 
 | |
|     hd->stream_id  = *p++ << 24;
 | |
|     hd->stream_id += *p++ << 16;
 | |
|     hd->stream_id += *p++ << 8;
 | |
|     hd->stream_id += *p++;
 | |
| }
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif // HV_HTTP2_DEF_H_
 | 
