1 /*
2 The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-)
3 Copyright (C) 2001-2020 Aymeric MOIZARD amoizard@antisip.com
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20 #include <osipparser2/internal.h>
21
22 #include <osipparser2/osip_port.h>
23 #include <osipparser2/osip_message.h>
24 #include <osipparser2/osip_parser.h>
25 #include "parser.h"
26
27 #ifndef MINISIZE
28
29 /* Accept-Encoding = token
30 token possible values are gzip,compress,deflate,identity
31 */
osip_message_set_accept_encoding(osip_message_t * sip,const char * hvalue)32 int osip_message_set_accept_encoding(osip_message_t *sip, const char *hvalue) {
33 osip_accept_encoding_t *accept_encoding;
34 int i;
35
36 if (hvalue == NULL || hvalue[0] == '\0')
37 return OSIP_SUCCESS;
38
39 i = osip_accept_encoding_init(&accept_encoding);
40
41 if (i != 0)
42 return i;
43
44 i = osip_accept_encoding_parse(accept_encoding, hvalue);
45
46 if (i != 0) {
47 osip_accept_encoding_free(accept_encoding);
48 return i;
49 }
50
51 sip->message_property = 2;
52 osip_list_add(&sip->accept_encodings, accept_encoding, -1);
53 return OSIP_SUCCESS;
54 }
55
osip_message_get_accept_encoding(const osip_message_t * sip,int pos,osip_accept_encoding_t ** dest)56 int osip_message_get_accept_encoding(const osip_message_t *sip, int pos, osip_accept_encoding_t **dest) {
57 osip_accept_encoding_t *accept_encoding;
58
59 *dest = NULL;
60
61 if (osip_list_size(&sip->accept_encodings) <= pos)
62 return OSIP_UNDEFINED_ERROR; /* does not exist */
63
64 accept_encoding = (osip_accept_encoding_t *) osip_list_get(&sip->accept_encodings, pos);
65 *dest = accept_encoding;
66 return pos;
67 }
68
osip_accept_encoding_init(osip_accept_encoding_t ** accept_encoding)69 int osip_accept_encoding_init(osip_accept_encoding_t **accept_encoding) {
70 *accept_encoding = (osip_accept_encoding_t *) osip_malloc(sizeof(osip_accept_encoding_t));
71
72 if (*accept_encoding == NULL)
73 return OSIP_NOMEM;
74
75 (*accept_encoding)->element = NULL;
76
77 osip_list_init(&(*accept_encoding)->gen_params);
78
79 return OSIP_SUCCESS;
80 }
81
osip_accept_encoding_parse(osip_accept_encoding_t * accept_encoding,const char * hvalue)82 int osip_accept_encoding_parse(osip_accept_encoding_t *accept_encoding, const char *hvalue) {
83 int i;
84 const char *osip_accept_encoding_params;
85
86 osip_accept_encoding_params = strchr(hvalue, ';');
87
88 if (osip_accept_encoding_params != NULL) {
89 i = __osip_generic_param_parseall(&accept_encoding->gen_params, osip_accept_encoding_params);
90
91 if (i != 0)
92 return i;
93
94 } else
95 osip_accept_encoding_params = hvalue + strlen(hvalue);
96
97 if (osip_accept_encoding_params - hvalue + 1 < 2)
98 return OSIP_SYNTAXERROR;
99
100 accept_encoding->element = (char *) osip_malloc(osip_accept_encoding_params - hvalue + 1);
101
102 if (accept_encoding->element == NULL)
103 return OSIP_NOMEM;
104
105 osip_clrncpy(accept_encoding->element, hvalue, osip_accept_encoding_params - hvalue);
106
107 return OSIP_SUCCESS;
108 }
109
110 /* returns the accept_encoding header as a string. */
111 /* INPUT : osip_accept_encoding_t *accept_encoding | accept_encoding header. */
112 /* returns null on error. */
osip_accept_encoding_to_str(const osip_accept_encoding_t * accept_encoding,char ** dest)113 int osip_accept_encoding_to_str(const osip_accept_encoding_t *accept_encoding, char **dest) {
114 char *buf;
115 char *tmp;
116 size_t len;
117
118 *dest = NULL;
119
120 if ((accept_encoding == NULL) || (accept_encoding->element == NULL))
121 return OSIP_BADPARAMETER;
122
123 len = strlen(accept_encoding->element) + 2;
124 buf = (char *) osip_malloc(len);
125
126 if (buf == NULL)
127 return OSIP_NOMEM;
128
129 sprintf(buf, "%s", accept_encoding->element);
130 {
131 size_t plen;
132 osip_list_iterator_t it;
133 osip_generic_param_t *u_param = (osip_generic_param_t *) osip_list_get_first(&accept_encoding->gen_params, &it);
134
135 while (u_param != OSIP_SUCCESS) {
136 if (u_param->gvalue == NULL)
137 plen = strlen(u_param->gname) + 2;
138
139 else
140 plen = strlen(u_param->gname) + strlen(u_param->gvalue) + 3;
141
142 len = len + plen;
143 buf = (char *) osip_realloc(buf, len);
144 tmp = buf;
145 tmp = tmp + strlen(tmp);
146
147 if (u_param->gvalue == NULL)
148 snprintf(tmp, len - (tmp - buf), ";%s", u_param->gname);
149
150 else
151 snprintf(tmp, len - (tmp - buf), ";%s=%s", u_param->gname, u_param->gvalue);
152
153 u_param = (osip_generic_param_t *) osip_list_get_next(&it);
154 }
155 }
156 *dest = buf;
157 return OSIP_SUCCESS;
158 }
159
160 /* deallocates a osip_accept_encoding_t structure. */
161 /* INPUT : osip_accept_encoding_t *accept_encoding | accept_encoding. */
osip_accept_encoding_free(osip_accept_encoding_t * accept_encoding)162 void osip_accept_encoding_free(osip_accept_encoding_t *accept_encoding) {
163 if (accept_encoding == NULL)
164 return;
165
166 osip_free(accept_encoding->element);
167
168 osip_generic_param_freelist(&accept_encoding->gen_params);
169
170 accept_encoding->element = NULL;
171 osip_free(accept_encoding);
172 }
173
osip_accept_encoding_clone(const osip_accept_encoding_t * ctt,osip_accept_encoding_t ** dest)174 int osip_accept_encoding_clone(const osip_accept_encoding_t *ctt, osip_accept_encoding_t **dest) {
175 int i;
176 osip_accept_encoding_t *ct;
177
178 *dest = NULL;
179
180 if (ctt == NULL)
181 return OSIP_BADPARAMETER;
182
183 if (ctt->element == NULL)
184 return OSIP_BADPARAMETER;
185
186 i = osip_accept_encoding_init(&ct);
187
188 if (i != 0) /* allocation failed */
189 return i;
190
191 ct->element = osip_strdup(ctt->element);
192
193 if (ct->element == NULL) {
194 osip_accept_encoding_free(ct);
195 return OSIP_NOMEM;
196 }
197
198 {
199 osip_generic_param_t *dest_param;
200 osip_list_iterator_t it;
201 osip_generic_param_t *u_param = (osip_generic_param_t *) osip_list_get_first(&ctt->gen_params, &it);
202
203 while (u_param != OSIP_SUCCESS) {
204 i = osip_generic_param_clone(u_param, &dest_param);
205
206 if (i != 0) {
207 osip_accept_encoding_free(ct);
208 return i;
209 }
210
211 osip_list_add(&ct->gen_params, dest_param, -1);
212 u_param = (osip_generic_param_t *) osip_list_get_next(&it);
213 }
214 }
215
216 *dest = ct;
217 return OSIP_SUCCESS;
218 }
219
osip_accept_encoding_get_element(const osip_accept_encoding_t * ae)220 char *osip_accept_encoding_get_element(const osip_accept_encoding_t *ae) {
221 return ae->element;
222 }
223
osip_accept_encoding_set_element(osip_accept_encoding_t * ae,char * element)224 void osip_accept_encoding_set_element(osip_accept_encoding_t *ae, char *element) {
225 ae->element = element;
226 }
227
228 #endif
229