diff options
Diffstat (limited to 'nanohttp')
-rw-r--r-- | nanohttp/nanohttp-client.c | 14 | ||||
-rw-r--r-- | nanohttp/nanohttp-common.c | 81 | ||||
-rw-r--r-- | nanohttp/nanohttp-common.h | 18 | ||||
-rwxr-xr-x | nanohttp/nanohttp-mime.c | 11 | ||||
-rwxr-xr-x | nanohttp/nanohttp-response.c | 23 | ||||
-rw-r--r-- | nanohttp/nanohttp-server.c | 7 | ||||
-rw-r--r-- | nanohttp/nanohttp-socket.c | 43 | ||||
-rwxr-xr-x | nanohttp/nanohttp-stream.c | 13 | ||||
-rwxr-xr-x | nanohttp/nanohttp-stream.h | 10 |
9 files changed, 160 insertions, 60 deletions
diff --git a/nanohttp/nanohttp-client.c b/nanohttp/nanohttp-client.c index c393573..039fda4 100644 --- a/nanohttp/nanohttp-client.c +++ b/nanohttp/nanohttp-client.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-client.c,v 1.23 2004/10/28 10:30:46 snowdrop Exp $ +* $Id: nanohttp-client.c,v 1.24 2004/10/29 09:27:05 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -51,18 +51,8 @@ NOTE: This will be called from soap_client_init_args() herror_t httpc_init(int argc, char *argv[]) {
- int i;
- + hoption_init_args(argc, argv);
hsocket_module_init();
- - /* initialize from arguments */
- for (i = 0; i < argc; i++)
- {
- if (!strcmp (argv[i], NHTTP_ARG_LOGFILE) && i < argc - 1)
- {
- log_set_file(argv[i+1]);
- }
- }
return H_OK; } diff --git a/nanohttp/nanohttp-common.c b/nanohttp/nanohttp-common.c index 819c98b..67301e3 100644 --- a/nanohttp/nanohttp-common.c +++ b/nanohttp/nanohttp-common.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-common.c,v 1.15 2004/10/28 10:30:46 snowdrop Exp $ +* $Id: nanohttp-common.c,v 1.16 2004/10/29 09:27:05 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -35,6 +35,72 @@ #endif +#define MAX_OPTION_SIZE 50
+#define MAX_OPTION_VALUE_SIZE 150
+
+static char _hoption_table[MAX_OPTION_SIZE][MAX_OPTION_VALUE_SIZE];
+
+/* option stuff */
+void hoption_set(int opt, const char* value)
+{
+ if (opt >= MAX_OPTION_SIZE) {
+ log_warn3("Option to high (%d >= %d)", opt, MAX_OPTION_SIZE);
+ return;
+ }
+
+ strncpy(_hoption_table[opt], value, MAX_OPTION_VALUE_SIZE);
+}
+
+
+char *hoption_get(int opt)
+{
+ if (opt >= MAX_OPTION_SIZE) {
+ log_warn3("Option to high (%d >= %d)", opt, MAX_OPTION_SIZE);
+ return "";
+ }
+
+ return _hoption_table[opt];
+}
+
+
+void hoption_init_args(int argc, char* argv[])
+{
+ int i;
+
+ hoption_set(HOPTION_TMP_DIR, "."); /* default value */
+
+ /* initialize from arguments */
+ for (i = 0; i < argc; i++)
+ {
+ if (!strcmp (argv[i], NHTTP_ARG_TMPDIR) && i < argc - 1)
+ {
+ hoption_set(HOPTION_TMP_DIR, argv[i+1]);
+ }
+ else if (!strcmp (argv[i], NHTTP_ARG_LOGFILE) && i < argc - 1)
+ {
+ log_set_file(argv[i+1]);
+ }
+ }
+
+
+}
+
+
+#ifdef WIN32
+#ifndef __MINGW32__
+
+/* not thread safe!*/
+char *VisualC_funcname(const char* file, int line)
+{
+ static char buffer[256];
+ int i = strlen(file)-1;
+ while (i>0 && file[i]!='\\')i--;
+ sprintf(buffer, "%s:%d", (file[i]!='\\')?file:(file+i+1), line);
+ return buffer;
+}
+
+#endif
+#endif
typedef struct _herror_impl_t
{
@@ -634,7 +700,8 @@ part_t *part_new(const char *id, const char* filename, { part_t *part = (part_t*)malloc(sizeof(part_t)); part->header = NULL; - part->next = next; + part->next = next;
+ part->deleteOnExit = 0; strcpy(part->id, id); strcpy(part->filename, filename); if (content_type) @@ -662,6 +729,10 @@ void part_free(part_t *part) if (part == NULL)
return;
+ if (part->deleteOnExit) {
+ remove(part->filename);
+ }
+
hpairnode_free_deep(part->header);
free(part);
@@ -707,9 +778,11 @@ void attachments_free(attachments_t *message) part_free(part); part= tmp; } - +
+ if (message->root_part)
+ part_free(message->root_part); /* TODO (#1#): HERE IS A BUG!!!! */ -/* free(message);*/ + free(message); } diff --git a/nanohttp/nanohttp-common.h b/nanohttp/nanohttp-common.h index 79ca625..1d89d30 100644 --- a/nanohttp/nanohttp-common.h +++ b/nanohttp/nanohttp-common.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-common.h,v 1.14 2004/10/28 10:30:46 snowdrop Exp $ + * $Id: nanohttp-common.h,v 1.15 2004/10/29 09:27:05 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -43,6 +43,7 @@ #define NHTTPD_ARG_TERMSIG "-NHTTPtsig"
#define NHTTPD_ARG_MAXCONN "-NHTTPmaxconn"
#define NHTTP_ARG_LOGFILE "-NHTTPlog"
+#define NHTTP_ARG_TMPDIR "-NHTTPtmpdir"
#ifndef SAVE_STR #define SAVE_STR(str) ((str==0)?("(null)"):(str)) @@ -416,7 +417,8 @@ typedef struct _part char content_type[128]; char transfer_encoding[128]; char filename[250]; - struct _part *next; + struct _part *next;
+ int deleteOnExit; /* default is 0 */ }part_t; @@ -447,8 +449,13 @@ attachments_t *attachments_new(); /* should be used internally */ */ void attachments_free(attachments_t *message); void attachments_add_part(attachments_t *attachments, part_t *part);
+
- +/* tmp directory for multipart/related stuff */
+#define HOPTION_TMP_DIR 2
+void hoption_init_args(int argc, char* argv[]);
+void hoption_set(int opt, const char* value);
+char *hoption_get(int opt); /* logging stuff */ @@ -471,8 +478,9 @@ void log_set_file(const char *filename); char *log_get_file();
#ifdef WIN32 - #ifndef __MINGW32__ - #define __FUNCTION__ "***" + #ifndef __MINGW32__
+ char *VisualC_funcname(const char* file, int line); /* not thread safe!*/ + #define __FUNCTION__ VisualC_funcname(__FILE__, __LINE__) #endif #endif diff --git a/nanohttp/nanohttp-mime.c b/nanohttp/nanohttp-mime.c index 2b6794d..5b8a5f4 100755 --- a/nanohttp/nanohttp-mime.c +++ b/nanohttp/nanohttp-mime.c @@ -3,7 +3,7 @@ * | \/ | | | | \/ | | _/ * |_''_| |_| |_''_| |_'/ PARSER * -* $Id: nanohttp-mime.c,v 1.3 2004/10/28 10:30:46 snowdrop Exp $ +* $Id: nanohttp-mime.c,v 1.4 2004/10/29 09:27:05 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -582,7 +582,9 @@ void _mime_part_begin(void *data) sprintf(buffer, "%s/mime_%p_%d.part", cbdata->root_dir, cbdata, cbdata->part_id++); #endif - +
+/* log_info2("Creating FILE ('%s') deleteOnExit=1", buffer);*/
+ part->deleteOnExit = 1; cbdata->current_fd = fopen(buffer, "wb"); if (cbdata->current_fd) strcpy(cbdata->current_part->filename, buffer); @@ -898,10 +900,7 @@ herror_t mime_get_attachments(content_type_t *ctype, http_input_stream_t *in, at "'start' not set for multipart/related");
} - /* TODO (#1#): Set this not to working directory - This must be configured */ - - mimeMessage = mime_message_parse(in, root_id, boundary, "."); + mimeMessage = mime_message_parse(in, root_id, boundary, hoption_get(HOPTION_TMP_DIR)); if (mimeMessage == NULL) { /* TODO (#1#): Handle Error in http form */ diff --git a/nanohttp/nanohttp-response.c b/nanohttp/nanohttp-response.c index f2e13c5..3883950 100755 --- a/nanohttp/nanohttp-response.c +++ b/nanohttp/nanohttp-response.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-response.c,v 1.2 2004/10/28 10:30:46 snowdrop Exp $ +* $Id: nanohttp-response.c,v 1.3 2004/10/29 09:27:05 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -186,8 +186,15 @@ read_header: /* for errorcode: 100 (continue) */ } else { - res->attachments = mimeMessage; - res->in = http_input_stream_new_from_file(mimeMessage->root_part->filename); + 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;*/
+ } } } *out = res; @@ -195,9 +202,9 @@ read_header: /* for errorcode: 100 (continue) */ } - -void -hresponse_free(hresponse_t * res) +
+void
+hresponse_free(hresponse_t * res)
{ if (res == NULL) return; @@ -210,7 +217,9 @@ hresponse_free(hresponse_t * res) if (res->content_type) content_type_free(res->content_type); - +
+ if (res->attachments)
+ attachments_free(res->attachments); free(res); } diff --git a/nanohttp/nanohttp-server.c b/nanohttp/nanohttp-server.c index 71dbba7..566a760 100644 --- a/nanohttp/nanohttp-server.c +++ b/nanohttp/nanohttp-server.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-server.c,v 1.28 2004/10/28 10:30:46 snowdrop Exp $ +* $Id: nanohttp-server.c,v 1.29 2004/10/29 09:27:05 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -99,7 +99,10 @@ httpd_init (int argc, char *argv[]) { int i;
herror_t status; - status = hsocket_module_init (); +
+ hoption_init_args(argc, argv);
+
+ status = hsocket_module_init (); if (status != H_OK) return status; diff --git a/nanohttp/nanohttp-socket.c b/nanohttp/nanohttp-socket.c index 7b378fc..6d93fe2 100644 --- a/nanohttp/nanohttp-socket.c +++ b/nanohttp/nanohttp-socket.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-socket.c,v 1.30 2004/10/28 10:30:46 snowdrop Exp $ +* $Id: nanohttp-socket.c,v 1.31 2004/10/29 09:27:05 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -67,6 +67,14 @@ #ifdef MEM_DEBUG #include <utils/alloc.h> #endif +
+
+#ifdef WIN32
+#undef errno
+#define errno WSAGetLastError()
+#endif
+
+
/*-------------------------------------------------- FUNCTION: hsocket_module_init @@ -133,12 +141,12 @@ hsocket_open (hsocket_t * dsock, const char *hostname, int port) sock = socket (AF_INET, SOCK_STREAM, 0); if (sock <= 0) - return herror_new("hsocket_open", HSOCKET_ERROR_CREATE, strerror (errno));
+ return herror_new("hsocket_open", HSOCKET_ERROR_CREATE, "Socket error: %d", errno);
/* Get host data */ host = gethostbyname (hostname); if (host == NULL) - return herror_new("hsocket_open", HSOCKET_ERROR_GET_HOSTNAME, strerror (errno));
+ return herror_new("hsocket_open", HSOCKET_ERROR_GET_HOSTNAME, "Socket error: %d", errno);
ip = inet_ntoa (*(struct in_addr *) *host->h_addr_list); address.sin_addr.s_addr = inet_addr (ip); @@ -149,7 +157,8 @@ hsocket_open (hsocket_t * dsock, const char *hostname, int port) /* connect to the server */ if (connect (sock, (struct sockaddr *) &address, sizeof (address)) != 0) - return herror_new("hsocket_open", HSOCKET_ERROR_CONNECT, "Connect to '%s:%d' failed", hostname, port);
+/* return herror_new("hsocket_open", HSOCKET_ERROR_CONNECT, "Connect to '%s:%d' failed", hostname, port);*/
+ return herror_new("hsocket_open", HSOCKET_ERROR_CONNECT, "Socket error: %d", errno);
*dsock = sock; return H_OK; @@ -168,8 +177,8 @@ hsocket_bind (hsocket_t * dsock, int port) sock = socket (AF_INET, SOCK_STREAM, 0); if (sock == -1) { - log_error2 ("Can not create socket: '%s'", strerror (errno)); - return herror_new("hsocket_bind", HSOCKET_ERROR_CREATE, strerror (errno));
+ log_error3 ("Can not create socket: '%s'", "Socket error: %d", errno); + return herror_new("hsocket_bind", HSOCKET_ERROR_CREATE, "Socket error: %d", errno);
} /* bind socket */ addr.sin_family = AF_INET; @@ -180,8 +189,8 @@ hsocket_bind (hsocket_t * dsock, int port) if (bind (sock, (struct sockaddr *) &addr, sizeof (struct sockaddr)) == -1) { - log_error2 ("Can not bind: '%s'", strerror (errno)); - return herror_new("hsocket_bind", HSOCKET_ERROR_BIND, strerror (errno));
+ log_error3 ("Can not bind: '%s'", "Socket error: %d", errno); + return herror_new("hsocket_bind", HSOCKET_ERROR_BIND, "Socket error: %d", errno);
} *dsock = sock; return H_OK; @@ -208,7 +217,7 @@ hsocket_accept (hsocket_t sock, hsocket_t * dest) sockfd = accept (sock, (struct sockaddr *) &addr, &asize); if (sockfd == INVALID_SOCKET) { if (WSAGetLastError () != WSAEWOULDBLOCK) - return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, strerror (errno));
+ return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, "Socket error: %d", errno);
} else { break; } @@ -217,7 +226,7 @@ hsocket_accept (hsocket_t sock, hsocket_t * dest) /* TODO (#1#): why not a loop like in win32? */ sockfd = accept (sock, (struct sockaddr *) &addr, &asize); if (sockfd == -1) { - return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, strerror (errno));
+ return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, "Socket error: %d", errno);
} #endif /* TODO (#1#): Write to access.log file */ @@ -241,8 +250,8 @@ hsocket_listen (hsocket_t sock) if (listen (sock, 15) == -1) { - log_error2 ("Can not listen: '%s'", strerror (errno)); - return herror_new("hsocket_listen", HSOCKET_ERROR_LISTEN, strerror (errno));
+ log_error3 ("Can not listen: '%s'", "Socket error: %d", errno); + return herror_new("hsocket_listen", HSOCKET_ERROR_LISTEN, "Socket error: %d", errno);
} return H_OK; @@ -353,10 +362,10 @@ hsocket_nsend (hsocket_t sock, const byte_t *bytes, int n) if (WSAGetLastError () == WSAEWOULDBLOCK) continue; else - return herror_new("hsocket_nsend", HSOCKET_ERROR_SEND, strerror (errno));
+ return herror_new("hsocket_nsend", HSOCKET_ERROR_SEND, "Socket error: %d", errno);
#else if (size == -1) - return herror_new("hsocket_nsend", HSOCKET_ERROR_SEND, strerror (errno));
+ return herror_new("hsocket_nsend", HSOCKET_ERROR_SEND, "Socket error: %d", errno);
#endif n -= size;
total += size; @@ -403,7 +412,7 @@ hsocket_read (hsocket_t sock, byte_t *buffer, int total, int force, int *receive continue; default: log_error2("WSAGetLastError()=%d", wsa_error); - return herror_new("hsocket_read", HSOCKET_ERROR_RECEIVE, strerror (errno));
+ return herror_new("hsocket_read", HSOCKET_ERROR_RECEIVE, "Socket error: %d", errno);
} } @@ -417,7 +426,7 @@ hsocket_read (hsocket_t sock, byte_t *buffer, int total, int force, int *receive } */ if (status == -1) - return herror_new("hsocket_read", HSOCKET_ERROR_RECEIVE, strerror (errno));
+ return herror_new("hsocket_read", HSOCKET_ERROR_RECEIVE, "Socket error: %d", errno);
#endif if (!force) {
@@ -462,7 +471,7 @@ hsocket_block(hsocket_t sock, int block) if (ioctlsocket (sock, FIONBIO, (u_long FAR *) & iMode) == INVALID_SOCKET) { log_error1 ("ioctlsocket error"); - return herror_new("hsocket_block", HSOCKET_ERROR_IOCTL, strerror (errno));
+ return herror_new("hsocket_block", HSOCKET_ERROR_IOCTL, "Socket error: %d", errno);
} #else /* fcntl(sock, F_SETFL, O_NONBLOCK); */ /* TODO (#1#): check for *nix the non blocking sockets */ diff --git a/nanohttp/nanohttp-stream.c b/nanohttp/nanohttp-stream.c index 991d2ab..1951c8a 100755 --- a/nanohttp/nanohttp-stream.c +++ b/nanohttp/nanohttp-stream.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-stream.c,v 1.4 2004/10/28 10:30:47 snowdrop Exp $ +* $Id: nanohttp-stream.c,v 1.5 2004/10/29 09:27:05 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -132,7 +132,8 @@ http_input_stream_t *http_input_stream_new_from_file(const char* filename) result = (http_input_stream_t*)malloc(sizeof(http_input_stream_t)); result->type = HTTP_TRANSFER_FILE; result->fd = fd; - + result->deleteOnExit = 0;
+ strcpy(result->filename, filename); return result; } @@ -141,8 +142,12 @@ http_input_stream_t *http_input_stream_new_from_file(const char* filename) */ void http_input_stream_free(http_input_stream_t *stream) { - if (stream->type == HTTP_TRANSFER_FILE && stream->fd) - fclose(stream->fd); + if (stream->type == HTTP_TRANSFER_FILE && stream->fd) {
+ fclose(stream->fd);
+ if (stream->deleteOnExit)
+ log_info2("Removing '%s'", stream->filename);
+ /*remove(stream->filename);*/
+ } free(stream); } diff --git a/nanohttp/nanohttp-stream.h b/nanohttp/nanohttp-stream.h index 7b0f0f8..b8b345c 100755 --- a/nanohttp/nanohttp-stream.h +++ b/nanohttp/nanohttp-stream.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-stream.h,v 1.3 2004/10/28 10:30:47 snowdrop Exp $ + * $Id: nanohttp-stream.h,v 1.4 2004/10/29 09:27:05 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -93,8 +93,12 @@ typedef struct http_input_stream int received; int content_length; int chunk_size; - byte_t connection_closed; - FILE *fd; + byte_t connection_closed;
+
+ /* file handling */ + FILE *fd;
+ char filename[255];
+ int deleteOnExit; /* default is 0 */ }http_input_stream_t; |