diff options
Diffstat (limited to 'nanohttp/nanohttp-response.c')
-rwxr-xr-x | nanohttp/nanohttp-response.c | 267 |
1 files changed, 138 insertions, 129 deletions
diff --git a/nanohttp/nanohttp-response.c b/nanohttp/nanohttp-response.c index 1447345..ee9e762 100755 --- a/nanohttp/nanohttp-response.c +++ b/nanohttp/nanohttp-response.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-response.c,v 1.5 2005/05/27 19:28:15 snowdrop Exp $ +* $Id: nanohttp-response.c,v 1.6 2006/01/10 11:21:55 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -31,196 +31,205 @@ #include <utils/alloc.h> #endif -static -hresponse_t* -hresponse_new() +static hresponse_t * +hresponse_new () { - hresponse_t *res; - - /* create response object */ - res = (hresponse_t *) malloc(sizeof(hresponse_t)); - res->version = HTTP_1_1; - res->errcode = -1; - res->desc[0] = '\0'; - res->header = NULL; - res->in = NULL; - res->content_type = NULL; - res->attachments = NULL; - return res; + hresponse_t *res; + + /* create response object */ + res = (hresponse_t *) malloc (sizeof (hresponse_t)); + res->version = HTTP_1_1; + res->errcode = -1; + res->desc[0] = '\0'; + res->header = NULL; + res->in = NULL; + res->content_type = NULL; + res->attachments = NULL; + return res; } -static -hresponse_t* -_hresponse_parse_header(const char *buffer) +static hresponse_t * +_hresponse_parse_header (const char *buffer) { - hresponse_t *res; - char *s1, *s2, *str; - - /* create response object */ - res = hresponse_new(); - - /* *** parse spec *** */ - /* [HTTP/1.1 | 1.2] [CODE] [DESC] */ - - /* stage 1: HTTP spec */ - str = (char *) strtok_r((char *) buffer, " ", &s2); - s1 = s2; - if (str == NULL) { - log_error1("Parse error reading HTTP spec"); - return NULL; - } - - if (!strcmp(str, "HTTP/1.0")) - res->version = HTTP_1_0; - else - res->version = HTTP_1_1; - - /* stage 2: http code */ - str = (char *) strtok_r(s1, " ", &s2); - s1 = s2; - if (str == NULL) { - log_error1("Parse error reading HTTP code"); - return NULL; - } - res->errcode = atoi(str); - - /* stage 3: description text */ - str = (char *) strtok_r(s1, "\r\n", &s2); - s1 = s2; - if (str == NULL) { - log_error1("Parse error reading HTTP description"); - return NULL; - } + hresponse_t *res; + char *s1, *s2, *str; + + /* create response object */ + res = hresponse_new (); + + /* *** parse spec *** */ + /* [HTTP/1.1 | 1.2] [CODE] [DESC] */ + + /* stage 1: HTTP spec */ + str = (char *) strtok_r ((char *) buffer, " ", &s2); + s1 = s2; + if (str == NULL) + { + log_error1 ("Parse error reading HTTP spec"); + return NULL; + } + + if (!strcmp (str, "HTTP/1.0")) + res->version = HTTP_1_0; + else + res->version = HTTP_1_1; + + /* stage 2: http code */ + str = (char *) strtok_r (s1, " ", &s2); + s1 = s2; + if (str == NULL) + { + log_error1 ("Parse error reading HTTP code"); + return NULL; + } + res->errcode = atoi (str); + + /* stage 3: description text */ + str = (char *) strtok_r (s1, "\r\n", &s2); + s1 = s2; + if (str == NULL) + { + log_error1 ("Parse error reading HTTP description"); + return NULL; + } /* res->desc = (char *) malloc(strlen(str) + 1);*/ - strncpy(res->desc, str, RESPONSE_MAX_DESC_SIZE); - res->desc[strlen(str)] = '\0'; - - /* *** parse header *** */ - /* [key]: [value] */ - for (;;) { - str = strtok_r(s1, "\n", &s2); - s1 = s2; - - /* check if header ends without body */ - if (str == NULL) { - return res; - } - /* check also for end of header */ - if (!strcmp(str, "\r")) { - break; - } - str[strlen(str) - 1] = '\0'; - res->header = hpairnode_parse(str, ":", res->header); - } + strncpy (res->desc, str, RESPONSE_MAX_DESC_SIZE); + res->desc[strlen (str)] = '\0'; + + /* *** parse header *** */ + /* [key]: [value] */ + for (;;) + { + str = strtok_r (s1, "\n", &s2); + s1 = s2; + + /* check if header ends without body */ + if (str == NULL) + { + return res; + } + /* check also for end of header */ + if (!strcmp (str, "\r")) + { + break; + } + str[strlen (str) - 1] = '\0'; + res->header = hpairnode_parse (str, ":", res->header); + } /* Check Content-type */ - str = hpairnode_get(res->header, HEADER_CONTENT_TYPE); + str = hpairnode_get (res->header, HEADER_CONTENT_TYPE); if (str != NULL) - res->content_type = content_type_new(str); + res->content_type = content_type_new (str); - /* return response object */ - return res; + /* return response object */ + return res; } herror_t -hresponse_new_from_socket(hsocket_t sock, hresponse_t **out) +hresponse_new_from_socket (hsocket_t sock, hresponse_t ** out) { - int i=0, readed; - herror_t status; - hresponse_t *res; - attachments_t *mimeMessage; - char buffer[MAX_HEADER_SIZE+1]; + int i = 0, readed; + herror_t status; + hresponse_t *res; + attachments_t *mimeMessage; + char buffer[MAX_HEADER_SIZE + 1]; -read_header: /* for errorcode: 100 (continue) */ +read_header: /* for errorcode: 100 (continue) */ /* 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) { - log_error1("Socket read error"); - return status; + 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 */ - res = _hresponse_parse_header(buffer); + res = _hresponse_parse_header (buffer); if (res == NULL) { - log_error1("Header parse error"); - return herror_new("hresponse_new_from_socket", - GENERAL_HEADER_PARSE_ERROR, "Can not parse response header"); + log_error1 ("Header parse error"); + return herror_new ("hresponse_new_from_socket", + GENERAL_HEADER_PARSE_ERROR, + "Can not parse response header"); } /* Chec for Errorcode: 100 (continue) */ - if (res->errcode == 100) { - hresponse_free(res); - i=0; + if (res->errcode == 100) + { + hresponse_free (res); + i = 0; goto read_header; } /* Create input stream */ - res->in = http_input_stream_new(sock, res->header); + res->in = http_input_stream_new (sock, res->header); /* Check for MIME message */ - if ((res->content_type && - !strcmp(res->content_type->type, "multipart/related"))) + if ((res->content_type && + !strcmp (res->content_type->type, "multipart/related"))) { - status = mime_get_attachments(res->content_type, res->in, &mimeMessage); + status = mime_get_attachments (res->content_type, res->in, &mimeMessage); if (status != H_OK) { /* TODO (#1#): Handle error */ - hresponse_free(res); - return status; + hresponse_free (res); + return status; } else { res->attachments = mimeMessage; - http_input_stream_free(res->in); - res->in = http_input_stream_new_from_file(mimeMessage->root_part->filename); - if (!res->in) { - /* TODO (#1#): Handle error */ - - } else { - /*res->in->deleteOnExit = 1;*/ - } + http_input_stream_free (res->in); + res->in = + http_input_stream_new_from_file (mimeMessage->root_part->filename); + if (!res->in) + { + /* TODO (#1#): Handle error */ + + } + else + { + /* res->in->deleteOnExit = 1; */ + } } } - *out = res; + *out = res; return H_OK; } - -void -hresponse_free(hresponse_t * res) + +void +hresponse_free (hresponse_t * res) { - if (res == NULL) - return; + if (res == NULL) + return; if (res->header) - hpairnode_free_deep(res->header); + hpairnode_free_deep (res->header); if (res->in) - http_input_stream_free(res->in); + http_input_stream_free (res->in); if (res->content_type) - content_type_free(res->content_type); + content_type_free (res->content_type); if (res->attachments) - attachments_free(res->attachments); - free(res); + attachments_free (res->attachments); + free (res); } - |