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 #include "nghttp2_outbound_item.h"
26
27 #include <assert.h>
28 #include <string.h>
29
30 nghttp2_data_provider_wrap *
nghttp2_data_provider_wrap_v1(nghttp2_data_provider_wrap * dpw,const nghttp2_data_provider * data_prd)31 nghttp2_data_provider_wrap_v1(nghttp2_data_provider_wrap *dpw,
32 const nghttp2_data_provider *data_prd) {
33 if (!data_prd) {
34 return NULL;
35 }
36
37 dpw->version = NGHTTP2_DATA_PROVIDER_V1;
38 dpw->data_prd.v1 = *data_prd;
39
40 return dpw;
41 }
42
43 nghttp2_data_provider_wrap *
nghttp2_data_provider_wrap_v2(nghttp2_data_provider_wrap * dpw,const nghttp2_data_provider2 * data_prd)44 nghttp2_data_provider_wrap_v2(nghttp2_data_provider_wrap *dpw,
45 const nghttp2_data_provider2 *data_prd) {
46 if (!data_prd) {
47 return NULL;
48 }
49
50 dpw->version = NGHTTP2_DATA_PROVIDER_V2;
51 dpw->data_prd.v2 = *data_prd;
52
53 return dpw;
54 }
55
nghttp2_outbound_item_init(nghttp2_outbound_item * item)56 void nghttp2_outbound_item_init(nghttp2_outbound_item *item) {
57 item->cycle = 0;
58 item->qnext = NULL;
59 item->queued = 0;
60
61 memset(&item->aux_data, 0, sizeof(nghttp2_aux_data));
62 }
63
nghttp2_outbound_item_free(nghttp2_outbound_item * item,nghttp2_mem * mem)64 void nghttp2_outbound_item_free(nghttp2_outbound_item *item, nghttp2_mem *mem) {
65 nghttp2_frame *frame;
66
67 if (item == NULL) {
68 return;
69 }
70
71 frame = &item->frame;
72
73 switch (frame->hd.type) {
74 case NGHTTP2_DATA:
75 nghttp2_frame_data_free(&frame->data);
76 break;
77 case NGHTTP2_HEADERS:
78 nghttp2_frame_headers_free(&frame->headers, mem);
79 break;
80 case NGHTTP2_PRIORITY:
81 nghttp2_frame_priority_free(&frame->priority);
82 break;
83 case NGHTTP2_RST_STREAM:
84 nghttp2_frame_rst_stream_free(&frame->rst_stream);
85 break;
86 case NGHTTP2_SETTINGS:
87 nghttp2_frame_settings_free(&frame->settings, mem);
88 break;
89 case NGHTTP2_PUSH_PROMISE:
90 nghttp2_frame_push_promise_free(&frame->push_promise, mem);
91 break;
92 case NGHTTP2_PING:
93 nghttp2_frame_ping_free(&frame->ping);
94 break;
95 case NGHTTP2_GOAWAY:
96 nghttp2_frame_goaway_free(&frame->goaway, mem);
97 break;
98 case NGHTTP2_WINDOW_UPDATE:
99 nghttp2_frame_window_update_free(&frame->window_update);
100 break;
101 default: {
102 nghttp2_ext_aux_data *aux_data;
103
104 aux_data = &item->aux_data.ext;
105
106 if (aux_data->builtin == 0) {
107 nghttp2_frame_extension_free(&frame->ext);
108 break;
109 }
110
111 switch (frame->hd.type) {
112 case NGHTTP2_ALTSVC:
113 nghttp2_frame_altsvc_free(&frame->ext, mem);
114 break;
115 case NGHTTP2_ORIGIN:
116 nghttp2_frame_origin_free(&frame->ext, mem);
117 break;
118 case NGHTTP2_PRIORITY_UPDATE:
119 nghttp2_frame_priority_update_free(&frame->ext, mem);
120 break;
121 default:
122 assert(0);
123 break;
124 }
125 }
126 }
127 }
128
nghttp2_outbound_queue_init(nghttp2_outbound_queue * q)129 void nghttp2_outbound_queue_init(nghttp2_outbound_queue *q) {
130 q->head = q->tail = NULL;
131 q->n = 0;
132 }
133
nghttp2_outbound_queue_push(nghttp2_outbound_queue * q,nghttp2_outbound_item * item)134 void nghttp2_outbound_queue_push(nghttp2_outbound_queue *q,
135 nghttp2_outbound_item *item) {
136 if (q->tail) {
137 q->tail = q->tail->qnext = item;
138 } else {
139 q->head = q->tail = item;
140 }
141 ++q->n;
142 }
143
nghttp2_outbound_queue_pop(nghttp2_outbound_queue * q)144 void nghttp2_outbound_queue_pop(nghttp2_outbound_queue *q) {
145 nghttp2_outbound_item *item;
146 if (!q->head) {
147 return;
148 }
149 item = q->head;
150 q->head = q->head->qnext;
151 item->qnext = NULL;
152 if (!q->head) {
153 q->tail = NULL;
154 }
155 --q->n;
156 }
157