diff options
Diffstat (limited to 'nanohttp')
-rw-r--r-- | nanohttp/nanohttp-client.c | 113 | ||||
-rw-r--r-- | nanohttp/nanohttp-client.h | 11 | ||||
-rw-r--r-- | nanohttp/nanohttp-socket.c | 16 | ||||
-rw-r--r-- | nanohttp/nanohttp-socket.h | 10 |
4 files changed, 132 insertions, 18 deletions
diff --git a/nanohttp/nanohttp-client.c b/nanohttp/nanohttp-client.c index f7d17a6..07c1d2d 100644 --- a/nanohttp/nanohttp-client.c +++ b/nanohttp/nanohttp-client.c @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-client.c,v 1.7 2003/12/18 15:32:09 snowdrop Exp $ + * $Id: nanohttp-client.c,v 1.8 2004/01/05 10:42:15 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -541,10 +541,8 @@ int httpc_receive_response(httpc_conn_t *conn, >0 otherwise. ----------------------------------------------------*/ static -int httpc_talk_to_server(hreq_method method, httpc_conn_t *conn, const char *urlstr, - httpc_response_start_callback start_cb, - httpc_response_callback cb, int content_size, - char* content, void *userdata) +int httpc_talk_to_server(hreq_method method, httpc_conn_t *conn, + const char *urlstr) { hurl_t *url; char buffer[4096]; @@ -610,7 +608,6 @@ int httpc_talk_to_server(hreq_method method, httpc_conn_t *conn, const char *url return 5; } - status = httpc_receive_response(conn, start_cb, cb, userdata); return status; } @@ -630,8 +627,12 @@ int httpc_get_cb(httpc_conn_t *conn, const char *urlstr, { int status; - status = httpc_talk_to_server(HTTP_REQUEST_GET, conn, urlstr, - start_cb, cb, 0, NULL, userdata); + status = httpc_talk_to_server(HTTP_REQUEST_GET, conn, urlstr); + + if (status != HSOCKET_OK) + return status; + + status = httpc_receive_response(conn, start_cb, cb, userdata); return status; } @@ -644,6 +645,8 @@ int httpc_get_cb(httpc_conn_t *conn, const char *urlstr, See the documentation of httpc_talk_to_server() for more information. + + TODO: Add post content rutine ----------------------------------------------------*/ int httpc_post_cb(httpc_conn_t *conn, const char *urlstr, httpc_response_start_callback start_cb, @@ -651,11 +654,21 @@ int httpc_post_cb(httpc_conn_t *conn, const char *urlstr, char *content, void *userdata) { int status; + char buffer[255]; - status = httpc_talk_to_server(HTTP_REQUEST_POST, conn, urlstr, - start_cb, cb, content_size, content, - userdata); - return status; + sprintf(buffer, "%d", content_size); + httpc_set_header(conn, HEADER_CONTENT_LENGTH, buffer); + + status = httpc_talk_to_server(HTTP_REQUEST_POST, conn, urlstr); + if (status != HSOCKET_OK) + return status; + + status = hsocket_nsend(conn->sock, content, content_size); + if (status != HSOCKET_OK) + return status; + + status = httpc_receive_response(conn, start_cb, cb, userdata); + return status; } @@ -760,13 +773,89 @@ hresponse_t *httpc_post(httpc_conn_t *conn, const char *url, +/* + POST Module + */ +/*-------------------------------------------------- + FUNCTION: httpc_post_open +----------------------------------------------------*/ +int httpc_post_open(httpc_conn_t *conn, const char *urlstr) +{ + int status; + + httpc_set_header(conn, HEADER_TRANSFER_ENCODING, "chunked"); + status = httpc_talk_to_server(HTTP_REQUEST_POST, conn, urlstr); + return status; +} +/*-------------------------------------------------- + FUNCTION: httpc_post_send +----------------------------------------------------*/ +int httpc_post_send(httpc_conn_t *conn, + const char* buffer, + int bufsize) +{ + char hexsize[100]; /* chunk size in hex */ + int status; + + sprintf(hexsize, "%x\r\n", bufsize); + + status = hsocket_send(conn->sock, hexsize); + if (status != HSOCKET_OK) + return status; + + status = hsocket_nsend(conn->sock, buffer, bufsize); + if (status != HSOCKET_OK) + return status; + status = hsocket_send(conn->sock, "\r\n"); + + return status; +} + + +/*-------------------------------------------------- + FUNCTION: httpc_post_finish +----------------------------------------------------*/ +hresponse_t *httpc_post_finish(httpc_conn_t *conn) +{ + int status; + hresponse_t *res; + + res = hresponse_new(); + status = httpc_post_finish_cb(conn, httpc_custom_start_callback, + httpc_custom_res_callback, res); + + if (status != 0) { + hresponse_free(res); + return NULL; + } + + return res; +} + + +/*-------------------------------------------------- + FUNCTION: httpc_post_finish_cb +----------------------------------------------------*/ +int httpc_post_finish_cb(httpc_conn_t *conn, + httpc_response_start_callback start_cb, + httpc_response_callback cb, + void *userdata) +{ + int status; + + status = hsocket_send(conn->sock, "0\r\n"); + if (status != HSOCKET_OK) return status; + + status = httpc_receive_response(conn, start_cb, cb, userdata); + return status; +} diff --git a/nanohttp/nanohttp-client.h b/nanohttp/nanohttp-client.h index ed249f8..19ae110 100644 --- a/nanohttp/nanohttp-client.h +++ b/nanohttp/nanohttp-client.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-client.h,v 1.3 2003/12/18 15:32:09 snowdrop Exp $ + * $Id: nanohttp-client.h,v 1.4 2004/01/05 10:42:15 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -72,12 +72,15 @@ int httpc_post_cb(httpc_conn_t *conn, const char *url, -int httpc_post_open(httpc_conn_t *conn); -int httpc_post_send(httpc_conn_t *conn, const char* buffer); +/* + Chunked POST Module + */ +int httpc_post_open(httpc_conn_t *conn, const char *url); +int httpc_post_send(httpc_conn_t *conn, const char* buffer, int bufsize); hresponse_t *httpc_post_finish(httpc_conn_t *conn); int httpc_post_finish_cb(httpc_conn_t *conn, httpc_response_start_callback start_cb, - httpc_response_callback cb); + httpc_response_callback cb, void *userdata); #endif diff --git a/nanohttp/nanohttp-socket.c b/nanohttp/nanohttp-socket.c index 9aaca65..18edcb9 100644 --- a/nanohttp/nanohttp-socket.c +++ b/nanohttp/nanohttp-socket.c @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-socket.c,v 1.4 2003/12/17 12:55:02 snowdrop Exp $ + * $Id: nanohttp-socket.c,v 1.5 2004/01/05 10:42:15 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -133,6 +133,20 @@ void hsocket_close(hsocket_t sock) /*-------------------------------------------------- FUNCTION: hsocket_send ----------------------------------------------------*/ +int hsocket_nsend(hsocket_t sock, const char* buffer, int n) +{ + int size; + + size = send((int)sock, buffer, n, 0); + if (size == -1) + return HSOCKET_CAN_NOT_SEND; + + return HSOCKET_OK; +} + +/*-------------------------------------------------- + FUNCTION: hsocket_send +----------------------------------------------------*/ int hsocket_send(hsocket_t sock, const char* buffer) { int size; diff --git a/nanohttp/nanohttp-socket.h b/nanohttp/nanohttp-socket.h index f5f2d18..d73cf50 100644 --- a/nanohttp/nanohttp-socket.h +++ b/nanohttp/nanohttp-socket.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-socket.h,v 1.3 2003/12/16 14:12:58 snowdrop Exp $ + * $Id: nanohttp-socket.h,v 1.4 2004/01/05 10:42:15 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -72,6 +72,14 @@ void hsocket_close(hsocket_t sock); /* + hsocket_nsend + sends n bytes of data + Returns 0 if success + >0 if fail + */ +int hsocket_nsend(hsocket_t sock, const char* buffer, int n); + +/* hsocket_send sends strlen(buffer) bytes of data Returns 0 if success |