41989756e837515be46f96d8cfd52e8fc0dfee8a
2 * Copyright (C) 2011-2012 Juho Vähä-Herttua
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
20 #include "http_response.h"
23 struct http_response_s
{
34 http_response_add_data(http_response_t
*response
, const char *data
, int datalen
)
42 newdatasize
= response
->data_size
;
43 while (response
->data_size
+datalen
> newdatasize
) {
46 if (newdatasize
!= response
->data_size
) {
47 response
->data
= realloc(response
->data
, newdatasize
);
48 assert(response
->data
);
50 memcpy(response
->data
+response
->data_length
, data
, datalen
);
51 response
->data_length
+= datalen
;
55 http_response_init(const char *protocol
, int code
, const char *message
)
57 http_response_t
*response
;
60 assert(code
>= 100 && code
< 1000);
62 /* Convert code into string */
63 memset(codestr
, 0, sizeof(codestr
));
64 snprintf(codestr
, sizeof(codestr
), "%u", code
);
66 response
= calloc(1, sizeof(http_response_t
));
71 /* Allocate response data */
72 response
->data_size
= 1024;
73 response
->data
= malloc(response
->data_size
);
74 if (!response
->data
) {
79 /* Add first line of response to the data array */
80 http_response_add_data(response
, protocol
, strlen(protocol
));
81 http_response_add_data(response
, " ", 1);
82 http_response_add_data(response
, codestr
, strlen(codestr
));
83 http_response_add_data(response
, " ", 1);
84 http_response_add_data(response
, message
, strlen(message
));
85 http_response_add_data(response
, "\r\n", 2);
91 http_response_destroy(http_response_t
*response
)
100 http_response_add_header(http_response_t
*response
, const char *name
, const char *value
)
106 http_response_add_data(response
, name
, strlen(name
));
107 http_response_add_data(response
, ": ", 2);
108 http_response_add_data(response
, value
, strlen(value
));
109 http_response_add_data(response
, "\r\n", 2);
113 http_response_finish(http_response_t
*response
, const char *data
, int datalen
)
116 assert(datalen
==0 || (data
&& datalen
> 0));
118 if (data
&& datalen
> 0) {
119 const char *hdrname
= "Content-Length";
122 memset(hdrvalue
, 0, sizeof(hdrvalue
));
123 snprintf(hdrvalue
, sizeof(hdrvalue
)-1, "%d", datalen
);
125 /* Add Content-Length header first */
126 http_response_add_data(response
, hdrname
, strlen(hdrname
));
127 http_response_add_data(response
, ": ", 2);
128 http_response_add_data(response
, hdrvalue
, strlen(hdrvalue
));
129 http_response_add_data(response
, "\r\n\r\n", 4);
131 /* Add data to the end of response */
132 http_response_add_data(response
, data
, datalen
);
134 /* Add extra end of line after headers */
135 http_response_add_data(response
, "\r\n", 2);
137 response
->complete
= 1;
141 http_response_set_disconnect(http_response_t
*response
, int disconnect
)
145 response
->disconnect
= !!disconnect
;
149 http_response_get_disconnect(http_response_t
*response
)
153 return response
->disconnect
;
157 http_response_get_data(http_response_t
*response
, int *datalen
)
161 assert(response
->complete
);
163 *datalen
= response
->data_length
;
164 return response
->data
;