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"
22 struct http_response_s
{
32 http_response_add_data(http_response_t
*response
, const char *data
, int datalen
)
40 newdatasize
= response
->data_size
;
41 while (response
->data_size
+datalen
> newdatasize
) {
44 if (newdatasize
!= response
->data_size
) {
45 response
->data
= realloc(response
->data
, newdatasize
);
46 assert(response
->data
);
48 memcpy(response
->data
+response
->data_length
, data
, datalen
);
49 response
->data_length
+= datalen
;
53 http_response_init(const char *protocol
, int code
, const char *message
)
55 http_response_t
*response
;
58 assert(code
>= 100 && code
< 1000);
60 /* Convert code into string */
61 memset(codestr
, 0, sizeof(codestr
));
62 snprintf(codestr
, sizeof(codestr
), "%u", code
);
64 response
= calloc(1, sizeof(http_response_t
));
69 /* Allocate response data */
70 response
->data_size
= 1024;
71 response
->data
= malloc(response
->data_size
);
72 if (!response
->data
) {
77 /* Add first line of response to the data array */
78 http_response_add_data(response
, protocol
, strlen(protocol
));
79 http_response_add_data(response
, " ", 1);
80 http_response_add_data(response
, codestr
, strlen(codestr
));
81 http_response_add_data(response
, " ", 1);
82 http_response_add_data(response
, message
, strlen(message
));
83 http_response_add_data(response
, "\r\n", 2);
89 http_response_destroy(http_response_t
*response
)
98 http_response_add_header(http_response_t
*response
, const char *name
, const char *value
)
104 http_response_add_data(response
, name
, strlen(name
));
105 http_response_add_data(response
, ": ", 2);
106 http_response_add_data(response
, value
, strlen(value
));
107 http_response_add_data(response
, "\r\n", 2);
111 http_response_finish(http_response_t
*response
, const char *data
, int datalen
)
114 assert(datalen
==0 || (data
&& datalen
> 0));
116 if (data
&& datalen
> 0) {
117 const char *hdrname
= "Content-Length";
120 memset(hdrvalue
, 0, sizeof(hdrvalue
));
121 snprintf(hdrvalue
, sizeof(hdrvalue
)-1, "%d", datalen
);
123 /* Add Content-Length header first */
124 http_response_add_data(response
, hdrname
, strlen(hdrname
));
125 http_response_add_data(response
, ": ", 2);
126 http_response_add_data(response
, hdrvalue
, strlen(hdrvalue
));
127 http_response_add_data(response
, "\r\n\r\n", 4);
129 /* Add data to the end of response */
130 http_response_add_data(response
, data
, datalen
);
132 /* Add extra end of line after headers */
133 http_response_add_data(response
, "\r\n", 2);
135 response
->complete
= 1;
139 http_response_get_data(http_response_t
*response
, int *datalen
)
143 assert(response
->complete
);
145 *datalen
= response
->data_length
;
146 return response
->data
;