summaryrefslogtreecommitdiffstats
path: root/nanohttp/nanohttp-request.c
diff options
context:
space:
mode:
Diffstat (limited to 'nanohttp/nanohttp-request.c')
-rwxr-xr-xnanohttp/nanohttp-request.c389
1 files changed, 198 insertions, 191 deletions
diff --git a/nanohttp/nanohttp-request.c b/nanohttp/nanohttp-request.c
index 9f4fb8b..5f15e93 100755
--- a/nanohttp/nanohttp-request.c
+++ b/nanohttp/nanohttp-request.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: nanohttp-request.c,v 1.6 2005/12/19 14:06:16 snowdrop Exp $
+* $Id: nanohttp-request.c,v 1.7 2006/01/10 11:21:55 snowdrop Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -34,253 +34,260 @@
/* request stuff */
-static
-hrequest_t *hrequest_new()
+static hrequest_t *
+hrequest_new ()
{
- hrequest_t * req = (hrequest_t *) malloc(sizeof(hrequest_t));
+ hrequest_t *req = (hrequest_t *) malloc (sizeof (hrequest_t));
- req->method = HTTP_REQUEST_GET;
- req->version = HTTP_1_1;
- req->query = NULL;
- req->header = NULL;
- req->in = NULL;
- req->attachments = NULL;
- req->content_type = NULL;
+ req->method = HTTP_REQUEST_GET;
+ req->version = HTTP_1_1;
+ req->query = NULL;
+ req->header = NULL;
+ req->in = NULL;
+ req->attachments = NULL;
+ req->content_type = NULL;
- return req;
+ return req;
}
-static
-hrequest_t *
-_hrequest_parse_header(char *data)
+static hrequest_t *
+_hrequest_parse_header (char *data)
{
- hrequest_t *req;
- hpair_t *hpair = NULL, *qpair = NULL, *tmppair = NULL;
-
- char *tmp;
- char *tmp2;
- char *saveptr;
- char *saveptr2;
- char *saveptr3;
- char *result;
- char *key;
- char *opt_key;
- char *opt_value;
- int firstline = 1;
-
- req = hrequest_new();
- tmp = data;
-
- for (;;) {
- result = (char *) strtok_r(tmp, "\r\n", &saveptr);
- tmp = saveptr;
-
- if (result == NULL)
- break;
-
- if (firstline) {
- firstline = 0;
- tmp2 = result;
-
- /* parse [GET|POST] [PATH] [SPEC] */
- key = (char *) strtok_r(tmp2, " ", &saveptr2);
-
- /* save method (get or post) */
- tmp2 = saveptr2;
- if (key != NULL) {
- if (!strcmp(key, "POST"))
- req->method = HTTP_REQUEST_POST;
- else
- req->method = HTTP_REQUEST_GET;
- }
- /* below is key the path and tmp2 the spec */
- key = (char *) strtok_r(tmp2, " ", &saveptr2);
-
- /* save version */
- tmp2 = saveptr2;
- if (tmp2 != NULL) {
- /*req->spec = (char *) malloc(strlen(tmp2) + 1);
- strcpy(req->spec, tmp2);
- */
- if (!strcmp(tmp2, "HTTP/1.0"))
- req-> version = HTTP_1_0;
- else
- req-> version = HTTP_1_1;
- }
- /*
- * parse and save path+query parse:
- * /path/of/target?key1=value1&key2=value2...
- */
-
- if (key != NULL) {
- tmp2 = key;
- key = (char *) strtok_r(tmp2, "?", &saveptr2);
- tmp2 = saveptr2;
-
- /* save path */
- /*req->path = (char *) malloc(strlen(key) + 1);*/
- strncpy(req->path, key, REQUEST_MAX_PATH_SIZE);
-
- /* parse options */
- for (;;) {
- key = (char *) strtok_r(tmp2, "&", &saveptr2);
- tmp2 = saveptr2;
-
- if (key == NULL)
- break;
-
- opt_key = (char *) strtok_r(key, "=", &saveptr3);
- opt_value = saveptr3;
-
- if (opt_value == NULL)
- opt_value = "";
-
- /* create option pair */
- if (opt_key != NULL) {
- tmppair = (hpair_t *) malloc(sizeof(hpair_t));
-
- if (req->query == NULL) {
- req->query = qpair = tmppair;
- } else {
- qpair->next = tmppair;
- qpair = tmppair;
- }
-
- /* fill hpairnode_t struct */
- qpair->next = NULL;
- qpair->key = (char *) malloc(strlen(opt_key) + 1);
- qpair->value = (char *) malloc(strlen(opt_value) + 1);
-
- strcpy(qpair->key, opt_key);
- strcpy(qpair->value, opt_value);
-
- }
- }
- }
- } else {
-
- /* parse "key: value" */
- /* tmp2 = result;
- key = (char *) strtok_r(tmp2, ": ", &saveptr2);
- value = saveptr2;*/
-
- /* create pair */
+ hrequest_t *req;
+ hpair_t *hpair = NULL, *qpair = NULL, *tmppair = NULL;
+
+ char *tmp;
+ char *tmp2;
+ char *saveptr;
+ char *saveptr2;
+ char *saveptr3;
+ char *result;
+ char *key;
+ char *opt_key;
+ char *opt_value;
+ int firstline = 1;
+
+ req = hrequest_new ();
+ tmp = data;
+
+ for (;;)
+ {
+ result = (char *) strtok_r (tmp, "\r\n", &saveptr);
+ tmp = saveptr;
+
+ if (result == NULL)
+ break;
+
+ if (firstline)
+ {
+ firstline = 0;
+ tmp2 = result;
+
+ /* parse [GET|POST] [PATH] [SPEC] */
+ key = (char *) strtok_r (tmp2, " ", &saveptr2);
+
+ /* save method (get or post) */
+ tmp2 = saveptr2;
+ if (key != NULL)
+ {
+ if (!strcmp (key, "POST"))
+ req->method = HTTP_REQUEST_POST;
+ else
+ req->method = HTTP_REQUEST_GET;
+ }
+ /* below is key the path and tmp2 the spec */
+ key = (char *) strtok_r (tmp2, " ", &saveptr2);
+
+ /* save version */
+ tmp2 = saveptr2;
+ if (tmp2 != NULL)
+ {
+ /* req->spec = (char *) malloc(strlen(tmp2) + 1); strcpy(req->spec,
+ tmp2); */
+ if (!strcmp (tmp2, "HTTP/1.0"))
+ req->version = HTTP_1_0;
+ else
+ req->version = HTTP_1_1;
+ }
+ /*
+ * parse and save path+query parse:
+ * /path/of/target?key1=value1&key2=value2...
+ */
+
+ if (key != NULL)
+ {
+ tmp2 = key;
+ key = (char *) strtok_r (tmp2, "?", &saveptr2);
+ tmp2 = saveptr2;
+
+ /* save path */
+ /* req->path = (char *) malloc(strlen(key) + 1); */
+ strncpy (req->path, key, REQUEST_MAX_PATH_SIZE);
+
+ /* parse options */
+ for (;;)
+ {
+ key = (char *) strtok_r (tmp2, "&", &saveptr2);
+ tmp2 = saveptr2;
+
+ if (key == NULL)
+ break;
+
+ opt_key = (char *) strtok_r (key, "=", &saveptr3);
+ opt_value = saveptr3;
+
+ if (opt_value == NULL)
+ opt_value = "";
+
+ /* create option pair */
+ if (opt_key != NULL)
+ {
+ tmppair = (hpair_t *) malloc (sizeof (hpair_t));
+
+ if (req->query == NULL)
+ {
+ req->query = qpair = tmppair;
+ }
+ else
+ {
+ qpair->next = tmppair;
+ qpair = tmppair;
+ }
+
+ /* fill hpairnode_t struct */
+ qpair->next = NULL;
+ qpair->key = (char *) malloc (strlen (opt_key) + 1);
+ qpair->value = (char *) malloc (strlen (opt_value) + 1);
+
+ strcpy (qpair->key, opt_key);
+ strcpy (qpair->value, opt_value);
+
+ }
+ }
+ }
+ }
+ else
+ {
+
+ /* parse "key: value" */
+ /* tmp2 = result; key = (char *) strtok_r(tmp2, ": ", &saveptr2); value
+ = saveptr2; */
+
+ /* create pair */
/* tmppair = (hpair_t *) malloc(sizeof(hpair_t));*/
- tmppair = hpairnode_parse(result, ":", NULL);
-
- if (req->header == NULL) {
- req->header = hpair = tmppair;
- } else {
- hpair->next = tmppair;
- hpair = tmppair;
- }
-
- /* fill pairnode_t struct */
- /*
- hpair->next = NULL;
- hpair->key = (char *) malloc(strlen(key) + 1);
- hpair->value = (char *) malloc(strlen(value) + 1);
-
- strcpy(hpair->key, key);
- strcpy(hpair->value, value);
- */
- }
- }
-
+ tmppair = hpairnode_parse (result, ":", NULL);
+
+ if (req->header == NULL)
+ {
+ req->header = hpair = tmppair;
+ }
+ else
+ {
+ hpair->next = tmppair;
+ hpair = tmppair;
+ }
+
+ /* fill pairnode_t struct */
+ /*
+ hpair->next = NULL; hpair->key = (char *) malloc(strlen(key) + 1);
+ hpair->value = (char *) malloc(strlen(value) + 1);
+
+ strcpy(hpair->key, key); strcpy(hpair->value, value); */
+ }
+ }
+
/* Check Content-type */
- tmp = hpairnode_get(req->header, HEADER_CONTENT_TYPE);
+ tmp = hpairnode_get (req->header, HEADER_CONTENT_TYPE);
if (tmp != NULL)
- req->content_type = content_type_new(tmp);
+ req->content_type = content_type_new (tmp);
- return req;
+ return req;
}
-void
-hrequest_free(hrequest_t * req)
+void
+hrequest_free (hrequest_t * req)
{
- if (req == NULL)
- return;
+ if (req == NULL)
+ return;
- hpairnode_free_deep(req->header);
- hpairnode_free_deep(req->query);
+ hpairnode_free_deep (req->header);
+ hpairnode_free_deep (req->query);
- if (req->in)
- http_input_stream_free(req->in);
+ if (req->in)
+ http_input_stream_free (req->in);
if (req->content_type)
- content_type_free(req->content_type);
+ content_type_free (req->content_type);
if (req->attachments)
- attachments_free(req->attachments);
+ attachments_free (req->attachments);
- free(req);
+ free (req);
}
herror_t
-hrequest_new_from_socket(hsocket_t sock, hrequest_t **out)
+hrequest_new_from_socket (hsocket_t sock, hrequest_t ** out)
{
- int i=0, readed;
- herror_t status;
- hrequest_t *req;
- char buffer[MAX_HEADER_SIZE+1];
- attachments_t *mimeMessage;
+ int i = 0, readed;
+ herror_t status;
+ hrequest_t *req;
+ char buffer[MAX_HEADER_SIZE + 1];
+ attachments_t *mimeMessage;
- memset(buffer, 0, MAX_HEADER_SIZE);
+ memset (buffer, 0, MAX_HEADER_SIZE);
/* Read header */
- while (i<MAX_HEADER_SIZE)
+ while (i < MAX_HEADER_SIZE)
{
- status = hsocket_read(sock, &(buffer[i]), 1, 1, &readed);
+ status = hsocket_read (sock, &(buffer[i]), 1, 1, &readed);
if (status != H_OK)
{
- if(herror_code(status) != HSOCKET_SSL_CLOSE){
- log_error1("Socket read error");
- }
- return status;
+ if (herror_code (status) != HSOCKET_SSL_CLOSE)
+ {
+ log_error1 ("Socket read error");
+ }
+ return status;
}
- buffer[i+1] = '\0'; /* for strmp */
+ buffer[i + 1] = '\0'; /* for strmp */
if (i > 3)
{
- if (!strcmp(&(buffer[i-1]), "\n\n") ||
- !strcmp(&(buffer[i-2]), "\n\r\n"))
- break;
+ if (!strcmp (&(buffer[i - 1]), "\n\n") ||
+ !strcmp (&(buffer[i - 2]), "\n\r\n"))
+ break;
}
i++;
}
/* Create response */
- req = _hrequest_parse_header(buffer);
+ req = _hrequest_parse_header (buffer);
/* Create input stream */
- req->in = http_input_stream_new(sock, req->header);
+ req->in = http_input_stream_new (sock, req->header);
/* Check for MIME message */
- if ((req->content_type &&
- !strcmp(req->content_type->type, "multipart/related")))
+ if ((req->content_type &&
+ !strcmp (req->content_type->type, "multipart/related")))
{
- status = mime_get_attachments(req->content_type, req->in, &mimeMessage);
+ status = mime_get_attachments (req->content_type, req->in, &mimeMessage);
if (status != H_OK)
{
/* TODO (#1#): Handle error */
- hrequest_free(req);
- return status;
+ hrequest_free (req);
+ return status;
}
else
{
req->attachments = mimeMessage;
- req->in = http_input_stream_new_from_file(mimeMessage->root_part->filename);
+ req->in =
+ http_input_stream_new_from_file (mimeMessage->root_part->filename);
}
}
-
+
*out = req;
return H_OK;
}
-
-
-
-