48 assert(header->
value);
52 fprintf(stderr,
"ERROR: HTTP_setname empty name\n");
56 if (
NULL==(newname=realloc(header->
name,strlen(
name)+1))) {
57 perror(
"ERROR: HTTPHeader_setname realloc");
60 header->
name = newname;
68 assert(header->
value);
78 assert(header->
value);
81 if (
NULL==(newvalue=realloc(header->
value,strlen(value)+1))) {
82 perror(
"ERROR: HTTPHeader_setvalue realloc");
85 header->
value = newvalue;
86 strcpy(header->
value,value);
93 assert(header->
value);
105 perror(
"ERROR: HTTPHeader_new");
109 perror(
"ERROR: HTTPHeader_new name");
113 if (
NULL==(header->
value=strdup(value))) {
114 perror(
"ERROR: HTTPHeader_new value");
125 assert(header->
name);
126 assert(header->
value);
136 if (
NULL==(http=malloc(
sizeof(
struct HTTP_s)))) {
137 perror(
"ERROR: HTTP_new HTTP_s");
141 if (
NULL==(http->
body=strdup(
""))) {
142 perror(
"ERROR: HTTP_new body");
148 fprintf(stderr,
"ERROR: HTTP_new headers\n");
165 while (headerlst_entry) {
170 HTTPHeader_del(headerlst_value);
191 if (
NULL==(newbody=realloc(http->
body,strlen(body)+1))) {
192 perror(
"ERROR: HTTP_setbody realloc");
196 http->
body = newbody;
197 strcpy(http->
body, body);
219 fprintf(stderr,
"ERROR: HTTP_addheader empty name\n");
223 if (
NULL==(header = HTTPHeader_new(
name,value))) {
224 fprintf(stderr,
"ERROR: HTTP_addheader HTTPHeader_new\n");
229 fprintf(stderr,
"ERROR: HTTP_addheader\n");
230 HTTPHeader_del(header);
247 if (
NULL==(auth=malloc(strlen(login)+1+strlen(pass)+1))) {
248 perror(
"ERROR: HTTP_addbasicauth credentials");
258 if (
NULL==(auth=malloc(strlen(
"Basic ")+strlen(auth_encoded)+1))) {
259 perror(
"ERROR: HTTP_addbasicauth value");
263 strcpy(auth,
"Basic ");
264 strcat(auth, auth_encoded);
268 fprintf(stderr,
"ERROR: HTTP_addbasicauth addheader\n");
292 assert(header->
self);
293 assert(header->
name);
294 assert(header->
value);
296 headerlst_entry = header->
self;
311 assert(start->
value);
314 headerlst_entry = start->
self;
316 while (headerlst_entry) {
321 assert(headerlst_value);
323 if (0==strcmp(header_name,
name))
327 if (!headerlst_entry)
341 assert(header->
self);
342 assert(header->
name);
343 assert(header->
value);
347 fprintf(stderr,
"ERROR: HTTP_remheader not found\n");
351 HTTPHeader_del(header);
356static char* strconcat(
char* dst,
const char* src) {
362 if (
NULL==(newdst=realloc(dst,strlen(dst)+strlen(src)+1))) {
363 perror(
"ERROR: strconcat");
372 char* headers_str=
NULL;
379 if (
NULL==(headers_str=strdup(
""))) {
380 perror(
"ERROR: HTTP_buildheaders headers_str");
391 assert(headerlst_value);
394 headers_str=strconcat(headers_str,
": ");
396 headers_str=strconcat(headers_str,
"\r\n");
410 if (
NULL==(request=strdup(
""))) {
411 perror(
"ERROR: HTTP_getrequest strdup");
417 if (
NULL==(newrequest=strconcat(request,
"GET"))) {
418 fprintf(stderr,
"ERROR: HTTP_buildrequest method\n");
422 request = newrequest;
434 fprintf(stderr,
"ERROR: HTTP method not supported\n");
441 if (
NULL==(newrequest=strconcat(request,
" "))) {
442 fprintf(stderr,
"ERROR: HTTP_buildrequest uri\n");
446 request = newrequest;
447 if (
NULL==(newrequest=strconcat(request, uri))) {
448 fprintf(stderr,
"ERROR: HTTP_buildrequest uri\n");
452 request = newrequest;
455 if (
NULL==(newrequest=strconcat(request,
" HTTP/"))) {
456 fprintf(stderr,
"ERROR: HTTP_buildrequest HTTP\n");
460 request = newrequest;
464 if (
NULL==(newrequest=strconcat(request,
"1.1"))) {
465 fprintf(stderr,
"ERROR: HTTP_buildrequest Version\n");
469 request = newrequest;
477 fprintf(stderr,
"PANIC: HTTP version not supported\n");
482 if (
NULL==(newrequest=strconcat(request,
"\r\n"))) {
483 fprintf(stderr,
"ERROR: HTTP_buildrequest Version\n");
487 request = newrequest;
490 fprintf(stderr,
"ERROR: HTTP_buildrequest buildheaders\n");
495 if (
NULL==(newrequest=strconcat(request, headers))) {
496 fprintf(stderr,
"ERROR: HTTP_buildrequest header separator\n");
500 request = newrequest;
503 if (
NULL==(newrequest=strconcat(request,
"\r\n"))) {
504 fprintf(stderr,
"ERROR: HTTP_buildrequest header separator\n");
508 request = newrequest;
510 if (
NULL==(newrequest=strconcat(request, http->
body))) {
511 fprintf(stderr,
"ERROR: HTTP_buildrequest body\n");
515 request = newrequest;
522 fprintf(stderr,
"Not yet implemented\n");
533 fprintf(stderr,
"Not yet implemented\n");
541 fprintf(stderr,
"Not yet implemented\n");
550 fprintf(stderr,
"Not yet implemented\n");
char * base64_encode(char *plain)
Encode a zero terminated C string in Base64.
Simple Base64 encoding and decoding functions.
HTTPHeader_t * HTTP_firstheader(const HTTP_t *http)
char * HTTPHeader_getvalue(HTTPHeader_t *header)
HTTP_t * HTTP_remheader(HTTP_t *http, HTTPHeader_t *header)
void HTTP_del(HTTP_t *http)
char * HTTP_buildreply(const HTTP_t *http, const HTTPVersion_t version, const HTTPStatus_t status)
char * HTTP_buildheaders(const HTTP_t *http)
void HTTP_parserequest(const char *request, HTTP_t **http, HTTPMethod_t method, char *uri, HTTPVersion_t version)
void HTTP_parsereply(const char *reply, HTTP_t **http, HTTPVersion_t *version, HTTPStatus_t *status)
struct HTTPHeader_s HTTPHeader_t
HTTP_t * HTTP_parseheaders(const char *text)
HTTPHeader_t * HTTP_addbasicauth(HTTP_t *http, const char *login, const char *pass)
char * HTTP_getbody(HTTP_t *http)
char * HTTP_buildrequest(const HTTP_t *http, const HTTPMethod_t method, const char *uri, const HTTPVersion_t version)
char * HTTPHeader_getname(HTTPHeader_t *header)
HTTPHeader_t * HTTPHeader_setname(HTTPHeader_t *header, const char *name)
HTTPHeader_t * HTTP_findheader(const HTTPHeader_t *start, const char *name)
HTTP_t * HTTP_setbody(HTTP_t *http, const char *body)
HTTPHeader_t * HTTP_addheader(HTTP_t *http, const char *name, const char *value)
HTTPHeader_t * HTTPHeader_setvalue(HTTPHeader_t *header, const char *value)
HTTPHeader_t * HTTP_nextheader(const HTTPHeader_t *header)
HTTP parsing and building library.
enum HTTPVersion_e HTTPVersion_t
enum HTTPStatus_e HTTPStatus_t
enum HTTPMethod_e HTTPMethod_t
void * sclist_getvalue(sclistrecord_t *record)
Returns the value pointer stored in the record.
sclist_t * sclist_new()
Allocate and initialize the internal list structure.
sclistrecord_t * sclist_nextrecord(const sclistrecord_t *record)
Returns the pointer on the record following the specified one.
void sclist_del(sclist_t *sclist)
Free all the list structure but not the values.
sclist_t * sclist_remrecord(sclist_t *sclist, sclistrecord_t *record)
Remove a record in a list.
sclistrecord_t * sclist_addrecord(sclist_t *sclist, void *value)
Add a value at the end of the list.
sclistrecord_t * sclist_firstrecord(const sclist_t *sclist)
Returns the pointer on the first list record.
Basic single chained generic list.
Private list record structure.