summaryrefslogtreecommitdiff
path: root/src/http-message.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/http-message.c')
-rw-r--r--src/http-message.c343
1 files changed, 168 insertions, 175 deletions
diff --git a/src/http-message.c b/src/http-message.c
index ad14ce7..8b94f19 100644
--- a/src/http-message.c
+++ b/src/http-message.c
@@ -30,33 +30,29 @@
* Also, the caller MUST NOT free the memory while the structure is
* still in use---bad things would happen.
*/
-struct http_message_s
-{
- /* Response string and code supplied on the HTTP status line */
- struct
- {
- const char *string;
- int code;
- } response;
-
- /*
- * A group of headers to be sent with this message. Right now
- * the strings are referenced through pointers in an array.
- * I might change this to a vector in the future.
- */
- struct
- {
- const char **strings;
- unsigned int total;
- unsigned int used;
- } headers;
-
- /* Body of the message (most likely an HTML message) */
- struct
- {
- const char *text;
- size_t length;
- } body;
+struct http_message_s {
+ /* Response string and code supplied on the HTTP status line */
+ struct {
+ const char *string;
+ int code;
+ } response;
+
+ /*
+ * A group of headers to be sent with this message. Right now
+ * the strings are referenced through pointers in an array.
+ * I might change this to a vector in the future.
+ */
+ struct {
+ const char **strings;
+ unsigned int total;
+ unsigned int used;
+ } headers;
+
+ /* Body of the message (most likely an HTML message) */
+ struct {
+ const char *text;
+ size_t length;
+ } body;
};
/*
@@ -64,19 +60,18 @@ struct http_message_s
* function. It returns 0 if the message is invalid; otherwise, a positive
* number is returned. Useful for if() tests and assert() tests.
*/
-static int
-is_http_message_valid (http_message_t msg)
+static int is_http_message_valid (http_message_t msg)
{
- if (msg == NULL)
- return 0;
- if (msg->headers.strings == NULL)
- return 0;
- if (msg->response.string == NULL)
- return 0;
- if (msg->response.code < 1 || msg->response.code > 999)
- return 0;
-
- return 1;
+ if (msg == NULL)
+ return 0;
+ if (msg->headers.strings == NULL)
+ return 0;
+ if (msg->response.string == NULL)
+ return 0;
+ if (msg->response.code < 1 || msg->response.code > 999)
+ return 0;
+
+ return 1;
}
/* Initially allocate space for 128 headers */
@@ -89,33 +84,34 @@ is_http_message_valid (http_message_t msg)
http_message_t
http_message_create (int response_code, const char *response_string)
{
- http_message_t msg;
- int ret;
-
- msg = (struct http_message_s *)safecalloc (1, sizeof (struct http_message_s));
- if (msg == NULL)
- return NULL;
-
- msg->headers.strings = (const char **)safecalloc (NUMBER_OF_HEADERS,
- sizeof (char *));
- if (msg->headers.strings == NULL)
- {
- safefree (msg);
- return NULL;
- }
-
- msg->headers.total = NUMBER_OF_HEADERS;
-
- /* Store the HTTP response information in the structure */
- ret = http_message_set_response (msg, response_code, response_string);
- if (IS_HTTP_MSG_ERROR (ret))
- {
- safefree (msg->headers.strings);
- safefree (msg);
- return NULL;
- }
-
- return msg;
+ http_message_t msg;
+ int ret;
+
+ msg =
+ (struct http_message_s *) safecalloc (1,
+ sizeof (struct
+ http_message_s));
+ if (msg == NULL)
+ return NULL;
+
+ msg->headers.strings = (const char **) safecalloc (NUMBER_OF_HEADERS,
+ sizeof (char *));
+ if (msg->headers.strings == NULL) {
+ safefree (msg);
+ return NULL;
+ }
+
+ msg->headers.total = NUMBER_OF_HEADERS;
+
+ /* Store the HTTP response information in the structure */
+ ret = http_message_set_response (msg, response_code, response_string);
+ if (IS_HTTP_MSG_ERROR (ret)) {
+ safefree (msg->headers.strings);
+ safefree (msg);
+ return NULL;
+ }
+
+ return msg;
}
/*
@@ -123,20 +119,19 @@ http_message_create (int response_code, const char *response_string)
* This DOES NOT free the pointers stored in this structure. That memory
* is the responsibility of the caller.
*/
-int
-http_message_destroy (http_message_t msg)
+int http_message_destroy (http_message_t msg)
{
- assert (msg != NULL);
- assert (msg->headers.strings != NULL);
+ assert (msg != NULL);
+ assert (msg->headers.strings != NULL);
- /* Check for valid arguments */
- if (msg == NULL)
- return -EFAULT;
+ /* Check for valid arguments */
+ if (msg == NULL)
+ return -EFAULT;
- if (msg->headers.strings != NULL)
- safefree (msg->headers.strings);
- safefree (msg);
- return 0;
+ if (msg->headers.strings != NULL)
+ safefree (msg->headers.strings);
+ safefree (msg);
+ return 0;
}
/*
@@ -147,40 +142,39 @@ int
http_message_set_response (http_message_t msg,
int response_code, const char *response_string)
{
- /* Check for valid arguments */
- if (msg == NULL)
- return -EFAULT;
- if (response_code < 1 || response_code > 999)
- return -EINVAL;
- if (response_string == NULL)
- return -EINVAL;
- if (strlen (response_string) == 0)
- return -EINVAL;
-
- msg->response.code = response_code;
- msg->response.string = response_string;
-
- return 0;
+ /* Check for valid arguments */
+ if (msg == NULL)
+ return -EFAULT;
+ if (response_code < 1 || response_code > 999)
+ return -EINVAL;
+ if (response_string == NULL)
+ return -EINVAL;
+ if (strlen (response_string) == 0)
+ return -EINVAL;
+
+ msg->response.code = response_code;
+ msg->response.string = response_string;
+
+ return 0;
}
/*
* Set the HTTP message body.
*/
-int
-http_message_set_body (http_message_t msg, const char *body, size_t len)
+int http_message_set_body (http_message_t msg, const char *body, size_t len)
{
- /* Check for valid arguments */
- if (msg == NULL)
- return -EFAULT;
- if (body == NULL)
- return -EINVAL;
- if (len == 0)
- return -EINVAL;
-
- msg->body.text = body;
- msg->body.length = len;
-
- return 0;
+ /* Check for valid arguments */
+ if (msg == NULL)
+ return -EFAULT;
+ if (body == NULL)
+ return -EINVAL;
+ if (len == 0)
+ return -EINVAL;
+
+ msg->body.text = body;
+ msg->body.length = len;
+
+ return 0;
}
/*
@@ -190,89 +184,88 @@ int
http_message_add_headers (http_message_t msg, const char **headers,
unsigned int num_headers)
{
- const char **new_headers;
- unsigned int i;
-
- /* Check for valid arguments */
- if (msg == NULL)
- return -EFAULT;
- if (headers == NULL)
- return -EINVAL;
-
- /*
- * If the number of headers to add is greater than the space
- * available, reallocate the memory.
- */
- if (msg->headers.used + num_headers > msg->headers.total)
- {
- new_headers = (const char **)safecalloc (msg->headers.total * 2,
- sizeof (char *));
- if (new_headers == NULL)
- return -ENOMEM;
-
- /* Copy the array */
- for (i = 0; i != msg->headers.used; ++i)
- new_headers[i] = msg->headers.strings[i];
-
- /* Remove the old array and replace it with the new array */
- safefree (msg->headers.strings);
- msg->headers.strings = new_headers;
- msg->headers.total *= 2;
- }
-
- /*
- * Add the new headers to the structure
- */
- for (i = 0; i != num_headers; ++i)
- msg->headers.strings[i + msg->headers.used] = headers[i];
- msg->headers.used += num_headers;
-
- return 0;
+ const char **new_headers;
+ unsigned int i;
+
+ /* Check for valid arguments */
+ if (msg == NULL)
+ return -EFAULT;
+ if (headers == NULL)
+ return -EINVAL;
+
+ /*
+ * If the number of headers to add is greater than the space
+ * available, reallocate the memory.
+ */
+ if (msg->headers.used + num_headers > msg->headers.total) {
+ new_headers =
+ (const char **) safecalloc (msg->headers.total * 2,
+ sizeof (char *));
+ if (new_headers == NULL)
+ return -ENOMEM;
+
+ /* Copy the array */
+ for (i = 0; i != msg->headers.used; ++i)
+ new_headers[i] = msg->headers.strings[i];
+
+ /* Remove the old array and replace it with the new array */
+ safefree (msg->headers.strings);
+ msg->headers.strings = new_headers;
+ msg->headers.total *= 2;
+ }
+
+ /*
+ * Add the new headers to the structure
+ */
+ for (i = 0; i != num_headers; ++i)
+ msg->headers.strings[i + msg->headers.used] = headers[i];
+ msg->headers.used += num_headers;
+
+ return 0;
}
/*
* Send the completed HTTP message via the supplied file descriptor.
*/
-int
-http_message_send (http_message_t msg, int fd)
+int http_message_send (http_message_t msg, int fd)
{
- char timebuf[30];
- time_t global_time;
- unsigned int i;
+ char timebuf[30];
+ time_t global_time;
+ unsigned int i;
- assert (is_http_message_valid (msg));
+ assert (is_http_message_valid (msg));
- /* Check for valid arguments */
- if (msg == NULL)
- return -EFAULT;
- if (fd < 1)
- return -EBADF;
- if (!is_http_message_valid (msg))
- return -EINVAL;
+ /* Check for valid arguments */
+ if (msg == NULL)
+ return -EFAULT;
+ if (fd < 1)
+ return -EBADF;
+ if (!is_http_message_valid (msg))
+ return -EINVAL;
- /* Write the response line */
- write_message (fd, "HTTP/1.0 %d %s\r\n",
- msg->response.code, msg->response.string);
+ /* Write the response line */
+ write_message (fd, "HTTP/1.0 %d %s\r\n",
+ msg->response.code, msg->response.string);
- /* Go through all the headers */
- for (i = 0; i != msg->headers.used; ++i)
- write_message (fd, "%s\r\n", msg->headers.strings[i]);
+ /* Go through all the headers */
+ for (i = 0; i != msg->headers.used; ++i)
+ write_message (fd, "%s\r\n", msg->headers.strings[i]);
- /* Output the date */
- global_time = time (NULL);
- strftime (timebuf, sizeof (timebuf), "%a, %d %b %Y %H:%M:%S GMT",
- gmtime (&global_time));
- write_message (fd, "Date: %s\r\n", timebuf);
+ /* Output the date */
+ global_time = time (NULL);
+ strftime (timebuf, sizeof (timebuf), "%a, %d %b %Y %H:%M:%S GMT",
+ gmtime (&global_time));
+ write_message (fd, "Date: %s\r\n", timebuf);
- /* Output the content-length */
- write_message (fd, "Content-length: %u\r\n", msg->body.length);
+ /* Output the content-length */
+ write_message (fd, "Content-length: %u\r\n", msg->body.length);
- /* Write the separator between the headers and body */
- safe_write (fd, "\r\n", 2);
+ /* Write the separator between the headers and body */
+ safe_write (fd, "\r\n", 2);
- /* If there's a body, send it! */
- if (msg->body.length > 0)
- safe_write (fd, msg->body.text, msg->body.length);
+ /* If there's a body, send it! */
+ if (msg->body.length > 0)
+ safe_write (fd, msg->body.text, msg->body.length);
- return 0;
+ return 0;
}