• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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