Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 0005b63 in mainline


Ignore:
Timestamp:
2013-09-21T11:22:07Z (8 years ago)
Author:
Martin Sucha <sucha14@…>
Branches:
lfn, master
Children:
c17469e
Parents:
ff364f1
Message:

libhttp: make header api a little bit more flexible

Location:
uspace/lib/http
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/http/headers.c

    rff364f1 r0005b63  
    4949}
    5050
    51 http_header_t *http_header_create(const char *name, const char *value)
     51void http_header_init(http_header_t *header)
    5252{
    53         char *dname = str_dup(name);
    54         if (dname == NULL)
    55                 return NULL;
    56        
    57         char *dvalue = str_dup(value);
    58         if (dvalue == NULL) {
    59                 free(dname);
    60                 return NULL;
    61         }
    62 
    63         return http_header_create_no_copy(dname, dvalue);
     53        link_initialize(&header->link);
     54        header->name = NULL;
     55        header->value = NULL;
    6456}
    6557
    66 http_header_t *http_header_create_no_copy(char *name, char *value)
     58http_header_t *http_header_create(const char *name, const char *value)
    6759{
    6860        http_header_t *header = malloc(sizeof(http_header_t));
    6961        if (header == NULL)
    7062                return NULL;
     63        http_header_init(header);
     64
     65        header->name = str_dup(name);
     66        if (header->name == NULL) {
     67                free(header);
     68                return NULL;
     69        }
    7170       
    72         link_initialize(&header->link);
    73         header->name = name;
    74         header->value = value;
    75        
     71        header->value = str_dup(value);
     72        if (header->value == NULL) {
     73                free(header->name);
     74                free(header);
     75                return NULL;
     76        }
     77
    7678        return header;
    7779}
     
    8486}
    8587
    86 ssize_t http_encode_header(char *buf, size_t buf_size, http_header_t *header)
     88ssize_t http_header_encode(http_header_t *header, char *buf, size_t buf_size)
    8789{
    8890        /* TODO properly split long header values */
     
    9698}
    9799
    98 int http_parse_header(const char *line, char **out_name, char **out_value)
     100int http_header_parse(const char *line, http_header_t *header)
    99101{
    100102        const char *pos = line;
     
    117119        }
    118120       
    119         *out_name = name;
    120         *out_value = value;
     121        header->name = name;
     122        header->value = value;
    121123       
    122124        return EOK;
  • uspace/lib/http/http.h

    rff364f1 r0005b63  
    8181extern http_t *http_create(const char *, uint16_t);
    8282extern int http_connect(http_t *);
     83
     84extern void http_header_init(http_header_t *);
    8385extern http_header_t *http_header_create(const char *, const char *);
    84 extern http_header_t *http_header_create_no_copy(char *, char *);
     86extern int http_header_parse(const char *, http_header_t *);
     87ssize_t http_header_encode(http_header_t *, char *, size_t);
    8588extern void http_header_destroy(http_header_t *);
     89
    8690extern http_request_t *http_request_create(const char *, const char *);
    8791extern void http_request_destroy(http_request_t *);
     
    9094extern int http_parse_status(const char *, http_version_t *, uint16_t *,
    9195    char **);
    92 extern int http_parse_header(const char *, char **, char **);
    93 ssize_t http_encode_header(char *, size_t, http_header_t *);
    9496extern int http_receive_response(http_t *, http_response_t **);
    9597extern int http_receive_body(http_t *, void *, size_t);
  • uspace/lib/http/request.c

    rff364f1 r0005b63  
    105105       
    106106        list_foreach(req->headers, link, http_header_t, header) {
    107                 ssize_t header_size = http_encode_header(NULL, 0, header);
     107                ssize_t header_size = http_header_encode(header, NULL, 0);
    108108                if (header_size < 0)
    109109                        return header_size;
     
    127127       
    128128        list_foreach(req->headers, link, http_header_t, header) {
    129                 written = http_encode_header(pos, pos_size, header);
     129                written = http_header_encode(header, pos, pos_size);
    130130                if (written < 0) {
    131131                        free(buf);
  • uspace/lib/http/response.c

    rff364f1 r0005b63  
    122122                        break;
    123123               
    124                 char *name = NULL;
    125                 char *value = NULL;
    126                 rc = http_parse_header(line, &name, &value);
    127                 if (rc != EOK)
    128                         goto error;
    129                
    130                 http_header_t *header = http_header_create_no_copy(name, value);
     124                http_header_t *header = malloc(sizeof(http_header_t));
    131125                if (header == NULL) {
    132                         free(name);
    133                         free(value);
    134126                        rc = ENOMEM;
    135127                        goto error;
    136128                }
     129                http_header_init(header);
     130               
     131                rc = http_header_parse(line, header);
     132                if (rc != EOK)
     133                        goto error;
    137134               
    138135                list_append(&header->link, &resp->headers);
Note: See TracChangeset for help on using the changeset viewer.