diff options
55 files changed, 1511 insertions, 1709 deletions
@@ -1,7 +1,7 @@ +remove most of the typedefs!
------------------------------------------------------------
-ERROR HANDLING !!!!
-------------------------------------------------------------
+improve error handling!!!!
mime_message_t *
@@ -11,6 +11,3 @@ mime_message_parse(http_input_stream_t *in, and try to optimize mime API
-------------------------------------------------------------
-check socket API again
-
diff --git a/configure.ac b/configure.ac index 3f49a2d..6bcfcc9 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,6 @@ - +dnl +dnl package version +dnl AC_INIT(csoap, 1.2.0) AC_CONFIG_SRCDIR([nanohttp/nanohttp-server.c]) diff --git a/examples/csoap/echoattachments-client.c b/examples/csoap/echoattachments-client.c index b128563..26c65ff 100755 --- a/examples/csoap/echoattachments-client.c +++ b/examples/csoap/echoattachments-client.c @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: echoattachments-client.c,v 1.13 2006/11/21 20:58:59 m0gg Exp $ + * $Id: echoattachments-client.c,v 1.14 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: CSOAP examples project * Copyright (C) 2003-2004 Ferhat Ayaz @@ -20,30 +20,22 @@ * * Email: ferhatayaz@yahoo.com ******************************************************************/ -#include <sys/time.h> #include <stdio.h> -#include <netinet/in.h> +#include <stdlib.h> #include <libxml/tree.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> -#include <nanohttp/nanohttp-request.h> -#include <nanohttp/nanohttp-response.h> -#include <nanohttp/nanohttp-client.h> #include <nanohttp/nanohttp-logging.h> #include <libcsoap/soap-env.h> #include <libcsoap/soap-ctx.h> #include <libcsoap/soap-client.h> - static const char *urn = "urn:examples"; static const char *url = "http://localhost:10000/echoattachments"; static const char *method = "echo"; - void compareFiles(const char *received, const char *sent) { @@ -116,14 +108,13 @@ compareFiles(const char *received, const char *sent) } int -main(int argc, char *argv[]) +main(int argc, char **argv) { - SoapCtx *ctx, *ctx2; + struct SoapCtx *ctx, *ctx2; char href[MAX_HREF_SIZE]; xmlNodePtr fault; herror_t err; - if (argc < 2) { fprintf(stderr, "usage: %s <filename> [url]\n", argv[0]); @@ -135,8 +126,7 @@ main(int argc, char *argv[]) err = soap_client_init_args(argc, argv); if (err != H_OK) { - log_error4("[%d] %s():%s ", herror_code(err), herror_func(err), - herror_message(err)); + printf("[%d] %s():%s ", herror_code(err), herror_func(err), herror_message(err)); herror_release(err); return 1; } @@ -146,8 +136,7 @@ main(int argc, char *argv[]) err = soap_ctx_new_with_method(urn, method, &ctx); if (err != H_OK) { - log_error4("[%d] %s():%s ", herror_code(err), herror_func(err), - herror_message(err)); + printf("[%d] %s():%s ", herror_code(err), herror_func(err), herror_message(err)); herror_release(err); return 1; } @@ -157,8 +146,7 @@ main(int argc, char *argv[]) err = soap_ctx_add_file(ctx, argv[1], "application/octet-stream", href); if (err != H_OK) { - log_error4("%s():%s [%d]", herror_func(err), herror_message(err), - herror_code(err)); + printf("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err)); herror_release(err); return 1; } @@ -177,8 +165,7 @@ main(int argc, char *argv[]) if (err != H_OK) { - log_error4("%s():%s [%d]", herror_func(err), herror_message(err), - herror_code(err)); + printf("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err)); herror_release(err); return 1; } @@ -188,7 +175,7 @@ main(int argc, char *argv[]) fault = soap_env_get_fault(ctx2->env); if (fault) { - soap_xml_doc_print(ctx2->env->root->doc); + xmlDocDump(stdout, ctx2->env->root->doc); } else if (ctx2->attachments) { @@ -197,7 +184,7 @@ main(int argc, char *argv[]) else { printf("No attachments!"); - soap_xml_doc_print(ctx2->env->root->doc); + xmlDocDump(stdout, ctx2->env->root->doc); } /* diff --git a/examples/csoap/echoattachments-server.c b/examples/csoap/echoattachments-server.c index a065cc5..abfb7ec 100755 --- a/examples/csoap/echoattachments-server.c +++ b/examples/csoap/echoattachments-server.c @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: echoattachments-server.c,v 1.10 2006/11/21 20:58:59 m0gg Exp $ + * $Id: echoattachments-server.c,v 1.11 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: CSOAP examples project * Copyright (C) 2003-2004 Ferhat Ayaz @@ -22,16 +22,10 @@ ******************************************************************/ #include <stdio.h> #include <stdlib.h> -#include <netinet/in.h> #include <libxml/tree.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> -#include <nanohttp/nanohttp-request.h> -#include <nanohttp/nanohttp-response.h> -#include <nanohttp/nanohttp-server.h> #include <nanohttp/nanohttp-logging.h> #include <libcsoap/soap-env.h> @@ -45,7 +39,7 @@ static const char *urn = "urn:examples"; static const char *method = "echo"; herror_t -echo_attachments(SoapCtx * req, SoapCtx * res) +echo_attachments(struct SoapCtx * req, struct SoapCtx * res) { herror_t err; @@ -70,20 +64,18 @@ echo_attachments(SoapCtx * req, SoapCtx * res) return H_OK; } - int -main(int argc, char *argv[]) +main(int argc, char **argv) { herror_t err; - SoapRouter *router; + struct SoapRouter *router; hlog_set_level(HLOG_VERBOSE); err = soap_server_init_args(argc, argv); if (err != H_OK) { - log_error4("%s():%s [%d]", herror_func(err), herror_message(err), - herror_code(err)); + printf("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err)); herror_release(err); return 1; } diff --git a/examples/csoap/simpleclient.c b/examples/csoap/simpleclient.c index 6a4451e..1e3b3ff 100644 --- a/examples/csoap/simpleclient.c +++ b/examples/csoap/simpleclient.c @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: simpleclient.c,v 1.14 2006/11/21 20:58:59 m0gg Exp $ + * $Id: simpleclient.c,v 1.15 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: CSOAP examples project * Copyright (C) 2003-2004 Ferhat Ayaz @@ -22,18 +22,14 @@ ******************************************************************/ #include <stdio.h> #include <stdlib.h> -#include <netinet/in.h> #include <libxml/tree.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> -#include <nanohttp/nanohttp-request.h> -#include <nanohttp/nanohttp-response.h> -#include <nanohttp/nanohttp-client.h> #include <nanohttp/nanohttp-logging.h> +#include <libcsoap/soap-ctx.h> +#include <libcsoap/soap-env.h> #include <libcsoap/soap-client.h> static char *url = "http://localhost:10000/csoapserver"; @@ -41,12 +37,12 @@ static char *urn = "urn:examples"; static char *method = "sayHello"; int -main(int argc, char *argv[]) +main(int argc, char **argv) { - SoapCtx *ctx, *ctx2; + struct SoapCtx *ctx, *ctx2; herror_t err; - // hlog_set_level(HLOG_VERBOSE); + hlog_set_level(HLOG_VERBOSE); err = soap_client_init_args(argc, argv); if (err != H_OK) @@ -67,7 +63,7 @@ main(int argc, char *argv[]) soap_env_add_item(ctx->env, "xsd:string", "name", "Jonny B. Good"); printf("**** sending ****\n"); - soap_xml_doc_print(ctx->env->root->doc); + xmlDocDump(stderr, ctx->env->root->doc); if (argc > 1) url = argv[1]; @@ -82,7 +78,7 @@ main(int argc, char *argv[]) } printf("**** received ****\n"); - soap_xml_doc_print(ctx2->env->root->doc); + xmlDocDump(stdout, ctx2->env->root->doc); soap_ctx_free(ctx2); soap_ctx_free(ctx); diff --git a/examples/csoap/simpleserver.c b/examples/csoap/simpleserver.c index a433783..c67d0e5 100644 --- a/examples/csoap/simpleserver.c +++ b/examples/csoap/simpleserver.c @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: simpleserver.c,v 1.21 2006/11/21 20:59:02 m0gg Exp $ + * $Id: simpleserver.c,v 1.22 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: CSOAP examples project * Copyright (C) 2003-2004 Ferhat Ayaz @@ -22,16 +22,11 @@ ******************************************************************/ #include <stdio.h> #include <stdlib.h> -#include <netinet/in.h> #include <libxml/tree.h> +#include <libxml/xpath.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> -#include <nanohttp/nanohttp-request.h> -#include <nanohttp/nanohttp-response.h> -#include <nanohttp/nanohttp-server.h> #include <nanohttp/nanohttp-logging.h> #include <libcsoap/soap-xml.h> @@ -46,7 +41,7 @@ static const char const *urn = "urn:examples"; static const char const *method = "sayHello"; herror_t -say_hello(SoapCtx * req, SoapCtx * res) +say_hello(struct SoapCtx *req, struct SoapCtx *res) { herror_t err; char *name; @@ -76,11 +71,11 @@ say_hello(SoapCtx * req, SoapCtx * res) } int -main(int argc, char *argv[]) +main(int argc, char **argv) { herror_t err; - SoapRouter *router; + struct SoapRouter *router; // hlog_set_level(HLOG_VERBOSE); diff --git a/examples/csoap/soapclient.c b/examples/csoap/soapclient.c index c7d55f3..ea7d05f 100644 --- a/examples/csoap/soapclient.c +++ b/examples/csoap/soapclient.c @@ -7,19 +7,15 @@ #include <stdio.h> #include <string.h> #include <ctype.h> -#include <netinet/in.h> #include <libxml/tree.h> #include <libxml/uri.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> -#include <nanohttp/nanohttp-request.h> -#include <nanohttp/nanohttp-response.h> -#include <nanohttp/nanohttp-client.h> -#include <nanohttp/nanohttp-logging.h> +// #include <nanohttp/nanohttp-request.h> +// #include <nanohttp/nanohttp-response.h> +// #include <nanohttp/nanohttp-client.h> #include <libcsoap/soap-fault.h> #include <libcsoap/soap-env.h> @@ -128,7 +124,7 @@ stripcslashes(char *str, int *len) // to the SOAP request */ void -ParseLine(SoapCtx * ctx, char *Buffer, int LineLen) +ParseLine(struct SoapCtx * ctx, char *Buffer, int LineLen) { char *Line, *FirstCommaPos, *SecondCommaPos; int len; @@ -191,7 +187,7 @@ printusage(char *FileName) int main(int argc, char *argv[]) { - SoapCtx *ctx, *ctx2; + struct SoapCtx *ctx, *ctx2; herror_t err; /* create buffer */ @@ -211,7 +207,7 @@ main(int argc, char *argv[]) err = soap_client_init_args(argc, argv); if (err != H_OK) { - log_error4("%s():%s [%d]", herror_func(err), + printf("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err)); herror_release(err); return 1; @@ -221,7 +217,7 @@ main(int argc, char *argv[]) err = soap_ctx_new_with_method(argv[2], argv[3], &ctx); if (err != H_OK) { - log_error4("%s():%s [%d]", herror_func(err), + printf("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err)); herror_release(err); return 1; @@ -244,7 +240,7 @@ main(int argc, char *argv[]) bytes_left = strlen(Buffer); if (bytes_left == MAX_LINE_LENGTH) { - log_error1("The parameter line is too long."); + printf("The parameter line is too long."); herror_release(err); soap_ctx_free(ctx); return 1; @@ -255,7 +251,7 @@ main(int argc, char *argv[]) err = soap_client_invoke(ctx, &ctx2, argv[1], ""); if (err != H_OK) { - log_error4("[%d] %s(): %s ", herror_code(err), + printf("[%d] %s(): %s ", herror_code(err), herror_func(err), herror_message(err)); herror_release(err); soap_ctx_free(ctx); @@ -263,7 +259,7 @@ main(int argc, char *argv[]) } /* print the result */ - soap_xml_doc_print(ctx2->env->root->doc); + xmlDocDump(stdout, ctx2->env->root->doc); /* free the objects */ soap_ctx_free(ctx2); diff --git a/examples/nanohttp/http_client.c b/examples/nanohttp/http_client.c index 4fa5bed..f871739 100644 --- a/examples/nanohttp/http_client.c +++ b/examples/nanohttp/http_client.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: http_client.c,v 1.4 2006/11/21 20:59:02 m0gg Exp $ +* $Id: http_client.c,v 1.5 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C (example) * Copyright (C) 2003-2004 Ferhat Ayaz @@ -24,10 +24,8 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <netinet/in.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> #include <nanohttp/nanohttp-stream.h> #include <nanohttp/nanohttp-request.h> #include <nanohttp/nanohttp-response.h> diff --git a/examples/nanohttp/http_server.c b/examples/nanohttp/http_server.c index 420c32f..950a717 100644 --- a/examples/nanohttp/http_server.c +++ b/examples/nanohttp/http_server.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: http_server.c,v 1.6 2006/11/21 20:59:02 m0gg Exp $ +* $Id: http_server.c,v 1.7 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C (example) * Copyright (C) 2003 Ferhat Ayaz @@ -23,17 +23,15 @@ ******************************************************************/ #include <stdio.h> #include <string.h> -#include <netinet/in.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> #include <nanohttp/nanohttp-stream.h> #include <nanohttp/nanohttp-request.h> #include <nanohttp/nanohttp-response.h> #include <nanohttp/nanohttp-server.h> #include <nanohttp/nanohttp-logging.h> -static int simple_authenticator(hrequest_t *req, const char *user, const char *password) +static int simple_authenticator(struct hrequest_t *req, const char *user, const char *password) { log_info3("logging in user=\"%s\" password=\"%s\"", user, password); @@ -53,11 +51,11 @@ static int simple_authenticator(hrequest_t *req, const char *user, const char *p return 1; } -static void secure_service(httpd_conn_t *conn, hrequest_t *req) +static void secure_service(httpd_conn_t *conn, struct hrequest_t *req) { httpd_send_header(conn, 200, "OK"); - hsocket_send(conn->sock, + http_output_stream_write_string(conn->out, "<html>" "<head>" "<title>Secure ressource!</title>" @@ -70,11 +68,11 @@ static void secure_service(httpd_conn_t *conn, hrequest_t *req) return; } -static void default_service(httpd_conn_t *conn, hrequest_t *req) +static void default_service(httpd_conn_t *conn, struct hrequest_t *req) { httpd_send_header(conn, 404, "Not found"); - hsocket_send(conn->sock, + http_output_stream_write_string(conn->out, "<html>" "<head>" "<title>Default error page</title>" @@ -83,9 +81,9 @@ static void default_service(httpd_conn_t *conn, hrequest_t *req) "<h1>Default error page</h1>" "<div>"); - hsocket_send(conn->sock, req->path); + http_output_stream_write_string(conn->out, req->path); - hsocket_send(conn->sock, " can not be found" + http_output_stream_write_string(conn->out, " can not be found" "</div>" "</body>" "</html>"); @@ -93,12 +91,12 @@ static void default_service(httpd_conn_t *conn, hrequest_t *req) return; } -static void headers_service(httpd_conn_t *conn, hrequest_t *req) +static void headers_service(httpd_conn_t *conn, struct hrequest_t *req) { hpair_t *walker; httpd_send_header(conn, 200, "OK"); - hsocket_send(conn->sock, + http_output_stream_write_string(conn->out, "<html>" "<head>" "<title>Request headers</title>" @@ -109,14 +107,14 @@ static void headers_service(httpd_conn_t *conn, hrequest_t *req) for (walker=req->header; walker; walker=walker->next) { - hsocket_send(conn->sock, "<li>"); - hsocket_send(conn->sock, walker->key); - hsocket_send(conn->sock, " = "); - hsocket_send(conn->sock, walker->value); - hsocket_send(conn->sock, "</li>"); + http_output_stream_write_string(conn->out, "<li>"); + http_output_stream_write_string(conn->out, walker->key); + http_output_stream_write_string(conn->out, " = "); + http_output_stream_write_string(conn->out, walker->value); + http_output_stream_write_string(conn->out, "</li>"); } - hsocket_send(conn->sock, + http_output_stream_write_string(conn->out, "</ul>" "</body>" "</html>"); @@ -124,10 +122,10 @@ static void headers_service(httpd_conn_t *conn, hrequest_t *req) return; } -static void root_service(httpd_conn_t *conn, hrequest_t *req) +static void root_service(httpd_conn_t *conn, struct hrequest_t *req) { httpd_send_header(conn, 200, "OK"); - hsocket_send(conn->sock, + http_output_stream_write_string(conn->out, "<html>" "<head>" "<title>nanoHTTP server examples</title>" @@ -147,7 +145,7 @@ static void root_service(httpd_conn_t *conn, hrequest_t *req) return; } -int main(int argc, char *argv[]) +int main(int argc, char **argv) { hlog_set_level(HLOG_INFO); diff --git a/libcsoap/Makefile.am b/libcsoap/Makefile.am index b2c73f5..a0dc62e 100644 --- a/libcsoap/Makefile.am +++ b/libcsoap/Makefile.am @@ -6,12 +6,12 @@ libcsoap_ladir=$(includedir)/libcsoap-@csoap_release@/libcsoap libcsoap_la_SOURCES=soap-xml.c soap-fault.c soap-env.c soap-service.c \ soap-router.c soap-client.c soap-server.c soap-ctx.c \ soap-admin.c soap-addressing.c soap-transport.c \ - soap-nudp.c soap-nhttp.c + soap-nudp.c soap-nhttp.c soap-wsil.c libcsoap_la_HEADERS=soap-xml.h soap-fault.h soap-env.h soap-service.h \ soap-router.h soap-client.h soap-server.h soap-ctx.h \ soap-admin.h soap-addressing.h soap-transport.h \ - soap-nudp.h soap-nhttp.c + soap-nudp.h soap-nhttp.h soap-wsil.h libcsoap_la_LDFLAGS= -version-info @csoap_version@ -release @csoap_release@ libcsoap_la_CFLAGS=-I${top_srcdir} -D__CSOAP_INTERNAL=1 diff --git a/libcsoap/soap-addressing.c b/libcsoap/soap-addressing.c index b1b9d30..dc75d18 100644 --- a/libcsoap/soap-addressing.c +++ b/libcsoap/soap-addressing.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-addressing.c,v 1.2 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-addressing.c,v 1.3 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2006 Heiko Ronsdorf @@ -61,7 +61,7 @@ #include "soap-env.h" #include "soap-addressing.h" -static const char * +static const xmlChar * _soap_addressing_uuid_error(uint32_t status) { switch(status) @@ -261,7 +261,7 @@ soap_addressing_set_metadata(xmlNodePtr endpoint_reference, xmlNodePtr metadata) } xmlURI * -soap_addressing_get_message_id(SoapEnv *envelope) +soap_addressing_get_message_id(struct SoapEnv *envelope) { xmlNodePtr id; @@ -273,7 +273,7 @@ soap_addressing_get_message_id(SoapEnv *envelope) } xmlNodePtr -soap_addressing_set_message_id(SoapEnv *envelope, xmlURI *id) +soap_addressing_set_message_id(struct SoapEnv *envelope, xmlURI *id) { xmlNodePtr node; @@ -285,13 +285,50 @@ soap_addressing_set_message_id(SoapEnv *envelope, xmlURI *id) } xmlNodePtr -soap_addressing_get_relates_to(SoapEnv *envelope) +soap_addressing_set_message_id_string(struct SoapEnv *envelope, xmlChar *id) +{ + xmlNodePtr node; + xmlChar *tmp; + + if (id == NULL) + tmp = _soap_addressing_generate_id(); + else + tmp = id; + + node = _soap_addressing_get_child_element(envelope->header, WSA_MESSAGE_ID); + if (node == NULL) + node = _soap_addressing_add_node(envelope->header, WSA_MESSAGE_ID, tmp); + else + xmlNodeSetContent(node, tmp); + + if (id == NULL) + xmlFree(tmp); + + return node; +} + +xmlChar *soap_addressing_get_message_id_string(struct SoapEnv *envelope) +{ + xmlURI *uri; + xmlChar *ret; + + if (!(uri = soap_addressing_get_message_id(envelope))) + return NULL; + + ret = xmlSaveUri(uri); + xmlFreeURI(uri); + + return ret; +} + +xmlNodePtr +soap_addressing_get_relates_to(struct SoapEnv *envelope) { return _soap_addressing_get_child_element(envelope->header, WSA_RELATES_TO); } xmlNodePtr -soap_addressing_add_relates_to(SoapEnv *envelope, xmlURI *id, xmlURI *type) +soap_addressing_add_relates_to(struct SoapEnv *envelope, xmlURI *id, xmlURI *type) { xmlNodePtr node; @@ -310,13 +347,13 @@ soap_addressing_add_relates_to(SoapEnv *envelope, xmlURI *id, xmlURI *type) } xmlNodePtr -soap_addressing_get_reply_to(SoapEnv *envelope) +soap_addressing_get_reply_to(struct SoapEnv *envelope) { return _soap_addressing_get_child_element(envelope->header, WSA_REPLY_TO); } xmlNodePtr -soap_addressing_set_reply_to(SoapEnv *envelope, xmlNodePtr address) +soap_addressing_set_reply_to(struct SoapEnv *envelope, xmlNodePtr address) { xmlNodePtr ret; xmlNodePtr node; @@ -337,7 +374,7 @@ soap_addressing_set_reply_to(SoapEnv *envelope, xmlNodePtr address) } xmlURI * -soap_addressing_get_reply_to_address(SoapEnv *envelope) +soap_addressing_get_reply_to_address(struct SoapEnv *envelope) { xmlNodePtr reply_to; @@ -349,7 +386,7 @@ soap_addressing_get_reply_to_address(SoapEnv *envelope) } xmlNodePtr -soap_addressing_set_reply_to_address(SoapEnv *envelope, xmlURI *address) +soap_addressing_set_reply_to_address(struct SoapEnv *envelope, xmlURI *address) { xmlNodePtr ret; xmlNodePtr node; @@ -368,13 +405,13 @@ soap_addressing_set_reply_to_address(SoapEnv *envelope, xmlURI *address) } xmlNodePtr -soap_addressing_get_from(SoapEnv *envelope) +soap_addressing_get_from(struct SoapEnv *envelope) { return _soap_addressing_get_child_element(envelope->header, WSA_FROM); } xmlNodePtr -soap_addressing_set_from(SoapEnv *envelope, xmlNodePtr address) +soap_addressing_set_from(struct SoapEnv *envelope, xmlNodePtr address) { xmlNodePtr ret; xmlNodePtr node; @@ -395,7 +432,7 @@ soap_addressing_set_from(SoapEnv *envelope, xmlNodePtr address) } xmlURI * -soap_addressing_get_from_address(SoapEnv *envelope) +soap_addressing_get_from_address(struct SoapEnv *envelope) { xmlNodePtr from; @@ -407,7 +444,7 @@ soap_addressing_get_from_address(SoapEnv *envelope) } xmlNodePtr -soap_addressing_set_from_address(SoapEnv *envelope, xmlURI *address) +soap_addressing_set_from_address(struct SoapEnv *envelope, xmlURI *address) { xmlNodePtr ret; xmlNodePtr node; @@ -426,13 +463,13 @@ soap_addressing_set_from_address(SoapEnv *envelope, xmlURI *address) } xmlNodePtr -soap_addressing_get_fault_to(SoapEnv *envelope) +soap_addressing_get_fault_to(struct SoapEnv *envelope) { return _soap_addressing_get_child_element(envelope->header, WSA_FAULT_TO); } xmlNodePtr -soap_addressing_set_fault_to(SoapEnv *envelope, xmlNodePtr address) +soap_addressing_set_fault_to(struct SoapEnv *envelope, xmlNodePtr address) { xmlNodePtr ret; xmlNodePtr node; @@ -453,7 +490,7 @@ soap_addressing_set_fault_to(SoapEnv *envelope, xmlNodePtr address) } xmlURI * -soap_addressing_get_fault_to_address(SoapEnv *envelope) +soap_addressing_get_fault_to_address(struct SoapEnv *envelope) { xmlNodePtr fault_to; @@ -465,7 +502,7 @@ soap_addressing_get_fault_to_address(SoapEnv *envelope) } xmlNodePtr -soap_addressing_set_fault_to_address(SoapEnv *envelope, xmlURI *address) +soap_addressing_set_fault_to_address(struct SoapEnv *envelope, xmlURI *address) { xmlNodePtr ret; xmlNodePtr node; @@ -484,13 +521,13 @@ soap_addressing_set_fault_to_address(SoapEnv *envelope, xmlURI *address) } xmlNodePtr -soap_addressing_get_to(SoapEnv *envelope) +soap_addressing_get_to(struct SoapEnv *envelope) { return _soap_addressing_get_child_element(envelope->header, WSA_TO); } xmlNodePtr -soap_addressing_set_to(SoapEnv *envelope, xmlNodePtr address) +soap_addressing_set_to(struct SoapEnv *envelope, xmlNodePtr address) { xmlNodePtr ret; xmlNodePtr node; @@ -511,7 +548,7 @@ soap_addressing_set_to(SoapEnv *envelope, xmlNodePtr address) } xmlURI * -soap_addressing_get_to_address(SoapEnv *envelope) +soap_addressing_get_to_address(struct SoapEnv *envelope) { xmlNodePtr to; @@ -522,7 +559,7 @@ soap_addressing_get_to_address(SoapEnv *envelope) } xmlChar * -soap_addressing_get_to_address_string(SoapEnv *envelope) +soap_addressing_get_to_address_string(struct SoapEnv *envelope) { xmlURI *uri; xmlChar *ret; @@ -537,7 +574,7 @@ soap_addressing_get_to_address_string(SoapEnv *envelope) } xmlNodePtr -soap_addressing_set_to_address_string(SoapEnv *envelope, const char *to) +soap_addressing_set_to_address_string(struct SoapEnv *envelope, const char *to) { xmlURI *uri; xmlNodePtr ret; @@ -552,7 +589,7 @@ soap_addressing_set_to_address_string(SoapEnv *envelope, const char *to) } xmlNodePtr -soap_addressing_set_to_address(SoapEnv *envelope, xmlURI *address) +soap_addressing_set_to_address(struct SoapEnv *envelope, xmlURI *address) { xmlNodePtr ret; xmlNodePtr node; @@ -571,7 +608,7 @@ soap_addressing_set_to_address(SoapEnv *envelope, xmlURI *address) } xmlURI * -soap_addressing_get_action(SoapEnv *envelope) +soap_addressing_get_action(struct SoapEnv *envelope) { xmlNodePtr action; @@ -583,7 +620,7 @@ soap_addressing_get_action(SoapEnv *envelope) } xmlChar * -soap_addressing_get_action_string(SoapEnv *envelope) +soap_addressing_get_action_string(struct SoapEnv *envelope) { xmlURI *uri; xmlChar *ret; @@ -598,7 +635,7 @@ soap_addressing_get_action_string(SoapEnv *envelope) } xmlNodePtr -soap_addressing_set_action(SoapEnv *envelope, xmlURI *action) +soap_addressing_set_action(struct SoapEnv *envelope, xmlURI *action) { xmlNodePtr node; @@ -610,7 +647,7 @@ soap_addressing_set_action(SoapEnv *envelope, xmlURI *action) } xmlNodePtr -soap_addressing_set_action_string(SoapEnv *envelope, const char *action) +soap_addressing_set_action_string(struct SoapEnv *envelope, const char *action) { xmlURI *uri; xmlNodePtr ret; diff --git a/libcsoap/soap-addressing.h b/libcsoap/soap-addressing.h index 0677244..224fd33 100644 --- a/libcsoap/soap-addressing.h +++ b/libcsoap/soap-addressing.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-addressing.h,v 1.2 2006/11/21 20:59:02 m0gg Exp $ + * $Id: soap-addressing.h,v 1.3 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2006 Heiko Ronsdorf @@ -35,7 +35,7 @@ * in a transport-neutral manner. * * @author H. Ronsdorf - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ * @see http://www.w3.org/TR/ws-addr-core/ * */ @@ -196,45 +196,45 @@ xmlNodePtr soap_addressing_set_reference_properties(xmlNodePtr endpoint_referenc xmlNodePtr soap_addressing_get_metadata(xmlNodePtr endpoint_reference); xmlNodePtr soap_addressing_set_metadata(xmlNodePtr endpoint_reference, xmlNodePtr parameter); -xmlURI *soap_addressing_get_message_id(SoapEnv *envelope); -xmlNodePtr soap_addressing_set_message_id(SoapEnv *envelope, xmlURI *id); +xmlURI *soap_addressing_get_message_id(struct SoapEnv *envelope); +xmlNodePtr soap_addressing_set_message_id(struct SoapEnv *envelope, xmlURI *id); -xmlNodePtr soap_addressing_get_relates_to(SoapEnv *envelope); -xmlNodePtr soap_addressing_add_relates_to(SoapEnv *envelope, xmlURI *id, xmlURI *type); +xmlNodePtr soap_addressing_get_relates_to(struct SoapEnv *envelope); +xmlNodePtr soap_addressing_add_relates_to(struct SoapEnv *envelope, xmlURI *id, xmlURI *type); -xmlNodePtr soap_addressing_get_reply_to(SoapEnv *envelope); -xmlNodePtr soap_addressing_set_reply_to(SoapEnv *envelope, xmlNodePtr address); +xmlNodePtr soap_addressing_get_reply_to(struct SoapEnv *envelope); +xmlNodePtr soap_addressing_set_reply_to(struct SoapEnv *envelope, xmlNodePtr address); -xmlURI *soap_addressing_get_reply_to_address(SoapEnv *envelope); -xmlNodePtr soap_addressing_set_reply_to_address(SoapEnv *envelope, xmlURI *address); +xmlURI *soap_addressing_get_reply_to_address(struct SoapEnv *envelope); +xmlNodePtr soap_addressing_set_reply_to_address(struct SoapEnv *envelope, xmlURI *address); -xmlNodePtr soap_addressing_get_from(SoapEnv *envelope); -xmlURI *soap_addressing_get_from_address(SoapEnv *envelope); +xmlNodePtr soap_addressing_get_from(struct SoapEnv *envelope); +xmlURI *soap_addressing_get_from_address(struct SoapEnv *envelope); -xmlNodePtr soap_addressing_set_from(SoapEnv *envelope, xmlNodePtr address); -xmlNodePtr soap_addressing_set_from_address(SoapEnv *envelope, xmlURI *address); -xmlNodePtr soap_addressing_set_from_string(SoapEnv *envelope, const char *from); +xmlNodePtr soap_addressing_set_from(struct SoapEnv *envelope, xmlNodePtr address); +xmlNodePtr soap_addressing_set_from_address(struct SoapEnv *envelope, xmlURI *address); +xmlNodePtr soap_addressing_set_from_string(struct SoapEnv *envelope, const char *from); -xmlNodePtr soap_addressing_get_fault_to(SoapEnv *envelope); -xmlURI *soap_addressing_get_fault_to_address(SoapEnv *envelope); +xmlNodePtr soap_addressing_get_fault_to(struct SoapEnv *envelope); +xmlURI *soap_addressing_get_fault_to_address(struct SoapEnv *envelope); -xmlNodePtr soap_addressing_set_fault_to(SoapEnv *envelope, xmlNodePtr address); -xmlNodePtr soap_addressing_set_fault_to_address(SoapEnv *envelope, xmlURI *address); -xmlNodePtr soap_addressing_set_fault_to_string(SoapEnv *envelope, const char *fault_to); +xmlNodePtr soap_addressing_set_fault_to(struct SoapEnv *envelope, xmlNodePtr address); +xmlNodePtr soap_addressing_set_fault_to_address(struct SoapEnv *envelope, xmlURI *address); +xmlNodePtr soap_addressing_set_fault_to_string(struct SoapEnv *envelope, const char *fault_to); -xmlNodePtr soap_addressing_get_to(SoapEnv *envelope); -xmlURI *soap_addressing_get_to_address(SoapEnv *envelope); -xmlChar *soap_addressing_get_to_address_string(SoapEnv *envelope); +xmlNodePtr soap_addressing_get_to(struct SoapEnv *envelope); +xmlURI *soap_addressing_get_to_address(struct SoapEnv *envelope); +xmlChar *soap_addressing_get_to_address_string(struct SoapEnv *envelope); -xmlNodePtr soap_addressing_set_to(SoapEnv *envelope, xmlNodePtr address); -xmlNodePtr soap_addressing_set_to_address(SoapEnv *envelope, xmlURI *address); -xmlNodePtr soap_addressing_set_to_address_string(SoapEnv *envelope, const char *to); +xmlNodePtr soap_addressing_set_to(struct SoapEnv *envelope, xmlNodePtr address); +xmlNodePtr soap_addressing_set_to_address(struct SoapEnv *envelope, xmlURI *address); +xmlNodePtr soap_addressing_set_to_address_string(struct SoapEnv *envelope, const char *to); -xmlURI *soap_addressing_get_action(SoapEnv *envelope); -xmlChar *soap_addressing_get_action_string(SoapEnv *envelope); +xmlURI *soap_addressing_get_action(struct SoapEnv *envelope); +xmlChar *soap_addressing_get_action_string(struct SoapEnv *envelope); -xmlNodePtr soap_addressing_set_action(SoapEnv *envelope, xmlURI *action); -xmlNodePtr soap_addressing_set_action_string(SoapEnv *envelope, const char *action); +xmlNodePtr soap_addressing_set_action(struct SoapEnv *envelope, xmlURI *action); +xmlNodePtr soap_addressing_set_action_string(struct SoapEnv *envelope, const char *action); #ifdef __cplusplus } diff --git a/libcsoap/soap-admin.c b/libcsoap/soap-admin.c index 5558c75..b792ae6 100644 --- a/libcsoap/soap-admin.c +++ b/libcsoap/soap-admin.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-admin.c,v 1.6 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-admin.c,v 1.7 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -45,17 +45,11 @@ #include <libxml/uri.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> #include <nanohttp/nanohttp-request.h> #include <nanohttp/nanohttp-server.h> #include <nanohttp/nanohttp-admin.h> -#define __CSOAP_INTERNAL - -#include "soap-fault.h" #include "soap-env.h" -#include "soap-ctx.h" #include "soap-service.h" #include "soap-router.h" #include "soap-server.h" @@ -109,7 +103,7 @@ _soap_admin_list_routers(httpd_conn_t *conn) static void _soap_admin_list_services(httpd_conn_t *conn, const char *routername) { - SoapRouter *router; + struct SoapRouter *router; SoapServiceNode *node; char buffer[1024]; @@ -144,7 +138,7 @@ _soap_admin_list_services(httpd_conn_t *conn, const char *routername) static void -_soap_admin_handle_get(httpd_conn_t * conn, hrequest_t * req) +_soap_admin_handle_get(httpd_conn_t * conn, struct hrequest_t * req) { char *param; @@ -163,6 +157,7 @@ _soap_admin_handle_get(httpd_conn_t * conn, hrequest_t * req) http_output_stream_write_string(conn->out, "<ul>" "<li><a href=\"?" SOAP_ADMIN_QUERY_ROUTERS "\">Routers</a></li>" + "<li><a href=\"../inspection.wsil\">inspection.wsil</a> (try: -CSOAPwsil)</li>" "<li><a href=\"../nhttp\">nanoHTTP</a></li>" "</ul>"); @@ -174,7 +169,7 @@ _soap_admin_handle_get(httpd_conn_t * conn, hrequest_t * req) static void -_soap_admin_entry(httpd_conn_t * conn, hrequest_t * req) +_soap_admin_entry(httpd_conn_t * conn, struct hrequest_t * req) { if (req->method == HTTP_REQUEST_GET) { diff --git a/libcsoap/soap-admin.h b/libcsoap/soap-admin.h index e49fbba..1d121b3 100644 --- a/libcsoap/soap-admin.h +++ b/libcsoap/soap-admin.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-admin.h,v 1.3 2006/11/19 09:40:14 m0gg Exp $ + * $Id: soap-admin.h,v 1.4 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -21,8 +21,8 @@ * * Email: ferhatayaz@yahoo.com ******************************************************************/ -#ifndef cSOAP_ADMIN_H -#define cSOAP_ADMIN_H +#ifndef __csoap_admin_h +#define __csoap_admin_h #define CSOAP_ENABLE_ADMIN "-CSOAPadmin" @@ -35,14 +35,16 @@ extern "C" { #endif /** - Initializes the soap admin HTTP interface with commandline arguments. - - @param argc commandline arg count - @param argv commandline arg vector - - @returns 1 if success, 0 otherwise + * + * Initializes the soap admin HTTP interface with commandline arguments. + * + * @param argc commandline arg count + * @param argv commandline arg vector + * + * @returns 1 if success, 0 otherwise + * */ -herror_t soap_admin_init_args(int argc, char *argv[]); +extern herror_t soap_admin_init_args(int argc, char **argv); #ifdef __cplusplus } diff --git a/libcsoap/soap-client.c b/libcsoap/soap-client.c index 4e12650..a49ba2a 100644 --- a/libcsoap/soap-client.c +++ b/libcsoap/soap-client.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-client.c,v 1.29 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-client.c,v 1.30 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -25,16 +25,10 @@ #include <config.h> #endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - #include <libxml/tree.h> #include <libxml/uri.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> #include <nanohttp/nanohttp-request.h> #include <nanohttp/nanohttp-server.h> #include <nanohttp/nanohttp-logging.h> @@ -63,13 +57,20 @@ soap_client_destroy(void) } herror_t -soap_client_invoke(SoapCtx *req, SoapCtx **res, const char *url, const char *action) +soap_client_invoke(struct SoapCtx *req, struct SoapCtx **res, const char *url, const char *action) { + char *id; + log_verbose2("action = \"%s\"", action); soap_addressing_set_action_string(req->env, action); log_verbose2("url = \"%s\"", url); soap_addressing_set_to_address_string(req->env, url); + soap_addressing_set_message_id_string(req->env, NULL); + id = soap_addressing_get_message_id_string(req->env); + log_verbose2("message id = \"%s\"", id); + free(id); + return soap_transport_client_invoke(req, res); } diff --git a/libcsoap/soap-client.h b/libcsoap/soap-client.h index d8bf6ee..f74d881 100644 --- a/libcsoap/soap-client.h +++ b/libcsoap/soap-client.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-client.h,v 1.13 2006/03/06 13:37:38 m0gg Exp $ + * $Id: soap-client.h,v 1.14 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -21,11 +21,8 @@ * * Email: ayaz@jprogrammer.net ******************************************************************/ -#ifndef cSOAP_CLIENT_H -#define cSOAP_CLIENT_H - -#include <libcsoap/soap-env.h> -#include <libcsoap/soap-ctx.h> +#ifndef __csoap_client_h +#define __csoap_client_h #define SOAP_ERROR_CLIENT_INIT 5001 @@ -34,44 +31,32 @@ extern "C" { #endif /** - Initializes the client side soap engine -*/ -herror_t soap_client_init_args(int argc, char *argv[]); - - -/** - Destroy the soap client module -*/ -void soap_client_destroy(); - + * + * Initializes the client side soap engine + * + */ +extern herror_t soap_client_init_args(int argc, char **argv); /** - Establish connection to the soap server and send - the given envelope. - - @param env envelope to send - @param response the result envelope - @param url url to the soap server - @soap_action value for "SoapAction:" in the - HTTP request header. - - @returns H_OK if success + * + * Establish connection to the soap server and send the given envelope. + * + * @param env envelope to send + * @param response the result envelope + * @param url url to the soap server + * @soap_action value for "SoapAction:" in the HTTP request header. + * + * @returns H_OK if success + * */ -herror_t soap_client_invoke(SoapCtx * ctx, SoapCtx ** response, - const char *url, const char *soap_action); - - +extern herror_t soap_client_invoke(struct SoapCtx * ctx, struct SoapCtx **response, const char *url, const char *soap_action); /** - Sets the underlaying socket to use while connecting - into block mode or not block mode. - The default mode is always non-blocking mode. - - @param block 1 to creat blocked sockets, 0 to create non - blocking sockets. -*/ -void soap_client_block_socket(int block); -int soap_client_get_blockmode(); + * + * Destroy the soap client module + * + */ +extern void soap_client_destroy(void); #ifdef __cplusplus } diff --git a/libcsoap/soap-ctx.c b/libcsoap/soap-ctx.c index 2db0e7e..25c34dd 100755 --- a/libcsoap/soap-ctx.c +++ b/libcsoap/soap-ctx.c @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-ctx.c,v 1.12 2006/11/21 20:59:02 m0gg Exp $ + * $Id: soap-ctx.c,v 1.13 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -50,12 +50,12 @@ #include "soap-env.h" #include "soap-ctx.h" -SoapCtx * -soap_ctx_new(SoapEnv * env) /* should only be used internally */ +struct SoapCtx * +soap_ctx_new(struct SoapEnv * env) /* should only be used internally */ { - SoapCtx *ctx; + struct SoapCtx *ctx; - if (!(ctx = (SoapCtx *) malloc(sizeof(SoapCtx)))) + if (!(ctx = (struct SoapCtx *) malloc(sizeof(struct SoapCtx)))) { log_error2("malloc failed (%s)", strerror(errno)); return NULL; @@ -69,7 +69,7 @@ soap_ctx_new(SoapEnv * env) /* should only be used internally */ void -soap_ctx_add_files(SoapCtx * ctx, attachments_t * attachments) +soap_ctx_add_files(struct SoapCtx * ctx, attachments_t * attachments) { part_t *part; char href[MAX_HREF_SIZE]; @@ -87,7 +87,7 @@ soap_ctx_add_files(SoapCtx * ctx, attachments_t * attachments) herror_t -soap_ctx_add_file(SoapCtx * ctx, const char *filename, +soap_ctx_add_file(struct SoapCtx * ctx, const char *filename, const char *content_type, char *dest_href) { char cid[250]; @@ -116,7 +116,7 @@ soap_ctx_add_file(SoapCtx * ctx, const char *filename, } part_t * -soap_ctx_get_file(SoapCtx * ctx, xmlNodePtr node) +soap_ctx_get_file(struct SoapCtx * ctx, xmlNodePtr node) { xmlChar *prop; char href[MAX_HREF_SIZE]; @@ -156,7 +156,7 @@ soap_ctx_get_file(SoapCtx * ctx, xmlNodePtr node) } void -soap_ctx_free(SoapCtx * ctx) +soap_ctx_free(struct SoapCtx * ctx) { if (!ctx) return; @@ -174,9 +174,9 @@ soap_ctx_free(SoapCtx * ctx) herror_t -soap_ctx_new_with_method(const char *urn, const char *method, SoapCtx ** out) +soap_ctx_new_with_method(const char *urn, const char *method, struct SoapCtx ** out) { - SoapEnv *env; + struct SoapEnv *env; herror_t err; err = soap_env_new_with_method(urn, method, &env); if (err != H_OK) diff --git a/libcsoap/soap-ctx.h b/libcsoap/soap-ctx.h index 93631d2..b8bfb3d 100755 --- a/libcsoap/soap-ctx.h +++ b/libcsoap/soap-ctx.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-ctx.h,v 1.11 2006/11/21 20:59:02 m0gg Exp $ + * $Id: soap-ctx.h,v 1.12 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -29,26 +29,25 @@ #define MAX_HREF_SIZE 150 -typedef struct _SoapCtx +struct SoapCtx { - SoapEnv *env; + struct SoapEnv *env; attachments_t *attachments; -} SoapCtx; +}; #ifdef __cplusplus extern "C" { #endif /* should only be used internally */ -extern SoapCtx *soap_ctx_new(SoapEnv * env); +extern struct SoapCtx *soap_ctx_new(struct SoapEnv * env); /** Creates a new soap context object. */ -extern herror_t soap_ctx_new_with_method(const char *urn, const char *method, - SoapCtx ** out); +extern herror_t soap_ctx_new_with_method(const char *urn, const char *method, struct SoapCtx ** out); -extern void soap_ctx_free(SoapCtx * ctx); +extern void soap_ctx_free(struct SoapCtx * ctx); /** Returns the attached file if any found. @param ctx the SoapCtx object which should contain the part @@ -57,16 +56,16 @@ extern void soap_ctx_free(SoapCtx * ctx); @returns a part_t object of attachment was found, NULL otherwise. */ -extern part_t *soap_ctx_get_file(SoapCtx * ctx, xmlNodePtr node); +extern part_t *soap_ctx_get_file(struct SoapCtx * ctx, xmlNodePtr node); /* Size of destination dest_href should be MAX_HREF_SIZE */ -extern herror_t soap_ctx_add_file(SoapCtx * ctx, const char *filename, +extern herror_t soap_ctx_add_file(struct SoapCtx * ctx, const char *filename, const char *content_type, char *dest_href); /* Used internally. Will switch the deleteOnExit flag from the given one to the added part. */ -extern void soap_ctx_add_files(SoapCtx * ctx, attachments_t * attachments); +extern void soap_ctx_add_files(struct SoapCtx * ctx, attachments_t * attachments); #ifdef __cplusplus } diff --git a/libcsoap/soap-env.c b/libcsoap/soap-env.c index 9882cfb..6bdce39 100644 --- a/libcsoap/soap-env.c +++ b/libcsoap/soap-env.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-env.c,v 1.23 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-env.c,v 1.24 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -50,6 +50,7 @@ #endif #include <libxml/tree.h> +#include <libxml/xpath.h> #include <libxml/xmlstring.h> #include <nanohttp/nanohttp-common.h> @@ -164,14 +165,14 @@ xmlbuilder_end_element(const xmlChar * element_name, void *userData) } herror_t -soap_env_new_from_doc(xmlDocPtr doc, SoapEnv ** out) +soap_env_new_from_doc(xmlDocPtr doc, struct SoapEnv ** out) { xmlNodePtr node; - SoapEnv *env; + struct SoapEnv *env; if (doc == NULL) { - log_error1("Can not create xml document!"); + log_error1("Cannot create XML document!"); return herror_new("soap_env_new_from_doc", GENERAL_INVALID_PARAM, "XML Document (xmlDocPtr) is NULL"); @@ -184,10 +185,10 @@ soap_env_new_from_doc(xmlDocPtr doc, SoapEnv ** out) XML_ERROR_EMPTY_DOCUMENT, "XML Document is empty!"); } - if (!(env = (SoapEnv *) malloc(sizeof(SoapEnv)))) + if (!(env = (struct SoapEnv *) malloc(sizeof(struct SoapEnv)))) { log_error2("malloc failed (%s)", strerror(errno)); - return herror_new("soap_env_from_doc", GENERAL_INVALID_PARAM, "malloc failed"); + return herror_new("soap_env_from_doc", GENERAL_INVALID_PARAM, "malloc failed (%s)", strerror(errno)); } env->root = node; @@ -202,7 +203,7 @@ soap_env_new_from_doc(xmlDocPtr doc, SoapEnv ** out) herror_t -soap_env_new_from_buffer(const char *buffer, SoapEnv ** out) +soap_env_new_from_buffer(const char *buffer, struct SoapEnv **out) { xmlDocPtr doc; herror_t err; @@ -213,7 +214,7 @@ soap_env_new_from_buffer(const char *buffer, SoapEnv ** out) if (!(doc = xmlParseDoc(BAD_CAST buffer))) return herror_new("soap_env_new_from_buffer", - XML_ERROR_PARSE, "Can not parse xml"); + XML_ERROR_PARSE, "Cannot parse XML"); if ((err = soap_env_new_from_doc(doc, out)) != H_OK) { @@ -224,13 +225,13 @@ soap_env_new_from_buffer(const char *buffer, SoapEnv ** out) herror_t -soap_env_new_with_fault(int faultcode, const char *faultstring, const char *faultactor, const char *detail, SoapEnv **out) +soap_env_new_with_fault(int faultcode, const char *faultstring, const char *faultactor, const char *detail, struct SoapEnv **out) { xmlDocPtr doc; herror_t err; if (!(doc = soap_fault_build(faultcode, faultstring, faultactor, detail))) - return herror_new("soap_env_new_with_fault", XML_ERROR_PARSE, "Can not parse fault xml"); + return herror_new("soap_env_new_with_fault", XML_ERROR_PARSE, "Cannot parse fault XML"); if ((err = soap_env_new_from_doc(doc, out)) != H_OK) xmlFreeDoc(doc); @@ -240,11 +241,12 @@ soap_env_new_with_fault(int faultcode, const char *faultstring, const char *faul herror_t -soap_env_new_with_response(SoapEnv * request, SoapEnv ** out) +soap_env_new_with_response(struct SoapEnv * request, struct SoapEnv ** out) { - char *method, *res_method; + const char *method; + char *res_method; herror_t ret; - char *urn; + const char *urn; if (request == NULL) { @@ -256,7 +258,7 @@ soap_env_new_with_response(SoapEnv * request, SoapEnv ** out) { return herror_new("soap_env_new_with_response", GENERAL_INVALID_PARAM, - "request (first param) has no xml structure"); + "request (first param) has no XML structure"); } if (!(method = soap_env_find_methodname(request))) @@ -289,7 +291,7 @@ soap_env_new_with_response(SoapEnv * request, SoapEnv ** out) herror_t -soap_env_new_with_method(const char *urn, const char *method, SoapEnv ** out) +soap_env_new_with_method(const char *urn, const char *method, struct SoapEnv ** out) { xmlDocPtr env; xmlChar buffer[1054]; @@ -312,47 +314,45 @@ soap_env_new_with_method(const char *urn, const char *method, SoapEnv ** out) if (!(env = xmlParseDoc(buffer))) return herror_new("soap_env_new_with_method", - XML_ERROR_PARSE, "Can not parse xml"); + XML_ERROR_PARSE, "Can not parse XML"); return soap_env_new_from_doc(env, out); } xmlNodePtr -soap_env_add_item(SoapEnv * call, const char *type, const char *name, const char *value) +soap_env_add_item(struct SoapEnv * call, const char *type, const char *name, const char *value) { - xmlNodePtr newnode; + xmlNodePtr newNode; - newnode = xmlNewTextChild(call->cur, NULL, BAD_CAST name, BAD_CAST value); + newNode = xmlNewTextChild(call->cur, NULL, BAD_CAST name, BAD_CAST value); - if (newnode == NULL) + if (newNode == NULL) { - log_error1("Can not create new xml node"); + log_error1("Can not create new XML node"); return NULL; } if (type) { - if (!xmlNewProp(newnode, BAD_CAST "xsi:type", BAD_CAST type)) + if (!xmlNewProp(newNode, BAD_CAST "xsi:type", BAD_CAST type)) { - log_error1("Can not create new xml attribute"); + log_error1("Can not create new XML attribute"); return NULL; } } - return newnode; + return newNode; } xmlNodePtr -soap_env_add_itemf(SoapEnv * call, const char *type, - const char *name, const char *format, ...) +soap_env_add_itemf(struct SoapEnv * call, const char *type, const char *name, const char *format, ...) { va_list ap; char buffer[1054]; - va_start(ap, format); vsprintf(buffer, format, ap); va_end(ap); @@ -362,13 +362,13 @@ soap_env_add_itemf(SoapEnv * call, const char *type, xmlNodePtr -soap_env_add_attachment(SoapEnv * call, const char *name, const char *href) +soap_env_add_attachment(struct SoapEnv * call, const char *name, const char *href) { - xmlNodePtr newnode; + xmlNodePtr newNode; - newnode = xmlNewTextChild(call->cur, NULL, BAD_CAST name, BAD_CAST ""); + newNode = xmlNewTextChild(call->cur, NULL, BAD_CAST name, BAD_CAST ""); - if (newnode == NULL) + if (newNode == NULL) { log_error1("Can not create new xml node"); return NULL; @@ -376,19 +376,19 @@ soap_env_add_attachment(SoapEnv * call, const char *name, const char *href) if (href) { - if (!xmlNewProp(newnode, BAD_CAST "href", BAD_CAST href)) + if (!xmlNewProp(newNode, BAD_CAST "href", BAD_CAST href)) { log_error1("Can not create new xml attribute"); return NULL; } } - return newnode; + return newNode; } void -soap_env_add_custom(SoapEnv * call, void *obj, XmlSerializerCallback cb, const char *type, const char *name) +soap_env_add_custom(struct SoapEnv * call, void *obj, XmlSerializerCallback cb, const char *type, const char *name) { struct XmlNodeHolder holder; @@ -403,7 +403,7 @@ soap_env_add_custom(SoapEnv * call, void *obj, XmlSerializerCallback cb, const c xmlNodePtr -soap_env_push_item(SoapEnv * call, const char *type, const char *name) +soap_env_push_item(struct SoapEnv * call, const char *type, const char *name) { xmlNodePtr node; @@ -416,7 +416,7 @@ soap_env_push_item(SoapEnv * call, const char *type, const char *name) void -soap_env_pop_item(SoapEnv * call) +soap_env_pop_item(struct SoapEnv * call) { call->cur = call->cur->parent; @@ -425,7 +425,7 @@ soap_env_pop_item(SoapEnv * call) void -soap_env_free(SoapEnv * env) +soap_env_free(struct SoapEnv * env) { if (env) { @@ -441,7 +441,7 @@ soap_env_free(SoapEnv * env) xmlNodePtr -soap_env_get_body(SoapEnv * env) +soap_env_get_body(struct SoapEnv * env) { xmlNodePtr node; @@ -470,7 +470,7 @@ soap_env_get_body(SoapEnv * env) xmlNodePtr -soap_env_get_header(SoapEnv *env) +soap_env_get_header(struct SoapEnv *env) { xmlNodePtr node; @@ -498,7 +498,7 @@ soap_env_get_header(SoapEnv *env) xmlNodePtr -soap_env_get_fault(SoapEnv * env) +soap_env_get_fault(struct SoapEnv * env) { xmlNodePtr node; @@ -520,7 +520,7 @@ soap_env_get_fault(SoapEnv * env) xmlNodePtr -soap_env_get_method(SoapEnv * env) +soap_env_get_method(struct SoapEnv * env) { xmlNodePtr body; @@ -537,7 +537,7 @@ soap_env_get_method(SoapEnv * env) /* XXX: unused function? */ xmlNodePtr -_soap_env_get_body(SoapEnv * env) +_soap_env_get_body(struct SoapEnv * env) { xmlNodePtr body; xmlNodeSetPtr nodeset; @@ -545,13 +545,13 @@ _soap_env_get_body(SoapEnv * env) if (env == NULL) { - log_error1("SoapEnv is NULL"); + log_error1("struct SoapEnv is NULL"); return NULL; } if (env->root == NULL) { - log_error1("SoapEnv contains no XML document"); + log_error1("struct SoapEnv contains no XML document"); return NULL; } @@ -582,12 +582,11 @@ _soap_env_get_body(SoapEnv * env) body = nodeset->nodeTab[0]; /* body is <Body> */ xmlXPathFreeObject(xpathobj); return body; - } -char * -soap_env_find_urn(SoapEnv * env) +const char * +soap_env_find_urn(struct SoapEnv * env) { xmlNsPtr ns; xmlNodePtr body, node; @@ -595,14 +594,14 @@ soap_env_find_urn(SoapEnv * env) if (!(body = soap_env_get_body(env))) { log_verbose1("body is NULL"); - return 0; + return NULL; } /* node is the first child */ if (!(node = soap_xml_get_children(body))) { log_error1("No namespace found"); - return 0; + return NULL; } /* if (node->ns && node->ns->prefix) MRC 1/25/2006 */ @@ -611,7 +610,7 @@ soap_env_find_urn(SoapEnv * env) ns = xmlSearchNs(body->doc, node, node->ns->prefix); if (ns != NULL) { - return((char *) ns->href); /* namespace found! */ + return ((char *) ns->href); /* namespace found! */ } } else @@ -621,35 +620,32 @@ soap_env_find_urn(SoapEnv * env) return(empty); } - return 0; + return NULL; } -char * -soap_env_find_methodname(SoapEnv * env) +const char * +soap_env_find_methodname(struct SoapEnv * env) { xmlNodePtr body, node; - body = soap_env_get_body(env); - if (body == NULL) - return 0; + if (!(body = soap_env_get_body(env))) + return NULL; node = soap_xml_get_children(body); /* node is the first child */ if (node == NULL) { log_error1("No method found"); - return 0; + return NULL; } if (node->name == NULL) { log_error1("No methodname found"); - return 0; + return NULL; } - return((char *) node->name); + return ((char *) node->name); } - - diff --git a/libcsoap/soap-env.h b/libcsoap/soap-env.h index 2da9528..b73bb38 100644 --- a/libcsoap/soap-env.h +++ b/libcsoap/soap-env.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-env.h,v 1.16 2006/11/21 20:59:02 m0gg Exp $ + * $Id: soap-env.h,v 1.17 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -21,300 +21,306 @@ * * Email: ayaz@jprogrammer.net ******************************************************************/ -#ifndef cSOAP_ENV_H -#define cSOAP_ENV_H +#ifndef __csoap_env_h +#define __csoap_env_h /** - The SOAP envelope object. + * + * The SOAP envelope namespace + * */ -typedef struct _SoapEnv +static const char * const soap_env_ns = "http://schemas.xmlsoap.org/soap/envelope/"; + +/** + * + * The SOAP envelope object. + * + */ +struct SoapEnv { xmlNodePtr root; /** Pointer to the firts xml element (envelope) */ xmlNodePtr header; xmlNodePtr body; xmlNodePtr cur; /** Pointer to the current xml element. (stack) */ -} SoapEnv; +}; + +typedef void (*XmlSerializerCallback) (void * obj, const xmlChar *root_element_name, void (*OnStartElement) (const xmlChar * element_name, int attr_count, xmlChar ** keys, xmlChar ** values, void *userData), void (*OnCharacters) (const xmlChar * element_name, const xmlChar * chars, void *userData), void (*OnEndElement) (const xmlChar * element_name, void *userData), void *userdata); #ifdef __cplusplus extern "C" { #endif - -/* -------------------------------------------------------------- */ -/* Envelope creation methods */ -/* -------------------------------------------------------------- */ - /** - Creates an envelope with a fault object. - - @param faultcode The fault code @see fault_code_t - @param faultstring A fault message - @param faultactor The fault actor (This can be NULL) - @param detail The detail of the error (This can be NULL) - @param out the result envelope out parameter like follows - @returns H_OK if success - - <pre> - <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." SOAP-ENV:encoding="..." - xmlns:xsi="..." - xmlns:xsd="..."> - <SOAP-ENV:Body> - - <Fault> - <faultcode>...</faultcode> - <faultstring>...</faultstring> - <faultactor>...</faultactor> - <faultdetail>..</faultdetail> - </Fault> - - </SOAP-ENV:Body> - </SOAP-ENV:Envelope> - - </pre> - + * + * Creates an envelope with a fault object. + * + * @param faultcode The fault code @see fault_code_t + * @param faultstring A fault message + * @param faultactor The fault actor (This can be NULL) + * @param detail The detail of the error (This can be NULL) + * @param out the result envelope out parameter like follows + * + * <pre> + * <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." SOAP-ENV:encoding="..." + * xmlns:xsi="..." + * xmlns:xsd="..."> + * <SOAP-ENV:Body> + * + * <Fault> + * <faultcode>...</faultcode> + * <faultstring>...</faultstring> + * <faultactor>...</faultactor> + * <faultdetail>..</faultdetail> + * </Fault> + * + * </SOAP-ENV:Body> + * </SOAP-ENV:Envelope> + * </pre> + * + * @returns H_OK if success + * + * @see soap_fault_new + * */ -herror_t -soap_env_new_with_fault(int faultcode, - const char *faultstring, - const char *faultactor, - const char *detail, SoapEnv ** out); +extern herror_t soap_env_new_with_fault(int faultCode, const char *faultString, const char *faultActor, const char *detail, struct SoapEnv **out); /** - Creates an envelope with a method to invoke a soap service. - Use this function to create a client call. - - @param urn The urn of the soap service to invoke - @param method The method name of the soap service - - @param out the result envelope out parameter like follows - @returns H_OK if success - - <pre> - <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." SOAP-ENV:encoding="..." - xmlns:xsi="..." - xmlns:xsd="..."> - <SOAP-ENV:Body> - - <m:[method] xmlns:m="[urn]"> - </m:[method]> - - </SOAP-ENV:Body> - </SOAP-ENV:Envelope> - - </pre> - + * + * Creates an envelope with a method to invoke a soap service. + * Use this function to create a client call. + * + * @param urn The urn of the soap service to invoke + * @param method The method name of the soap service + * + * @param out the result envelope out parameter like follows + * @returns H_OK if success + * + * <pre> + * <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." SOAP-ENV:encoding="..." + * xmlns:xsi="..." + * xmlns:xsd="..."> + * <SOAP-ENV:Body> + * + * <m:[method] xmlns:m="[urn]"> + * </m:[method]> + * + * </SOAP-ENV:Body> + * </SOAP-ENV:Envelope> + * + * </pre> + * */ -herror_t -soap_env_new_with_method(const char *urn, const char *method, SoapEnv ** out); - +extern herror_t soap_env_new_with_method(const char *urn, const char *method, struct SoapEnv ** out); /** - Creates a soap envelope with a response. - Use this function to create a response envelope object - for a request. This function is only relevant for soap - service implementors. - - @see example csoap/simpleserver.c - - @param req The request object. A response object will be created - to this request. - - @param out the result envelope out paramter like follows - @returns H_OK if success - - <pre> - <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." SOAP-ENV:encoding="..." - xmlns:xsi="..." - xmlns:xsd="..."> - <SOAP-ENV:Body> - - <m:[req-method]Response xmlns:m="[req-urn]"> - </m:[req-method]> - - </SOAP-ENV:Body> - </SOAP-ENV:Envelope> - - </pre> - - + * + * Creates a soap envelope with a response. + * Use this function to create a response envelope object + * for a request. This function is only relevant for soap + * service implementors. + * + * @see example csoap/simpleserver.c + * + * @param req The request object. A response object will be created + * to this request. + * + * @param out the result envelope out paramter like follows + * @returns H_OK if success + * + * <pre> + * <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." SOAP-ENV:encoding="..." + * xmlns:xsi="..." + * xmlns:xsd="..."> + * <SOAP-ENV:Body> + * + * <m:[req-method]Response xmlns:m="[req-urn]"> + * </m:[req-method]> + * + * </SOAP-ENV:Body> + * </SOAP-ENV:Envelope> + * + * </pre> + * + * */ -herror_t soap_env_new_with_response(SoapEnv * req, SoapEnv ** out); - +extern herror_t soap_env_new_with_response(struct SoapEnv * req, struct SoapEnv ** out); /** - Creates an envelope from a given libxml2 xmlDoc - pointer. - - @param doc the xml document pointer - @param out the output envelope object - @returns H_OK if success - + * + * Creates an envelope from a given libxml2 xmlDocPtr. + * + * @param doc the xml document pointer + * @param out the output envelope object + * + * @returns H_OK if success + * */ -herror_t soap_env_new_from_doc(xmlDocPtr doc, SoapEnv ** out); - +extern herror_t soap_env_new_from_doc(xmlDocPtr doc, struct SoapEnv ** out); /** - Create an envelop object from a string. - The string must be in xml format. - - @param buffer The string to parse into a envelope. - @param out the output envelope object - @returns H_OK if success + * + * Create an envelop object from a string. + * The string must be in xml format. + * + * @param buffer The string to parse into a envelope. + * @param out the output envelope object + * @returns H_OK if success */ -herror_t soap_env_new_from_buffer(const char *buffer, SoapEnv ** out); - - -/* --------------------------------------------------- */ -/* XML Serializer functions and typedefs */ -/* --------------------------------------------------- */ - -typedef void (*XmlSerializerCallback) (void * obj, const xmlChar *root_element_name, void (*OnStartElement) (const xmlChar * element_name, int attr_count, xmlChar ** keys, xmlChar ** values, void *userData), void (*OnCharacters) (const xmlChar * element_name, const xmlChar * chars, void *userData), void (*OnEndElement) (const xmlChar * element_name, void *userData), void *userdata); - -/* ------------------------------------------------------ */ -/* XML build and stack function */ -/* ------------------------------------------------------ */ - +extern herror_t soap_env_new_from_buffer(const char *buffer, struct SoapEnv ** out); /** - Adds a new xml node under the current parent. - - <pre> - <m:[name] type=[type]>[value]</m:[name]> - </pre> - - @param env The envelope object - @param type Type of the parameter. Something like "xsd:string" or - "xsd:int" or custom types. - @param name Name of the xml node - @param value Text value of the xml node - - @returns The added xmlNode pointer. - - @see tutorial + * + * Adds a new xml node under the current parent. + * + * <pre> + * <m:[name] type=[type]>[value]</m:[name]> + * </pre> + * + * @param env The envelope object + * @param type Type of the parameter. Something like "xsd:string" or + * "xsd:int" or custom types. + * @param name Name of the xml node + * @param value Text value of the xml node + * + * @returns The added xmlNode pointer. + * + * @see tutorial + * */ -xmlNodePtr -soap_env_add_item(SoapEnv * env, const char *type, - const char *name, const char *value); - +extern xmlNodePtr soap_env_add_item(struct SoapEnv * env, const char *type, const char *name, const char *value); /** - Adds attachment href node to the envelope current parent. - - <pre> - <m:[name] href=[href]/> - </pre> - - @param env The envelope object - @param name Name of the xml node - @param href href. A CID string filled by - soap_ctx_add_attachment() - - @returns The added xmlNode pointer. - - @see soap_ctx_add_file tutorial + * + * Adds attachment href node to the envelope current parent. + * + * <pre> + * <m:[name] href=[href]/> + * </pre> + * + * @param env The envelope object + * @param name Name of the xml node + * @param href href. A CID string filled by + * soap_ctx_add_attachment() + * + * @returns The added xmlNode pointer. + * + * @see soap_ctx_add_file tutorial */ -xmlNodePtr -soap_env_add_attachment(SoapEnv * env, const char *name, const char *href); - +extern xmlNodePtr +soap_env_add_attachment(struct SoapEnv * env, const char *name, const char *href); /** - Serialize and adds obj to the envelope. - TODO: Document this function ! - <br> - <b>Important: </b> - + * + * Serialize and adds obj to the envelope. + * TODO: Document this function ! + * <br> + * <b>Important: </b> + * */ -void -soap_env_add_custom(SoapEnv * env, void *obj, XmlSerializerCallback cb, - const char *type, const char *name); +extern void soap_env_add_custom(struct SoapEnv * env, void *obj, XmlSerializerCallback cb, const char *type, const char *name); /** - Same as soap_env_add_item() with c style arguments - like in printf(). "value" is the format string. - <br> - <b>Important: </b> The totally length of value (incl. args) - must be lower the 1054. - - @see soap_env_add_item + * + * Same as soap_env_add_item() with c style arguments + * like in printf(). "value" is the format string. + * <br> + * <b>Important: </b> The totally length of value (incl. args) + * must be lower the 1054. + * + * @see soap_env_add_item */ -xmlNodePtr -soap_env_add_itemf(SoapEnv * env, const char *type, - const char *name, const char *value, ...); - +extern xmlNodePtr +soap_env_add_itemf(struct SoapEnv * env, const char *type, const char *name, const char *value, ...); /** - Push the current xml node in the soap envelope one level - deeper. Here an example: - - <pre> - soap_env_push_item(env, "my:custom", "Person"); - soap_env_add_item(env, "xsd:string", "name", "Mickey"); - soap_env_add_item(env, "xsd:string", "lastname", "Mouse"); - soap_env_pop_item(env); - </pre> - - This will create the xml like follows. - - <pre> - <Person type="my:custom"> - <name>Mickey</name> - <lastname>Mouse</lastname> - </Person> - </pre> - - @returns The added xmlNode pointer. - - @see tutorial + * + * Push the current xml node in the soap envelope one level + * deeper. Here an example: + * + * <pre> + * soap_env_push_item(env, "my:custom", "Person"); + * soap_env_add_item(env, "xsd:string", "name", "Mickey"); + * soap_env_add_item(env, "xsd:string", "lastname", "Mouse"); + * soap_env_pop_item(env); + * </pre> + * + * This will create the xml like follows. + * + * <pre> + * <Person type="my:custom"> + * <name>Mickey</name> + * <lastname>Mouse</lastname> + * </Person> + * </pre> + * + * @returns The added xmlNode pointer. + * + * @see tutorial + * */ -xmlNodePtr soap_env_push_item(SoapEnv * env, const char *type, const char *name); +extern xmlNodePtr soap_env_push_item(struct SoapEnv * env, const char *type, const char *name); /** - Sets the xml pointer 1 level higher. - - @param env The envelope object - @see soap_env_push_item + * + * Sets the xml pointer 1 level higher. + * + * @param env The envelope object + * + * @see soap_env_push_item */ -void soap_env_pop_item(SoapEnv * env); +extern void soap_env_pop_item(struct SoapEnv * env); /** - Free the envelope. - - @param env The envelope object + * + * Free the envelope. + * + * @param env The envelope object + * */ -void soap_env_free(SoapEnv * env); - - -/* --------------------------------------------------- */ -/* XML node finder functions */ -/* --------------------------------------------------- */ - +extern void soap_env_free(struct SoapEnv * env); /** - Gets the xml node pointing to SOAP Body. + * + * Gets the xml node pointing to SOAP Body. + * */ -xmlNodePtr soap_env_get_body(SoapEnv * env); +extern xmlNodePtr soap_env_get_body(struct SoapEnv * env); /** - Get the xml node pointing to SOAP method (call) + * + * Get the xml node pointing to SOAP method (call) + * */ -xmlNodePtr soap_env_get_method(SoapEnv * env); - +extern xmlNodePtr soap_env_get_method(struct SoapEnv * env); /** - Get the xml node pointing to SOAP Fault + * + * Get the xml node pointing to SOAP Fault + * */ -xmlNodePtr soap_env_get_fault(SoapEnv * env); - +extern xmlNodePtr soap_env_get_fault(struct SoapEnv * env); /** - Get the xml node pointing to SOAP Header + * + * Get the xml node pointing to SOAP Header + * */ -xmlNodePtr soap_env_get_header(SoapEnv * env); +extern xmlNodePtr soap_env_get_header(struct SoapEnv * env); +/** + * + * Get the URN of the message. + * + */ +extern const char *soap_env_find_urn(struct SoapEnv * env); -char * soap_env_find_urn(SoapEnv * env); -char * soap_env_find_methodname(SoapEnv * env); +/** + * + * Get the method of the message. + * + */ +extern const char *soap_env_find_methodname(struct SoapEnv * env); #ifdef __cplusplus } diff --git a/libcsoap/soap-fault.c b/libcsoap/soap-fault.c index 6781e1e..242a51a 100644 --- a/libcsoap/soap-fault.c +++ b/libcsoap/soap-fault.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-fault.c,v 1.12 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-fault.c,v 1.13 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -29,11 +29,17 @@ #include <string.h> #endif +#include <libxml/xpath.h> + #include <nanohttp/nanohttp-common.h> #include <nanohttp/nanohttp-logging.h> #include "soap-xml.h" -// #include "soap-server.h" +#include "soap-env.h" +#include "soap-ctx.h" +#include "soap-service.h" +#include "soap-router.h" +#include "soap-server.h" #include "soap-fault.h" /* diff --git a/libcsoap/soap-nhttp.c b/libcsoap/soap-nhttp.c index a49800b..b8b0e35 100644 --- a/libcsoap/soap-nhttp.c +++ b/libcsoap/soap-nhttp.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-nhttp.c,v 1.1 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-nhttp.c,v 1.2 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -37,38 +37,30 @@ #include <errno.h> #endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - -#ifdef WIN32 -#define snprintf(buffer, num, s1, s2) sprintf(buffer, s1,s2) -#endif - #include <libxml/tree.h> #include <libxml/uri.h> #include <nanohttp/nanohttp-common.h> #include <nanohttp/nanohttp-logging.h> - -#include <nanohttp/nanohttp-socket.h> #include <nanohttp/nanohttp-stream.h> + #include <nanohttp/nanohttp-request.h> #include <nanohttp/nanohttp-response.h> #include <nanohttp/nanohttp-client.h> #include <nanohttp/nanohttp-server.h> -#include "soap-admin.h" #include "soap-fault.h" #include "soap-env.h" #include "soap-ctx.h" #include "soap-service.h" -#include "soap-router.h" -#include "soap-server.h" #include "soap-client.h" +#include "soap-transport.h" #include "soap-addressing.h" +#include "soap-admin.h" +#include "soap-wsil.h" + #include "soap-nhttp.h" static herror_t @@ -98,7 +90,7 @@ _soap_nhttp_send_fault(httpd_conn_t *conn, const char *message) xmlDocPtr doc; herror_t ret; - doc = soap_fault_build(SOAP_FAULT_SENDER, message, soap_server_get_name(), NULL); + doc = soap_fault_build(SOAP_FAULT_SENDER, message, soap_transport_get_name(), NULL); ret = _soap_nhttp_send_document(conn, doc); xmlFreeDoc(doc); @@ -106,7 +98,7 @@ _soap_nhttp_send_fault(httpd_conn_t *conn, const char *message) } static herror_t -_soap_nhttp_send(httpd_conn_t *conn, SoapCtx *context, SoapEnv *env) +_soap_nhttp_send(httpd_conn_t *conn, struct SoapCtx *context, struct SoapEnv *env) { return _soap_nhttp_send_document(conn, env->root->doc); } @@ -116,7 +108,7 @@ _soap_nhttp_xml_io_read(void *ctx, char *buffer, int len) { int ret; - http_input_stream_t *in = (http_input_stream_t *)ctx; + struct http_input_stream_t *in = (struct http_input_stream_t *)ctx; if (!http_input_stream_is_ready(in)) return 0; @@ -134,7 +126,7 @@ _soap_nhttp_xml_io_close(void *ctx) } static herror_t -_soap_nhttp_env_new_from_stream(http_input_stream_t *in, SoapEnv **out) +_soap_nhttp_env_new_from_stream(struct http_input_stream_t *in, struct SoapEnv **out) { xmlDocPtr doc; @@ -143,18 +135,18 @@ _soap_nhttp_env_new_from_stream(http_input_stream_t *in, SoapEnv **out) return in->err; if (doc == NULL) - return herror_new("_soap_nhttp_env_new_from_stream", XML_ERROR_PARSE, "Trying to parse not valid xml"); + return herror_new("_soap_nhttp_env_new_from_stream", XML_ERROR_PARSE, "Trying to parse invalid XML"); return soap_env_new_from_doc(doc, out); } static void -soap_nhttp_process(httpd_conn_t * conn, hrequest_t * req) +soap_nhttp_process(httpd_conn_t * conn, struct hrequest_t * req) { char *action; - SoapEnv *env; - SoapCtx *ctx; - SoapCtx *response; + struct SoapEnv *env; + struct SoapCtx *ctx; + struct SoapCtx *response; herror_t err; /* if (req->method == HTTP_REQUEST_GET && router->wsdl) @@ -203,14 +195,14 @@ soap_nhttp_process(httpd_conn_t * conn, hrequest_t * req) xmlFree(uri); } - soap_xml_doc_print(ctx->env->root->doc); + xmlDocDump(stdout, ctx->env->root->doc); soap_ctx_add_files(ctx, req->attachments); /* only local part is interesting... */ soap_addressing_set_to_address_string(ctx->env, req->path); - soap_server_process(ctx, &response); + soap_transport_process(ctx, &response); _soap_nhttp_send_document(conn, response->env->root->doc); @@ -227,13 +219,22 @@ soap_nhttp_server_init_args(int argc, char **argv) herror_t err; if ((err = httpd_init(argc, argv)) != H_OK) + { + log_error2("httpd_init failed (%s)", herror_message(err)); + return err; + } + + if ((err = soap_wsil_init_args(argc, argv)) != H_OK) + { + log_error2("soap_wsil_init_args failed (%s)", herror_message(err)); return err; - + } + return soap_admin_init_args(argc, argv); } static herror_t -_soap_nhttp_client_build_result(hresponse_t * res, SoapEnv ** env) +_soap_nhttp_client_build_result(hresponse_t * res, struct SoapEnv ** env) { log_verbose2("Building result (%p)", res); @@ -253,7 +254,7 @@ _soap_nhttp_client_build_result(hresponse_t * res, SoapEnv ** env) } static herror_t -_soap_nhttp_client_invoke(void *unused, SoapCtx *request, SoapCtx **response) +_soap_nhttp_client_invoke(void *unused, struct SoapCtx *request, struct SoapCtx **response) { herror_t status; @@ -263,7 +264,7 @@ _soap_nhttp_client_invoke(void *unused, SoapCtx *request, SoapCtx **response) char tmp[15]; char *action; char *url; - SoapEnv *res_env; + struct SoapEnv *res_env; /* Transport variables */ httpc_conn_t *conn; @@ -284,7 +285,7 @@ _soap_nhttp_client_invoke(void *unused, SoapCtx *request, SoapCtx **response) xmlNodeDump(buffer, request->env->root->doc, request->env->root, 1, 0); content = (char *) xmlBufferContent(buffer); - soap_xml_doc_print(request->env->root->doc); + xmlDocDump(stdout, request->env->root->doc); /* Transport via HTTP */ if (!(conn = httpc_new())) @@ -412,6 +413,7 @@ _soap_nhttp_client_invoke(void *unused, SoapCtx *request, SoapCtx **response) return H_OK; } + herror_t soap_nhttp_client_init_args(int argc, char **argv) { @@ -422,14 +424,18 @@ soap_nhttp_client_init_args(int argc, char **argv) } herror_t -soap_nhttp_register_router(SoapRouter * router, const char *context) +soap_nhttp_register(const void *data) { + herror_t status; + const char *context; + + context = (char *)data; - if (!httpd_register_secure(context, soap_nhttp_process, router->auth)) + if ((status = httpd_register(context, soap_nhttp_process)) != H_OK) { - return /* XXX */ H_OK; + log_error2("httpd_register_secure failed (%s)", herror_message(status)); + return status; } - return H_OK; } @@ -447,7 +453,6 @@ soap_nhttp_server_destroy(void) return; } - void soap_nhttp_client_destroy(void) { diff --git a/libcsoap/soap-nhttp.h b/libcsoap/soap-nhttp.h index fb060b5..acb5dc3 100644 --- a/libcsoap/soap-nhttp.h +++ b/libcsoap/soap-nhttp.h @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-nhttp.h,v 1.1 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-nhttp.h,v 1.2 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2007 Heiko Ronsdorf @@ -47,13 +47,13 @@ extern herror_t soap_nhttp_server_init_args(int argc, char **argv); extern herror_t soap_nhttp_server_run(void); extern void soap_nhttp_server_destroy(void); -extern herror_t soap_nhttp_register_router(SoapRouter *router, const char *context); +extern herror_t soap_nhttp_register(const void *data); extern short soap_nhttp_get_port(void); extern const char *soap_nhttp_get_protocol(void); extern herror_t soap_nhttp_client_init_args(int argc, char **argv); -extern herror_t soap_nhttp_client_invoke(void *unused, SoapCtx *req, SoapCtx **res); +extern herror_t soap_nhttp_client_invoke(void *unused, struct SoapCtx *req, struct SoapCtx **res); extern void soap_nhttp_client_destroy(void); #ifdef __cplusplus diff --git a/libcsoap/soap-nudp.c b/libcsoap/soap-nudp.c index 985cfd8..4520631 100644 --- a/libcsoap/soap-nudp.c +++ b/libcsoap/soap-nudp.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-nudp.c,v 1.1 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-nudp.c,v 1.2 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -33,18 +33,10 @@ #include <errno.h> #endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - #include <libxml/tree.h> #include <libxml/uri.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> -#include <nanohttp/nanohttp-request.h> -#include <nanohttp/nanohttp-server.h> #include <nanohttp/nanohttp-logging.h> #include "soap-fault.h" @@ -62,7 +54,7 @@ soap_nudp_server_init_args(int argc, char **argv) } herror_t -soap_nudp_register_router(SoapRouter *router, const char *context) +soap_nudp_register(const void *data) { return H_OK; } @@ -86,7 +78,7 @@ soap_nudp_client_init_args(int argc, char **argv) } herror_t -soap_nudp_client_invoke(SoapCtx *req, SoapCtx **res) +soap_nudp_client_invoke(struct SoapCtx *req, struct SoapCtx **res) { return H_OK; } diff --git a/libcsoap/soap-nudp.h b/libcsoap/soap-nudp.h index 73bc612..9b703ae 100644 --- a/libcsoap/soap-nudp.h +++ b/libcsoap/soap-nudp.h @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-nudp.h,v 1.1 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-nudp.h,v 1.2 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2007 Heiko Ronsdorf @@ -33,11 +33,11 @@ extern herror_t soap_nudp_server_run(void); extern void soap_nudp_server_destroy(void); #ifdef __CSOAP_INTERNAL -extern herror_t soap_nudp_register_router(SoapRouter *router, const char *context); +extern herror_t soap_nudp_register(const void *data); #endif extern herror_t soap_nudp_client_init_args(int argc, char **argv); -extern herror_t soap_nudp_client_invoke(SoapCtx *req, SoapCtx **res); +extern herror_t soap_nudp_client_invoke(struct SoapCtx *req, struct SoapCtx **res); extern void soap_nudp_client_destroy(void); #ifdef __cplusplus diff --git a/libcsoap/soap-router.c b/libcsoap/soap-router.c index 0a9ee63..c0891f6 100644 --- a/libcsoap/soap-router.c +++ b/libcsoap/soap-router.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-router.c,v 1.12 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-router.c,v 1.13 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -33,10 +33,6 @@ #include <string.h> #endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - #ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -44,36 +40,31 @@ #include <libxml/tree.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> -#include <nanohttp/nanohttp-request.h> -#include <nanohttp/nanohttp-server.h> #include <nanohttp/nanohttp-logging.h> #include "soap-fault.h" -#include "soap-env.h" #include "soap-ctx.h" #include "soap-service.h" #include "soap-router.h" -SoapRouter * +struct SoapRouter * soap_router_new(void) { - SoapRouter *router; + struct SoapRouter *router; - if (!(router = (SoapRouter *) malloc(sizeof(SoapRouter)))) + if (!(router = (struct SoapRouter *) malloc(sizeof(struct SoapRouter)))) { log_error2("malloc failed (%s)", strerror(errno)); return NULL; } - memset(router, 0, sizeof(SoapRouter)); + memset(router, 0, sizeof(struct SoapRouter)); return router; } herror_t -soap_router_register_service(SoapRouter *router, SoapServiceFunc func, const char *method, const char *urn) +soap_router_register_service(struct SoapRouter *router, SoapServiceFunc func, const char *method, const char *urn) { SoapService *service; @@ -97,7 +88,7 @@ soap_router_register_service(SoapRouter *router, SoapServiceFunc func, const cha } void -soap_router_register_security(SoapRouter * router, httpd_auth auth) +soap_router_register_security(struct SoapRouter * router, soap_auth auth) { router->auth = auth; @@ -105,18 +96,18 @@ soap_router_register_security(SoapRouter * router, httpd_auth auth) } void -soap_router_register_description(SoapRouter * router, xmlDocPtr wsdl) +soap_router_register_description(struct SoapRouter * router, xmlDocPtr description) { - if (router->wsdl) - xmlFreeDoc(router->wsdl); + if (router->description) + xmlFreeDoc(router->description); - router->wsdl = xmlCopyDoc(wsdl, 1); + router->description = xmlCopyDoc(description, 1); return; } herror_t -soap_router_register_default_service(SoapRouter *router, SoapServiceFunc func, const char *method, const char *urn) { +soap_router_register_default_service(struct SoapRouter *router, SoapServiceFunc func, const char *method, const char *urn) { SoapService *service; @@ -139,7 +130,7 @@ soap_router_register_default_service(SoapRouter *router, SoapServiceFunc func, c } SoapService * -soap_router_find_service(SoapRouter *router, const char *urn, const char *method) +soap_router_find_service(struct SoapRouter *router, const char *urn, const char *method) { SoapServiceNode *node; @@ -180,7 +171,7 @@ soap_router_find_service(SoapRouter *router, const char *urn, const char *method } void -soap_router_free(SoapRouter * router) +soap_router_free(struct SoapRouter * router) { SoapServiceNode *node; log_verbose2("enter: router=%p", router); @@ -197,8 +188,8 @@ soap_router_free(SoapRouter * router) free(router->service_head); router->service_head = node; } - if (router->wsdl) - xmlFreeDoc(router->wsdl); + if (router->description) + xmlFreeDoc(router->description); free(router); log_verbose1("leave with success"); diff --git a/libcsoap/soap-router.h b/libcsoap/soap-router.h index da6199f..69f0e86 100644 --- a/libcsoap/soap-router.h +++ b/libcsoap/soap-router.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-router.h,v 1.10 2006/11/21 20:59:02 m0gg Exp $ + * $Id: soap-router.h,v 1.11 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -25,72 +25,103 @@ #define __csoap_router_h /** - The router object. A router can store a set of - services. A service is a C function. + * + * Authentication callback function for a cSOAP service. + * + */ +typedef int (*soap_auth) (struct SoapEnv *request, const char *user, const char *pass); + +/** + * + * The router object. A router can store a set of + * services. A service is a C function. + * */ -typedef struct _SoapRouter +struct SoapRouter { SoapServiceNode *service_head; SoapServiceNode *service_tail; SoapService *default_service; - httpd_auth auth; - xmlDocPtr wsdl; -} SoapRouter; + soap_auth auth; + xmlDocPtr description; +}; #ifdef __cplusplus extern "C" { #endif /** - Creates a new router object. Create a router if - you are implementing a soap server. Then register - the services to this router. - <P>A router points also to http url context. - - @returns Soap router - @see soap_router_free + * + * Creates a new router object. Create a router if + * you are implementing a soap server. Then register + * the services to this router. + * <P>A router points also to http url context. + * + * @returns Soap router + * + * @see soap_router_free + * */ -extern SoapRouter *soap_router_new(void); - +extern struct SoapRouter *soap_router_new(void); /** - Registers a SOAP service (in this case a C function) - to the router. - - @param router The router object - @param func Function to register as a soap service - @param method Method name to call the function from - the client side. - @param urn The urn for this service + * + * Registers a SOAP service (in this case a C function) + * to the router. + * + * @param router The router object + * @param func Function to register as a soap service + * @param method Method name to call the function from + * the client side. + * @param urn The urn for this service + * */ -extern herror_t soap_router_register_service(SoapRouter * router, - SoapServiceFunc func, - const char *method, const char *urn); - -extern herror_t soap_router_register_default_service(SoapRouter * router, SoapServiceFunc func, const char *method, const char *urn); - - -extern void soap_router_register_description(SoapRouter *router, xmlDocPtr doc); - -extern void soap_router_register_security(SoapRouter *router, httpd_auth auth); +extern herror_t soap_router_register_service(struct SoapRouter *router, SoapServiceFunc func, const char *method, const char *urn); /** - Searches for a registered soap service. + * + * Register a default service for the router. + * + */ +extern herror_t soap_router_register_default_service(struct SoapRouter * router, SoapServiceFunc func, const char *method, const char *urn); - @param router The router object - @param urn URN of the service - @param method The name under which the service was registered. +/** + * + * Register a service description for the router. + * + */ +extern void soap_router_register_description(struct SoapRouter *router, xmlDocPtr doc); - @return The service if found, NULL otherwise. +/** + * + * Register a security provider for the router. + * */ -extern SoapService *soap_router_find_service(SoapRouter * router, const char *urn, const char *method); +extern void soap_router_register_security(struct SoapRouter *router, soap_auth auth); /** - Frees the router object. + * + * Searches for a registered soap service. + * + * @param router The router object + * @param urn URN of the service + * @param method The name under which the service was registered. + * + * @return The service if found, NULL otherwise. + * + */ +extern SoapService *soap_router_find_service(struct SoapRouter *router, const char *urn, const char *method); - @param router The router object to free +/** + * + * Frees the router object. + * + * @param router The router object to free + * + * @see soap_router_new + * */ -extern void soap_router_free(SoapRouter * router); +extern void soap_router_free(struct SoapRouter * router); #ifdef __cplusplus } diff --git a/libcsoap/soap-server.c b/libcsoap/soap-server.c index 11dbf53..d8d996d 100644 --- a/libcsoap/soap-server.c +++ b/libcsoap/soap-server.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-server.c,v 1.29 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-server.c,v 1.30 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -25,10 +25,6 @@ #include <config.h> #endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif - #ifdef HAVE_STDIO_H #include <stdio.h> #endif @@ -41,20 +37,10 @@ #include <errno.h> #endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - -#ifdef WIN32 -#define snprintf(buffer, num, s1, s2) sprintf(buffer, s1,s2) -#endif - #include <libxml/tree.h> #include <libxml/uri.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> #include <nanohttp/nanohttp-request.h> #include <nanohttp/nanohttp-server.h> #include <nanohttp/nanohttp-logging.h> @@ -73,7 +59,7 @@ static SoapRouterNode *head = NULL; static SoapRouterNode *tail = NULL; static SoapRouterNode * -router_node_new(SoapRouter * router, const char *context, SoapRouterNode * next) +router_node_new(struct SoapRouter * router, const char *context, SoapRouterNode * next) { const char *noname = "/lost_found"; SoapRouterNode *node; @@ -100,7 +86,13 @@ router_node_new(SoapRouter * router, const char *context, SoapRouterNode * next) return node; } -SoapRouter * +static herror_t +_soap_server_env_new_with_fault(const char *fault_string, const char *detail, struct SoapEnv **out) +{ + return soap_env_new_with_fault(SOAP_FAULT_RECEIVER, fault_string, soap_server_get_name(), detail, out); +} + +struct SoapRouter * soap_server_find_router(const char *context) { SoapRouterNode *node; @@ -114,25 +106,19 @@ soap_server_find_router(const char *context) return NULL; } -static herror_t -_soap_server_env_new_with_fault(const char *fault_string, const char *detail, SoapEnv **out) -{ - return soap_env_new_with_fault(SOAP_FAULT_RECEIVER, fault_string, soap_server_get_name(), detail, out); -} - herror_t -soap_server_process(SoapCtx *request, SoapCtx **response) +soap_server_process(struct SoapCtx *request, struct SoapCtx **response) { char buffer[1054]; - char *urn; - char *method; + const char *urn; + const char *method; char *to; - SoapRouter *router; + struct SoapRouter *router; SoapService *service; herror_t err; log_verbose1("processing"); - soap_xml_doc_print(request->env->root->doc); + xmlDocDump(stdout, request->env->root->doc); *response = soap_ctx_new(NULL); @@ -196,12 +182,15 @@ soap_server_process(SoapCtx *request, SoapCtx **response) } herror_t -soap_server_init_args(int argc, char *argv[]) +soap_server_init_args(int argc, char **argv) { herror_t status; if ((status = soap_transport_server_init_args(argc, argv)) != H_OK) + { + log_error2("soap_transport_server_init_args failed (%s)", herror_message(status)); return status; + } return H_OK; } @@ -213,12 +202,15 @@ soap_server_get_name(void) } herror_t -soap_server_register_router(SoapRouter *router, const char *context) +soap_server_register_router(struct SoapRouter *router, const char *context) { herror_t status; - if ((status = soap_transport_register_router(router, context)) != H_OK) + if ((status = soap_transport_register(context)) != H_OK) + { + log_error2("soap_transport_register failed (%s)", herror_message(status)); return status; + } if (tail == NULL) { diff --git a/libcsoap/soap-server.h b/libcsoap/soap-server.h index 70fc6aa..cafa9a5 100644 --- a/libcsoap/soap-server.h +++ b/libcsoap/soap-server.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-server.h,v 1.12 2006/11/21 20:59:02 m0gg Exp $ + * $Id: soap-server.h,v 1.13 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -43,7 +43,6 @@ extern "C" { */ herror_t soap_server_init_args(int argc, char **argv); - /** * * Register a router to the soap server. @@ -59,8 +58,13 @@ herror_t soap_server_init_args(int argc, char **argv); * @see soap_router_register_service * */ -extern herror_t soap_server_register_router(SoapRouter * router, const char *context); +extern herror_t soap_server_register_router(struct SoapRouter * router, const char *context); +/** + * + * Returns an URI name of the server. + * + */ extern const char *soap_server_get_name(void); /** @@ -69,6 +73,7 @@ extern const char *soap_server_get_name(void); * * @see httpd_run * @see udpd_run + * @see smptd_run * */ extern herror_t soap_server_run(void); @@ -88,16 +93,16 @@ extern void soap_server_destroy(void); typedef struct _SoapRouterNode { char *context; - SoapRouter *router; + struct SoapRouter *router; struct _SoapRouterNode *next; } SoapRouterNode; -extern SoapRouter *soap_server_find_router(const char *context); +extern struct SoapRouter *soap_server_find_router(const char *context); extern SoapRouterNode * soap_server_get_routers(void); -extern herror_t soap_server_process(SoapCtx *request, SoapCtx **response); +extern herror_t soap_server_process(struct SoapCtx *request, struct SoapCtx **response); #endif diff --git a/libcsoap/soap-service.c b/libcsoap/soap-service.c index 7a422c5..241eb82 100644 --- a/libcsoap/soap-service.c +++ b/libcsoap/soap-service.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-service.c,v 1.10 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-service.c,v 1.11 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -55,6 +55,7 @@ #include "soap-env.h" #include "soap-ctx.h" #include "soap-service.h" +#include "soap-router.h" SoapServiceNode * soap_service_node_new(SoapService * service, SoapServiceNode * next) diff --git a/libcsoap/soap-service.h b/libcsoap/soap-service.h index f507d77..e999e2e 100644 --- a/libcsoap/soap-service.h +++ b/libcsoap/soap-service.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-service.h,v 1.7 2006/11/21 20:59:02 m0gg Exp $ + * $Id: soap-service.h,v 1.8 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -24,7 +24,7 @@ #ifndef __csoap_service_h #define __csoap_service_h -typedef herror_t(*SoapServiceFunc) (SoapCtx *, SoapCtx *); +typedef herror_t (*SoapServiceFunc)(struct SoapCtx *request, struct SoapCtx *response); typedef struct _SoapService { @@ -45,12 +45,11 @@ typedef struct _SoapServiceNode extern "C" { #endif -SoapServiceNode *soap_service_node_new(SoapService * service, - SoapServiceNode * next); +extern SoapServiceNode *soap_service_node_new(SoapService * service, SoapServiceNode * next); -SoapService *soap_service_new(const char *urn, const char *method, SoapServiceFunc f); +extern SoapService *soap_service_new(const char *urn, const char *method, SoapServiceFunc f); -void soap_service_free(SoapService * service); +extern void soap_service_free(SoapService * service); #ifdef __cplusplus } diff --git a/libcsoap/soap-transport.c b/libcsoap/soap-transport.c index 6c84e35..1fc2c51 100644 --- a/libcsoap/soap-transport.c +++ b/libcsoap/soap-transport.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-transport.c,v 1.1 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-transport.c,v 1.2 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2007 Heiko Ronsdorf @@ -33,18 +33,10 @@ #include <string.h> #endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - #include <libxml/tree.h> #include <libxml/uri.h> #include <nanohttp/nanohttp-common.h> -#include <nanohttp/nanohttp-socket.h> -#include <nanohttp/nanohttp-stream.h> -#include <nanohttp/nanohttp-request.h> -#include <nanohttp/nanohttp-server.h> #include <nanohttp/nanohttp-logging.h> #include "soap-fault.h" @@ -71,12 +63,6 @@ struct soap_transport static struct soap_transport *head = NULL; static char soap_transport_name[512] = "not set"; -herror_t -soap_transport_receive(SoapCtx *request, SoapCtx **response) -{ - return soap_server_process(request, response); -} - static struct soap_transport * _soap_transport_new(const char *scheme, void *data, msg_exchange invoke) { @@ -114,6 +100,13 @@ _soap_transport_destroy(struct soap_transport *transport) return ret; } + +herror_t +soap_transport_process(struct SoapCtx *request, struct SoapCtx **response) +{ + return soap_server_process(request, response); +} + herror_t soap_transport_server_init_args(int argc, char **argv) { @@ -121,27 +114,39 @@ soap_transport_server_init_args(int argc, char **argv) char hostname[256]; if ((status = soap_nhttp_server_init_args(argc, argv)) != H_OK) + { + log_error2("soap_nhttp_server_init_args failed (%s)", herror_message(status)); return status; + } if ((status = soap_nudp_server_init_args(argc, argv)) != H_OK) + { + log_error2("soap_nudp_server_init_args failed (%s)", herror_message(status)); return status; + } gethostname(hostname, 256); - sprintf(soap_transport_name, "%s://%s:%i/csoap", soap_nhttp_get_protocol(), hostname, soap_nhttp_get_port()); + sprintf(soap_transport_name, "%s://%s:%i", soap_nhttp_get_protocol(), hostname, soap_nhttp_get_port()); return H_OK; } herror_t -soap_transport_register_router(SoapRouter *router, const char *context) +soap_transport_register(const void *data) { herror_t status; - if ((status = soap_nhttp_register_router(router, context)) != H_OK) + if ((status = soap_nhttp_register(data)) != H_OK) + { + log_error2("soap_nhttp_register failed (%s)", herror_message(status)); return status; + } - if ((status = soap_nudp_register_router(router, context)) != H_OK) + if ((status = soap_nudp_register(data)) != H_OK) + { + log_error2("soap_nudp_register failed (%s)", herror_message(status)); return status; + } return H_OK; } @@ -155,7 +160,7 @@ soap_transport_add(const char *scheme, void *data, msg_exchange invoke) if (!(transport = _soap_transport_new(scheme, data, invoke))) { log_error1("_soap_transport_new failed"); - return H_OK; + return herror_new("soap_transport_add", 0, "_soap_transport_new failed"); } if (head == NULL) @@ -177,10 +182,16 @@ soap_transport_server_run(void) herror_t status; if ((status = soap_nhttp_server_run()) != H_OK) + { + log_error2("soap_nhttp_server_run failed (%s)", herror_message(status)); return status; + } if ((status = soap_nudp_server_run()) != H_OK) + { + log_error2("soap_nudp_server_run failed (%s)", herror_message(status)); return status; + } return H_OK; } @@ -207,23 +218,29 @@ soap_transport_client_init_args(int argc, char **argv) herror_t status; if ((status = soap_nhttp_client_init_args(argc, argv)) != H_OK) + { + log_error2("soap_nhttp_client_init_args failed (%s)", herror_message(status)); return status; + } if ((status = soap_nudp_client_init_args(argc, argv)) != H_OK) + { + log_error2("soap_nudp_client_init_args failed (%s)", herror_message(status)); return status; + } return H_OK; } herror_t -soap_transport_client_invoke(SoapCtx *request, SoapCtx **response) +soap_transport_client_invoke(struct SoapCtx *request, struct SoapCtx **response) { struct soap_transport *walker; herror_t ret; xmlURI *dest; log_verbose1(__FUNCTION__); - soap_xml_doc_print(request->env->root->doc); + xmlDocDump(stdout, request->env->root->doc); dest = soap_addressing_get_to_address(request->env); diff --git a/libcsoap/soap-transport.h b/libcsoap/soap-transport.h index 8c31454..5cc3e68 100644 --- a/libcsoap/soap-transport.h +++ b/libcsoap/soap-transport.h @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-transport.h,v 1.1 2006/11/21 20:59:02 m0gg Exp $ +* $Id: soap-transport.h,v 1.2 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2007 Heiko Ronsdorf @@ -25,7 +25,7 @@ #define __csoap_transport_h #ifdef __CSOAP_INTERNAL -typedef herror_t (*msg_exchange)(void *data, SoapCtx *request, SoapCtx **response); +typedef herror_t (*msg_exchange)(void *data, struct SoapCtx *request, struct SoapCtx **response); #ifdef __cplusplus extern "C" { @@ -38,13 +38,13 @@ extern void soap_transport_server_destroy(void); extern const char *soap_transport_get_name(void); extern herror_t soap_transport_add(const char *protocol, void *data, msg_exchange invoke); extern herror_t soap_transport_remove(const char *protocol, void *data); -extern herror_t soap_transport_register_router(SoapRouter *router, const char *context); +extern herror_t soap_transport_register(const void *data); -extern herror_t soap_transport_send(SoapCtx *request, SoapCtx **response); -extern herror_t soap_transport_receive(SoapCtx *request, SoapCtx **response); +extern herror_t soap_transport_send(struct SoapCtx *request, struct SoapCtx **response); +extern herror_t soap_transport_process(struct SoapCtx *request, struct SoapCtx **response); extern herror_t soap_transport_client_init_args(int argc, char **argv); -extern herror_t soap_transport_client_invoke(SoapCtx *req, SoapCtx **res); +extern herror_t soap_transport_client_invoke(struct SoapCtx *req, struct SoapCtx **res); extern void soap_transport_client_destroy(void); #ifdef __cplusplus diff --git a/libcsoap/soap-wsil.c b/libcsoap/soap-wsil.c index ac4add8..7e0a7f2 100644 --- a/libcsoap/soap-wsil.c +++ b/libcsoap/soap-wsil.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-wsil.c,v 1.1 2006/11/23 13:20:46 m0gg Exp $ +* $Id: soap-wsil.c,v 1.2 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -34,14 +34,11 @@ #endif #include <libxml/tree.h> -#include <libxml/uri.h> #include <nanohttp/nanohttp-common.h> #include <nanohttp/nanohttp-request.h> #include <nanohttp/nanohttp-server.h> -#include "soap-fault.h" -#include "soap-env.h" #include "soap-ctx.h" #include "soap-service.h" #include "soap-router.h" @@ -49,38 +46,40 @@ #include "soap-wsil.h" static void -_soap_wsil_list_services(httpd_conn_t *conn, struct SoapRouter *router) +_soap_wsil_list_routers(httpd_conn_t *conn) { - SoapServiceNode *node; + SoapRouterNode *node; - for (node=router->service_head; node; node=node->next) - { + for (node=soap_server_get_routers(); node; node=node->next) + { http_output_stream_write_string(conn->out, "<service>" "<description " - "referencedNamespace=\"http://schemas.xmlsoap.org/wsdl/\" " "location=\""); http_output_stream_write_string(conn->out, soap_transport_get_name()); - http_output_stream_write_string(conn->out, node->service->method); + http_output_stream_write_string(conn->out, node->context); + http_output_stream_write_string(conn->out, + "\" " + "referencedNamespace=\""); + if (node->router->description) + { + xmlNodePtr root; + + root = xmlDocGetRootElement(node->router->description); + http_output_stream_write_string(conn->out, root->ns->href); + } + else + { + http_output_stream_write_string(conn->out, "http://schemas.xmlsoap.org/wsdl/"); + } http_output_stream_write_string(conn->out, "\" />" - "</service>\n"); + "</service>"); } return; } static void -_soap_wsil_list_routers(httpd_conn_t *conn) -{ - SoapRouterNode *node; - - for (node=soap_server_get_routers(); node; node=node->next) - _soap_wsil_list_services(conn, node->router); - - return; -} - -static void _soap_wsil_handle_get(httpd_conn_t * conn, struct hrequest_t * req) { httpd_set_header(conn, HEADER_CONTENT_TYPE, "text/xml"); diff --git a/libcsoap/soap-xml.c b/libcsoap/soap-xml.c index 801bdd1..e4cc894 100644 --- a/libcsoap/soap-xml.c +++ b/libcsoap/soap-xml.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-xml.c,v 1.11 2006/07/09 16:24:19 snowdrop Exp $ +* $Id: soap-xml.c,v 1.12 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -25,6 +25,9 @@ #include <config.h> #endif +#include <libxml/xpath.h> +#include <libxml/xpathInternals.h> + #include <nanohttp/nanohttp-logging.h> #include "soap-xml.h" @@ -69,7 +72,6 @@ soap_xml_get_next(xmlNodePtr param) return node; } - xmlXPathObjectPtr soap_xpath_eval(xmlDocPtr doc, const char *xpath) { @@ -88,62 +90,6 @@ soap_xpath_eval(xmlDocPtr doc, const char *xpath) return result; } - -int -soap_xpath_foreach(xmlDocPtr doc, const char *xpath, - soap_xmlnode_callback cb, void *userdata) -{ - int i = 0; - xmlNodeSetPtr nodeset; - xmlXPathObjectPtr xpathobj; - - xpathobj = soap_xpath_eval(doc, xpath); - - if (!xpathobj) - return 0; - - nodeset = xpathobj->nodesetval; - if (!nodeset) - return 0; - - for (i = 0; i < nodeset->nodeNr; i++) - { - if (!cb(nodeset->nodeTab[i], userdata)) - break; - } - - xmlXPathFreeObject((xmlXPathObjectPtr) nodeset); - return i; -} - - -void -soap_xml_doc_print(xmlDocPtr doc) -{ - xmlBufferPtr buffer; - xmlNodePtr root; - - if (doc == NULL) - { - puts("xmlDocPtr is NULL!"); - return; - } - - root = xmlDocGetRootElement(doc); - if (root == NULL) - { - puts("Empty document!"); - return; - } - - - buffer = xmlBufferCreate(); - xmlNodeDump(buffer, doc, root, 1, 0); - puts((const char *) xmlBufferContent(buffer)); - xmlBufferFree(buffer); - -} - char * soap_xml_get_text(xmlNodePtr node) { diff --git a/libcsoap/soap-xml.h b/libcsoap/soap-xml.h index 9b0a7a5..e7167b2 100644 --- a/libcsoap/soap-xml.h +++ b/libcsoap/soap-xml.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-xml.h,v 1.10 2006/11/21 20:59:02 m0gg Exp $ + * $Id: soap-xml.h,v 1.11 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -21,36 +21,23 @@ * * Email: ayaz@jprogrammer.net ******************************************************************/ -#ifndef cSOAP_XML_H -#define cSOAP_XML_H +#ifndef __csoap_xml_h +#define __csoap_xml_h -#include <libxml/xpath.h> -#include <libxml/xpathInternals.h> - -static const char * const soap_env_ns = "http://schemas.xmlsoap.org/soap/envelope/"; static const char * const soap_env_enc = "http://schemas.xmlsoap.org/soap/encoding/"; static const char * const soap_xsi_ns = "http://www.w3.org/1999/XMLSchema-instance"; static const char * const soap_xsd_ns = "http://www.w3.org/1999/XMLSchema"; - -typedef int (*soap_xmlnode_callback) (xmlNodePtr, void *); - #ifdef __cplusplus extern "C" { #endif -xmlNodePtr soap_xml_get_children(xmlNodePtr param); -xmlNodePtr soap_xml_get_next(xmlNodePtr param); - -xmlXPathObjectPtr soap_xpath_eval(xmlDocPtr doc, const char *xpath); - -int -soap_xpath_foreach(xmlDocPtr doc, const char *xpath, - soap_xmlnode_callback cb, void *userdata); +extern xmlNodePtr soap_xml_get_children(xmlNodePtr param); +extern xmlNodePtr soap_xml_get_next(xmlNodePtr param); +extern xmlXPathObjectPtr soap_xpath_eval(xmlDocPtr doc, const char *xpath); -void soap_xml_doc_print(xmlDocPtr doc); -char *soap_xml_get_text(xmlNodePtr node); +extern char *soap_xml_get_text(xmlNodePtr node); #ifdef __cplusplus } diff --git a/nanohttp/nanohttp-admin.c b/nanohttp/nanohttp-admin.c index 83c2931..746855b 100644 --- a/nanohttp/nanohttp-admin.c +++ b/nanohttp/nanohttp-admin.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-admin.c,v 1.3 2006/11/21 20:59:02 m0gg Exp $ +* $Id: nanohttp-admin.c,v 1.4 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -25,10 +25,6 @@ #include <config.h> #endif -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif - #ifdef HAVE_STDIO_H #include <stdio.h> #endif @@ -41,17 +37,12 @@ #include <pthread.h> #endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - #include "nanohttp-common.h" -#include "nanohttp-socket.h" #include "nanohttp-stream.h" #include "nanohttp-request.h" #include "nanohttp-server.h" -#include "nanohttp-admin.h" +#include "nanohttp-admin.h" static void _httpd_admin_send_title(httpd_conn_t *conn, const char *title) @@ -136,7 +127,7 @@ _httpd_admin_list_statistics(httpd_conn_t *conn, const char *service_name) static void -_httpd_admin_handle_get(httpd_conn_t * conn, hrequest_t * req) +_httpd_admin_handle_get(httpd_conn_t * conn, struct hrequest_t *req) { char *param; @@ -165,7 +156,7 @@ _httpd_admin_handle_get(httpd_conn_t * conn, hrequest_t * req) static void -_httpd_admin_entry(httpd_conn_t * conn, hrequest_t * req) +_httpd_admin_entry(httpd_conn_t * conn, struct hrequest_t *req) { if (req->method == HTTP_REQUEST_GET) { diff --git a/nanohttp/nanohttp-client.c b/nanohttp/nanohttp-client.c index a105b82..f8efeaf 100644 --- a/nanohttp/nanohttp-client.c +++ b/nanohttp/nanohttp-client.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-client.c,v 1.43 2006/11/21 08:34:34 m0gg Exp $ +* $Id: nanohttp-client.c,v 1.44 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -45,6 +45,10 @@ #include <stdarg.h> #endif +#ifdef HAVE_ERRNO_H +#include <errno.h> +#endif + #ifdef HAVE_STRING_H #include <string.h> #endif @@ -60,6 +64,7 @@ #include "nanohttp-common.h" #include "nanohttp-socket.h" #include "nanohttp-stream.h" +#include "nanohttp-request.h" #include "nanohttp-response.h" #include "nanohttp-base64.h" #include "nanohttp-logging.h" @@ -102,9 +107,19 @@ httpc_new(void) httpc_conn_t *res; if (!(res = (httpc_conn_t *) malloc(sizeof(httpc_conn_t)))) + { + log_error2("malloc failed (%s)", strerror(errno)); + return NULL; + } + + if (!(res->sock = (struct hsocket_t *)malloc(sizeof(struct hsocket_t)))) + { + log_error2("malloc failed (%s)", strerror(errno)); + free(res); return NULL; + } - if ((status = hsocket_init(&res->sock)) != H_OK) + if ((status = hsocket_init(res->sock)) != H_OK) { log_warn2("hsocket_init failed (%s)", herror_message(status)); return NULL; @@ -145,7 +160,8 @@ httpc_free(httpc_conn_t * conn) conn->out = NULL; } - hsocket_free(&(conn->sock)); + hsocket_free(conn->sock); + free(conn->sock); free(conn); return; @@ -161,7 +177,7 @@ httpc_close_free(httpc_conn_t * conn) if (conn == NULL) return; - hsocket_close(&(conn->sock)); + hsocket_close(conn->sock); httpc_free(conn); return; @@ -302,12 +318,12 @@ httpc_send_header(httpc_conn_t * conn) if (walker->key && walker->value) { sprintf(buffer, "%s: %s\r\n", walker->key, walker->value); - if ((status = hsocket_send(&(conn->sock), buffer)) != H_OK) + if ((status = hsocket_send(conn->sock, buffer)) != H_OK) return status; } } - return hsocket_send(&(conn->sock), "\r\n"); + return hsocket_send(conn->sock, "\r\n"); } /*-------------------------------------------------- @@ -386,7 +402,7 @@ httpc_talk_to_server(hreq_method_t method, httpc_conn_t * conn, ssl = url.protocol == PROTOCOL_HTTPS ? 1 : 0; /* Open connection */ - if ((status = hsocket_open(&conn->sock, url.host, url.port, ssl)) != H_OK) + if ((status = hsocket_open(conn->sock, url.host, url.port, ssl)) != H_OK) return status; switch(method) @@ -413,10 +429,10 @@ httpc_talk_to_server(hreq_method_t method, httpc_conn_t * conn, } log_verbose1("Sending request..."); - if ((status = hsocket_send(&(conn->sock), buffer)) != H_OK) + if ((status = hsocket_send(conn->sock, buffer)) != H_OK) { log_error2("Cannot send request (%s)", herror_message(status)); - hsocket_close(&(conn->sock)); + hsocket_close(conn->sock); return status; } @@ -424,7 +440,7 @@ httpc_talk_to_server(hreq_method_t method, httpc_conn_t * conn, if ((status = httpc_send_header(conn)) != H_OK) { log_error2("Cannot send header (%s)", herror_message(status)); - hsocket_close(&(conn->sock)); + hsocket_close(conn->sock); return status; } @@ -443,7 +459,7 @@ httpc_get(httpc_conn_t * conn, hresponse_t ** out, const char *urlstr) if ((status = httpc_talk_to_server(HTTP_REQUEST_GET, conn, urlstr)) != H_OK) return status; - if ((status = hresponse_new_from_socket(&(conn->sock), out)) != H_OK) + if ((status = hresponse_new_from_socket(conn->sock, out)) != H_OK) return status; return H_OK; @@ -462,7 +478,7 @@ httpc_post_begin(httpc_conn_t * conn, const char *url) if ((status = httpc_talk_to_server(HTTP_REQUEST_POST, conn, url)) != H_OK) return status; - conn->out = http_output_stream_new(&(conn->sock), conn->header); + conn->out = http_output_stream_new(conn->sock, conn->header); return H_OK; } @@ -481,7 +497,7 @@ httpc_post_end(httpc_conn_t * conn, hresponse_t ** out) if ((status = http_output_stream_flush(conn->out)) != H_OK) return status; - if ((status = hresponse_new_from_socket(&(conn->sock), out)) != H_OK) + if ((status = hresponse_new_from_socket(conn->sock, out)) != H_OK) return status; return H_OK; @@ -598,7 +614,7 @@ httpc_mime_end(httpc_conn_t * conn, hresponse_t ** out) if ((status = http_output_stream_flush(conn->out)) != H_OK) return status; - if ((status = hresponse_new_from_socket(&(conn->sock), out)) != H_OK) + if ((status = hresponse_new_from_socket(conn->sock, out)) != H_OK) return status; return H_OK; diff --git a/nanohttp/nanohttp-client.h b/nanohttp/nanohttp-client.h index 2ef96a8..7a1cc79 100644 --- a/nanohttp/nanohttp-client.h +++ b/nanohttp/nanohttp-client.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-client.h,v 1.25 2006/11/19 09:40:14 m0gg Exp $ + * $Id: nanohttp-client.h,v 1.26 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -26,7 +26,7 @@ typedef struct httpc_conn { - hsocket_t sock; + struct hsocket_t *sock; hpair_t *header; hurl_t url; http_version_t version; @@ -36,7 +36,7 @@ typedef struct httpc_conn long _dime_sent_bytes; int errcode; char errmsg[150]; - http_output_stream_t *out; + struct http_output_stream_t *out; int id; /* uniq id */ } httpc_conn_t; @@ -61,7 +61,7 @@ extern "C" { * * @see httpc_destroy, herror_t, soap_client_init_args */ -herror_t httpc_init(int argc, char *argv[]); +herror_t httpc_init(int argc, char **argv); /** * diff --git a/nanohttp/nanohttp-common.h b/nanohttp/nanohttp-common.h index bf54a12..cc9f8f8 100644 --- a/nanohttp/nanohttp-common.h +++ b/nanohttp/nanohttp-common.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-common.h,v 1.32 2006/11/19 09:40:14 m0gg Exp $ + * $Id: nanohttp-common.h,v 1.33 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -21,8 +21,8 @@ * * Email: ferhatayaz@yahoo.com ******************************************************************/ -#ifndef NANO_HTTP_COMMON_H -#define NANO_HTTP_COMMON_H +#ifndef __nanohttp_common_h +#define __nanohttp_common_h #define HEADER_CONTENT_ID "Content-Id" #define HEADER_CONTENT_TRANSFER_ENCODING "Content-Transfer-Encoding" @@ -69,75 +69,14 @@ #define HEADER_EXPIRES "Expires" #define HEADER_LAST_MODIFIED "Last-Modified" - /** * - * XXX: move to nanohttp-response.h - * - * Response Header Fields - * - * The response-header fields allow the server to pass additional information - * about the response which cannot be placed in the Status-Line. These header - * fields give information about the server and about further access to the - * resource identified by the Request-URI. (see RFC2616) + * Command line arguments for client and server. * */ -#define HEADER_ACCEPT_RANGES "Accept-Ranges" -#define HEADER_AGE "Age" -#define HEADER_EXTENSION_TAG "ETag" -#define HEADER_LOCATION "Location" -#define HEADER_PROXY_AUTHENTICATE "Proxy-Authenticate" -#define HEADER_RETRY_AFTER "Retry-After" -#define HEADER_SERVER "Server" -#define HEADER_VARY "Vary" -#define HEADER_WWW_AUTHENTICATE "WWW-Authenticate" - -/** - * - * XXX: move to nanohttp-request.h - * - * Request Header Fields - * - * The request-header fields allow the client to pass additional information - * about the request, and about the client itself, to the server. These fields - * act as request modifiers, with semantics equivalent to the parameters on a - * programming language method invocation (see RFC2616). - * - */ -#define HEADER_ACCEPT "Accept" -#define HEADER_CHARSET "Accept-Charset" -#define HEADER_ACCEPT_ENCODING "Accept-Encoding" -#define HEADER_ACCEPT_LANGUAGE "Accept-Language" -#define HEADER_AUTHORIZATION "Authorization" -#define HEADER_EXPECT "Expect" -#define HEADER_FROM "From" -#define HEADER_HOST "Host" -#define HEADER_IF_MATCH "If-Match" -#define HEADER_IF_MODIFIED_SINCE "If-Modified-Since" -#define HEADER_IF_NONE_MATCH "If-None-Match" -#define HEADER_IF_RANGE "If-Range" -#define HEADER_IF_UNMODIFIED_SINCE "If-Unmodified-Since" -#define HEADER_IF_MAX_FORWARDS "Max-Forwards" -#define HEADER_PROXY_AUTHORIZATION "Proxy-Authorization" -#define HEADER_RANGE "Range" -#define HEADER_REFERER "Referer" -#define HEADER_TRANSFER_EXTENSION "TE" -#define HEADER_USER_AGENT "User-Agent" - -/** - * - * nanohttp command line flags - * - */ -#define NHTTPD_ARG_PORT "-NHTTPport" -#define NHTTPD_ARG_TERMSIG "-NHTTPtsig" -#define NHTTPD_ARG_MAXCONN "-NHTTPmaxconn" -#define NHTTPD_ARG_TIMEOUT "-NHTTPtimeout" - #define NHTTP_ARG_CERT "-NHTTPcert" #define NHTTP_ARG_CERTPASS "-NHTTPcertpass" #define NHTTP_ARG_CA "-NHTTPCA" -#define NHTTP_ARG_HTTPS "-NHTTPS" #ifndef SAVE_STR #define SAVE_STR(str) ((str==0)?("(null)"):(str)) @@ -146,27 +85,13 @@ #define BOUNDARY_LENGTH 18 #define MAX_HEADER_SIZE 4256 -#define MAX_SOCKET_BUFFER_SIZE 4256 #define MAX_FILE_BUFFER_SIZE 4256 -#define URL_MAX_HOST_SIZE 120 -#define URL_MAX_CONTEXT_SIZE 1024 - -#define HSOCKET_MAX_BUFSIZE 1024 - #define REQUEST_MAX_PATH_SIZE 1024 #define RESPONSE_MAX_DESC_SIZE 1024 - -/* - DIME common stuff -*/ -#define DIME_VERSION_1 0x08 -#define DIME_FIRST_PACKAGE 0x04 -#define DIME_LAST_PACKAGE 0x02 -#define DIME_CHUNKED 0x01 -#define DIME_TYPE_URI 0x2 - - + +#define URL_MAX_HOST_SIZE 120 +#define URL_MAX_CONTEXT_SIZE 1024 /* TODO (#1#): find proper ports */ #define URL_DEFAULT_PORT_HTTP 80 @@ -234,15 +159,6 @@ #define HSSL_ERROR_SERVER 1760 #define HSSL_ERROR_CONNECT 1770 -/* -Set Sleep function platform depended -*/ -#ifdef WIN32 -#define system_sleep(seconds) Sleep(seconds*1000); -#else -#define system_sleep(seconds) sleep(seconds); -#endif - /** Indicates the version of the used HTTP protocol. @@ -275,12 +191,6 @@ typedef enum _hreq_method extern "C" { #endif -#ifdef WIN32 -#include <string.h> -char *strtok_r(char *s, const char *delim, char **save_ptr); -struct tm *localtime_r(const time_t * const timep, struct tm *p_tm); -#endif - typedef void *herror_t; herror_t herror_new(const char *func, int errcode, const char *format, ...); @@ -543,7 +453,7 @@ typedef struct _attachments part_t *root_part; } attachments_t; -attachments_t *attachments_new(); /* should be used internally */ +attachments_t *attachments_new(void); /* should be used internally */ /* Free a attachment. Create attachments with MIME diff --git a/nanohttp/nanohttp-logging.h b/nanohttp/nanohttp-logging.h index a687717..7bc1076 100644 --- a/nanohttp/nanohttp-logging.h +++ b/nanohttp/nanohttp-logging.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-logging.h,v 1.2 2006/08/28 10:39:52 m0gg Exp $ + * $Id: nanohttp-logging.h,v 1.3 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2006 Ferhat Ayaz @@ -47,7 +47,7 @@ extern log_level_t hlog_set_level(log_level_t level); extern log_level_t hlog_get_level(void); extern void hlog_set_file(const char *filename); -extern char *hlog_get_file(); +extern char *hlog_get_file(void); #ifdef WIN32 #if defined(_MSC_VER) && _MSC_VER <= 1200 diff --git a/nanohttp/nanohttp-mime.c b/nanohttp/nanohttp-mime.c index a853486..1736e3b 100755 --- a/nanohttp/nanohttp-mime.c +++ b/nanohttp/nanohttp-mime.c @@ -3,7 +3,7 @@ * | \/ | | | | \/ | | _/ * |_''_| |_| |_''_| |_'/ PARSER * -* $Id: nanohttp-mime.c,v 1.15 2006/11/21 08:34:34 m0gg Exp $ +* $Id: nanohttp-mime.c,v 1.16 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -518,7 +518,7 @@ MIME_read_status mime_streamreader_function(void *userdata, unsigned char *dest, int *size) { int readed = 0; - http_input_stream_t *in = (http_input_stream_t *) userdata; + struct http_input_stream_t *in = (struct http_input_stream_t *) userdata; if (!http_input_stream_is_ready(in)) return MIME_READ_EOF; @@ -799,7 +799,7 @@ _mime_received_bytes(void *data, const unsigned char *bytes, int size) */ attachments_t * -mime_message_parse(http_input_stream_t * in, const char *root_id, +mime_message_parse(struct http_input_stream_t * in, const char *root_id, const char *boundary, const char *dest_dir) { MIME_parser_status status; @@ -896,7 +896,7 @@ mime_message_parse_from_file(FILE * in, const char *root_id, } herror_t -mime_get_attachments(content_type_t * ctype, http_input_stream_t * in, +mime_get_attachments(content_type_t * ctype, struct http_input_stream_t * in, attachments_t ** dest) { /* MIME variables */ diff --git a/nanohttp/nanohttp-mime.h b/nanohttp/nanohttp-mime.h index 7d718d9..655c7e2 100755 --- a/nanohttp/nanohttp-mime.h +++ b/nanohttp/nanohttp-mime.h @@ -3,7 +3,7 @@ * | \/ | | | | \/ | | _/ * |_''_| |_| |_''_| |_'/ PARSER * -* $Id: nanohttp-mime.h,v 1.9 2006/11/19 09:40:14 m0gg Exp $ +* $Id: nanohttp-mime.h,v 1.10 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -37,11 +37,7 @@ extern "C" { "multipart/related" MIME Message Builder ------------------------------------------------------------------*/ - - -herror_t mime_get_attachments(content_type_t * ctype, - http_input_stream_t * in, - attachments_t ** dest); +extern herror_t mime_get_attachments(content_type_t * ctype, struct http_input_stream_t * in, attachments_t ** dest); #ifdef __cplusplus } diff --git a/nanohttp/nanohttp-request.c b/nanohttp/nanohttp-request.c index 30c79df..0fd1d7e 100755 --- a/nanohttp/nanohttp-request.c +++ b/nanohttp/nanohttp-request.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-request.c,v 1.17 2006/11/21 20:59:02 m0gg Exp $ +* $Id: nanohttp-request.c,v 1.18 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -56,24 +56,24 @@ #include "nanohttp-mime.h" #include "nanohttp-request.h" - -static hrequest_t * +static struct hrequest_t * hrequest_new(void) { - hrequest_t *req; + struct hrequest_t *req; - if (!(req = (hrequest_t *) malloc(sizeof(hrequest_t)))) { - + if (!(req = (struct hrequest_t *) malloc(sizeof(struct hrequest_t)))) + { log_error2("malloc failed (%s)", strerror(errno)); return NULL; } - if (!(req->statistics = (struct request_statistics *)malloc(sizeof(struct request_statistics)))) { - + if (!(req->statistics = (struct request_statistics *)malloc(sizeof(struct request_statistics)))) + { log_error2("malloc failed (%s)", strerror(errno)); free(req); return NULL; } + if (gettimeofday(&(req->statistics->time), NULL) < 0) log_error2("gettimeofday failed (%s)", strerror(errno)); @@ -88,10 +88,10 @@ hrequest_new(void) return req; } -static hrequest_t * +static struct hrequest_t * _hrequest_parse_header(char *data) { - hrequest_t *req; + struct hrequest_t *req; hpair_t *hpair = NULL, *qpair = NULL, *tmppair = NULL; char *tmp; @@ -214,20 +214,12 @@ _hrequest_parse_header(char *data) qpair->next = NULL; qpair->key = strdup(opt_key); qpair->value = strdup(opt_value); - } } } } else { - - /* parse "key: value" */ - /* tmp2 = result; key = (char *) strtok_r(tmp2, ": ", &saveptr2); value - = saveptr2; */ - - /* create pair */ -/* tmppair = (hpair_t *) malloc(sizeof(hpair_t));*/ tmppair = hpairnode_parse(result, ":", NULL); if (req->header == NULL) @@ -239,13 +231,6 @@ _hrequest_parse_header(char *data) hpair->next = tmppair; hpair = tmppair; } - - /* fill pairnode_t struct */ - /* - hpair->next = NULL; hpair->key = (char *) malloc(strlen(key) + 1); - hpair->value = (char *) malloc(strlen(value) + 1); - - strcpy(hpair->key, key); strcpy(hpair->value, value); */ } } @@ -257,9 +242,8 @@ _hrequest_parse_header(char *data) return req; } - void -hrequest_free(hrequest_t * req) +hrequest_free(struct hrequest_t * req) { if (req == NULL) return; @@ -284,13 +268,12 @@ hrequest_free(hrequest_t * req) return; } - herror_t -hrequest_new_from_socket(hsocket_t *sock, hrequest_t ** out) +hrequest_new_from_socket(struct hsocket_t *sock, struct hrequest_t ** out) { int i, readed; herror_t status; - hrequest_t *req; + struct hrequest_t *req; char buffer[MAX_HEADER_SIZE + 1]; attachments_t *mimeMessage; diff --git a/nanohttp/nanohttp-request.h b/nanohttp/nanohttp-request.h index ba1b907..2234e99 100755 --- a/nanohttp/nanohttp-request.h +++ b/nanohttp/nanohttp-request.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-request.h,v 1.9 2006/11/21 20:59:02 m0gg Exp $ + * $Id: nanohttp-request.h,v 1.10 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -21,8 +21,38 @@ * * Email: ferhatayaz@yahoo.com ******************************************************************/ -#ifndef NANO_HTTP_REQUEST_H -#define NANO_HTTP_REQUEST_H +#ifndef __nhttp_request_h +#define __nhttp_request_h + +/** + * + * Request Header Fields + * + * The request-header fields allow the client to pass additional information + * about the request, and about the client itself, to the server. These fields + * act as request modifiers, with semantics equivalent to the parameters on a + * programming language method invocation (see RFC2616). + * + */ +#define HEADER_ACCEPT "Accept" +#define HEADER_CHARSET "Accept-Charset" +#define HEADER_ACCEPT_ENCODING "Accept-Encoding" +#define HEADER_ACCEPT_LANGUAGE "Accept-Language" +#define HEADER_AUTHORIZATION "Authorization" +#define HEADER_EXPECT "Expect" +#define HEADER_FROM "From" +#define HEADER_HOST "Host" +#define HEADER_IF_MATCH "If-Match" +#define HEADER_IF_MODIFIED_SINCE "If-Modified-Since" +#define HEADER_IF_NONE_MATCH "If-None-Match" +#define HEADER_IF_RANGE "If-Range" +#define HEADER_IF_UNMODIFIED_SINCE "If-Unmodified-Since" +#define HEADER_IF_MAX_FORWARDS "Max-Forwards" +#define HEADER_PROXY_AUTHORIZATION "Proxy-Authorization" +#define HEADER_RANGE "Range" +#define HEADER_REFERER "Referer" +#define HEADER_TRANSFER_EXTENSION "TE" +#define HEADER_USER_AGENT "User-Agent" #ifdef __NHTTP_INTERNAL struct request_statistics @@ -36,7 +66,7 @@ struct request_statistics /* request object */ -typedef struct hrequest +struct hrequest_t { hreq_method_t method; http_version_t version; @@ -47,18 +77,20 @@ typedef struct hrequest struct request_statistics *statistics; - http_input_stream_t *in; + struct http_input_stream_t *in; content_type_t *content_type; attachments_t *attachments; char root_part_id[150]; -} hrequest_t; +}; #ifdef __cplusplus extern "C" { #endif -herror_t hrequest_new_from_socket(hsocket_t *sock, hrequest_t ** out); -void hrequest_free(hrequest_t * req); +#ifdef __NHTTP_INTERNAL +herror_t hrequest_new_from_socket(struct hsocket_t *sock, struct hrequest_t **out); +void hrequest_free(struct hrequest_t *req); +#endif #ifdef __cplusplus } diff --git a/nanohttp/nanohttp-response.c b/nanohttp/nanohttp-response.c index db2f897..ad8c4a1 100755 --- a/nanohttp/nanohttp-response.c +++ b/nanohttp/nanohttp-response.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-response.c,v 1.13 2006/11/21 08:34:34 m0gg Exp $ +* $Id: nanohttp-response.c,v 1.14 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -154,7 +154,7 @@ _hresponse_parse_header(const char *buffer) herror_t -hresponse_new_from_socket(hsocket_t *sock, hresponse_t ** out) +hresponse_new_from_socket(struct hsocket_t *sock, hresponse_t ** out) { int i = 0, count; herror_t status; diff --git a/nanohttp/nanohttp-response.h b/nanohttp/nanohttp-response.h index 4dcc452..553d69f 100755 --- a/nanohttp/nanohttp-response.h +++ b/nanohttp/nanohttp-response.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-response.h,v 1.8 2006/11/19 09:40:14 m0gg Exp $ + * $Id: nanohttp-response.h,v 1.9 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -24,6 +24,28 @@ #ifndef __nanohttp_response_h #define __nanohttp_response_h +/** + * + * Response Header Fields + * + * The response-header fields allow the server to pass additional information + * about the response which cannot be placed in the Status-Line. These header + * fields give information about the server and about further access to the + * resource identified by the Request-URI. (see RFC2616) + * + * @see http://www.ietf.org/rfc/rfc2616.txt + * + */ +#define HEADER_ACCEPT_RANGES "Accept-Ranges" +#define HEADER_AGE "Age" +#define HEADER_EXTENSION_TAG "ETag" +#define HEADER_LOCATION "Location" +#define HEADER_PROXY_AUTHENTICATE "Proxy-Authenticate" +#define HEADER_RETRY_AFTER "Retry-After" +#define HEADER_SERVER "Server" +#define HEADER_VARY "Vary" +#define HEADER_WWW_AUTHENTICATE "WWW-Authenticate" + /* response object */ typedef struct hresponse { @@ -33,7 +55,7 @@ typedef struct hresponse hpair_t *header; - http_input_stream_t *in; + struct http_input_stream_t *in; content_type_t *content_type; attachments_t *attachments; char root_part_id[150]; @@ -43,8 +65,10 @@ typedef struct hresponse extern "C" { #endif -herror_t hresponse_new_from_socket(hsocket_t *sock, hresponse_t ** out); +#ifdef __NHTTP_INTERNAL +herror_t hresponse_new_from_socket(struct hsocket_t *sock, hresponse_t ** out); void hresponse_free(hresponse_t * res); +#endif #ifdef __cplusplus } diff --git a/nanohttp/nanohttp-server.c b/nanohttp/nanohttp-server.c index 269e741..45b9348 100644 --- a/nanohttp/nanohttp-server.c +++ b/nanohttp/nanohttp-server.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-server.c,v 1.64 2006/11/21 20:59:03 m0gg Exp $ +* $Id: nanohttp-server.c,v 1.65 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -82,6 +82,7 @@ #include "nanohttp-socket.h" #include "nanohttp-stream.h" #include "nanohttp-request.h" +#include "nanohttp-response.h" #include "nanohttp-server.h" #include "nanohttp-base64.h" #include "nanohttp-ssl.h" @@ -90,29 +91,27 @@ typedef struct _conndata { volatile int flag; - hsocket_t sock; + struct hsocket_t sock; #ifdef WIN32 HANDLE tid; #else pthread_t tid; pthread_attr_t attr; #endif - time_t atime; } conndata_t; #define CONNECTION_FREE 0 #define CONNECTION_IN_USE 1 -/* - * ----------------------------------------------------- - * nano httpd - * internally globals - * ----------------------------------------------------- +/** + * + * nanohttpd internally globals + * */ static volatile int _httpd_run = 1; -static hsocket_t _httpd_socket; +static struct hsocket_t _httpd_socket; static int _httpd_port = 10000; static int _httpd_max_connections = 20; static int _httpd_timeout = 10; @@ -126,7 +125,6 @@ static conndata_t *_httpd_connection; #ifdef WIN32 static DWORD _httpd_terminate_signal = CTRL_C_EVENT; static int _httpd_max_idle = 120; -static void WSAReaper(void *x); HANDLE _httpd_connection_lock; LPCTSTR _httpd_connection_lock_str; #define strncasecmp(s1, s2, num) strncmp(s1, s2, num) @@ -137,6 +135,23 @@ static sigset_t thrsigset; static pthread_mutex_t _httpd_connection_lock; #endif +/** + * + * Set Sleep function platform depended + * + */ +#ifdef WIN32 +static void _sys_sleep(int secs) +{ + Sleep(secs*1000); +} +#else +static inline void _sys_sleep(int secs) +{ + sleep(secs); +} +#endif + static void _httpd_parse_arguments(int argc, char **argv) { @@ -186,38 +201,42 @@ _httpd_connection_slots_init(void) return; } -static void +static herror_t _httpd_register_builtin_services(int argc, char **argv) { herror_t status; if ((status = httpd_admin_init_args(argc, argv)) != H_OK) + { log_error2("httpd_admin_init_args failed (%s)", herror_message(status)); + return status; + } - return; + return H_OK; } -/* - * ----------------------------------------------------- - * FUNCTION: httpd_init - * NOTE: This will be called from soap_server_init_args() - * ----------------------------------------------------- - */ herror_t -httpd_init(int argc, char *argv[]) +httpd_init(int argc, char **argv) { herror_t status; _httpd_parse_arguments(argc, argv); if ((status = hsocket_module_init(argc, argv)) != H_OK) + { + log_error2("hsocket_modeule_init failed (%s)", herror_message(status)); return status; + } log_verbose2("socket bind to port '%d'", _httpd_port); _httpd_connection_slots_init(); - _httpd_register_builtin_services(argc, argv); + if ((status = _httpd_register_builtin_services(argc, argv)) != H_OK) + { + log_error2("_httpd_register_builtin_services failed (%s)", herror_message(status)); + return status; + } if ((status = hsocket_init(&_httpd_socket)) != H_OK) { @@ -225,15 +244,16 @@ httpd_init(int argc, char *argv[]) return status; } - return hsocket_bind(&_httpd_socket, _httpd_port); + if ((status = hsocket_bind(&_httpd_socket, _httpd_port)) != H_OK) + { + log_error2("hsocket_bind failed (%s)", herror_message(status)); + return status; + } + + return H_OK; } -/* - * ----------------------------------------------------- - * FUNCTION: httpd_register - * ----------------------------------------------------- - */ -int +herror_t httpd_register_secure(const char *ctx, httpd_service func, httpd_auth auth) { hservice_t *service; @@ -241,13 +261,13 @@ httpd_register_secure(const char *ctx, httpd_service func, httpd_auth auth) if (!(service = (hservice_t *) malloc(sizeof(hservice_t)))) { log_error2("malloc failed (%s)", strerror(errno)); - return -1; + return herror_new("httpd_register_secure", 0, "malloc failed (%s)", strerror(errno)); } if (!(service->statistics = (struct service_statistics *)malloc(sizeof(struct service_statistics)))) { log_error2("malloc failed (%s)", strerror(errno)); - return -1; + return herror_new("httpd_register_secure", 0, "malloc failed (%s)", strerror(errno)); } memset(service->statistics, 0, sizeof(struct service_statistics)); service->statistics->time.tv_sec = 0; @@ -270,19 +290,19 @@ httpd_register_secure(const char *ctx, httpd_service func, httpd_auth auth) _httpd_services_tail = service; } - return 1; + return H_OK; } -int +herror_t httpd_register(const char *ctx, httpd_service service) { return httpd_register_secure(ctx, service, NULL); } -int +herror_t httpd_register_default_secure(const char *ctx, httpd_service service, httpd_auth auth) { - int ret; + herror_t ret; ret = httpd_register_secure(ctx, service, auth); @@ -292,13 +312,13 @@ httpd_register_default_secure(const char *ctx, httpd_service service, httpd_auth return ret; } -int +herror_t httpd_register_default(const char *ctx, httpd_service service) { return httpd_register_default_secure(ctx, service, NULL); } -int +short httpd_get_port(void) { return _httpd_port; @@ -314,6 +334,8 @@ void httpd_set_timeout(int t) { _httpd_timeout = t; + + return; } const char * @@ -322,9 +344,6 @@ httpd_get_protocol(void) return hssl_enabled() ? "https" : "http"; } -/*-------------------------------------------------- -FUNCTION: httpd_get_conncount -----------------------------------------------------*/ int httpd_get_conncount(void) { @@ -339,22 +358,12 @@ httpd_get_conncount(void) return ret; } -/* - * ----------------------------------------------------- - * FUNCTION: httpd_get_services - * ----------------------------------------------------- - */ hservice_t * httpd_get_services(void) { return _httpd_services_head; } -/* - * ----------------------------------------------------- - * FUNCTION: httpd_services - * ----------------------------------------------------- - */ static void hservice_free(hservice_t * service) { @@ -363,11 +372,6 @@ hservice_free(hservice_t * service) return; } -/* - * ----------------------------------------------------- - * FUNCTION: httpd_find_service - * ----------------------------------------------------- - */ hservice_t * httpd_find_service(const char *context) { @@ -382,12 +386,6 @@ httpd_find_service(const char *context) return _httpd_services_default; } - -/* - * ----------------------------------------------------- - * FUNCTION: httpd_response_set_content_type - * ----------------------------------------------------- - */ void httpd_response_set_content_type(httpd_conn_t * res, const char *content_type) { @@ -396,12 +394,6 @@ httpd_response_set_content_type(httpd_conn_t * res, const char *content_type) return; } - -/* - * ----------------------------------------------------- - * FUNCTION: httpd_response_send_header - * ----------------------------------------------------- - */ herror_t httpd_send_header(httpd_conn_t * res, int code, const char *text) { @@ -452,14 +444,21 @@ httpd_send_header(httpd_conn_t * res, int code, const char *text) return H_OK; } - herror_t httpd_send_internal_error(httpd_conn_t * conn, const char *errmsg) { const char *template1 = - "<html><body><h3>Error!</h3><hr> Message: '%s' </body></html>\r\n"; - - char buffer[4064]; + "<html>" + "<head>" + "</head>" + "<body>" + "<h3>Error!</h3>" + "<hr/>" + "<div>Message: '%s'</div>" + "</body>" + "</html>"; + + char buffer[4096]; char buflen[5]; sprintf(buffer, template1, errmsg); @@ -471,13 +470,8 @@ httpd_send_internal_error(httpd_conn_t * conn, const char *errmsg) return http_output_stream_write_string(conn->out, buffer); } -/* - * ----------------------------------------------------- - * FUNCTION: httpd_request_print - * ----------------------------------------------------- - */ static void -httpd_request_print(hrequest_t * req) +_httpd_request_print(struct hrequest_t * req) { hpair_t *pair; @@ -501,15 +495,13 @@ httpd_request_print(hrequest_t * req) return; } - httpd_conn_t * -httpd_new(hsocket_t * sock) +httpd_new(struct hsocket_t * sock) { httpd_conn_t *conn; if (!(conn = (httpd_conn_t *) malloc(sizeof(httpd_conn_t)))) { - log_error2("malloc failed (%s)", strerror(errno)); return NULL; } @@ -521,7 +513,6 @@ httpd_new(hsocket_t * sock) return conn; } - void httpd_free(httpd_conn_t * conn) { @@ -539,11 +530,9 @@ httpd_free(httpd_conn_t * conn) return; } - static int _httpd_decode_authorization(const char *value, char **user, char **pass) { - unsigned char *tmp, *tmp2; size_t len; @@ -580,7 +569,7 @@ _httpd_decode_authorization(const char *value, char **user, char **pass) } static int -_httpd_authenticate_request(hrequest_t * req, httpd_auth auth) +_httpd_authenticate_request(struct hrequest_t * req, httpd_auth auth) { char *user, *pass; char *authorization; @@ -614,11 +603,6 @@ _httpd_authenticate_request(hrequest_t * req, httpd_auth auth) return ret; } -/* - * ----------------------------------------------------- - * FUNCTION: httpd_session_main - * ----------------------------------------------------- - */ #ifdef WIN32 static unsigned _stdcall httpd_session_main(void *data) @@ -627,7 +611,7 @@ static void * httpd_session_main(void *data) #endif { - hrequest_t *req; /* only for test */ + struct hrequest_t *req; conndata_t *conn; httpd_conn_t *rconn; hservice_t *service; @@ -649,9 +633,6 @@ httpd_session_main(void *data) { log_verbose3("starting HTTP request on socket %d (%p)", conn->sock, conn->sock.sock); - /* XXX: only used in WSAreaper */ - conn->atime = time(NULL); - if ((status = hrequest_new_from_socket(&(conn->sock), &req)) != H_OK) { int code; @@ -660,8 +641,7 @@ httpd_session_main(void *data) { case HSOCKET_ERROR_SSLCLOSE: case HSOCKET_ERROR_RECEIVE: - log_error2("hrequest_new_from_socket failed (%s)", - herror_message(status)); + log_error2("hrequest_new_from_socket failed (%s)", herror_message(status)); break; default: httpd_send_internal_error(rconn, herror_message(status)); @@ -729,11 +709,11 @@ httpd_session_main(void *data) char *template = "<html>" "<head>" - "<title>Unauthorized</title>" - "</head>" - "<body>" - "<h1>Unauthorized request logged</h1>" - "</body>" + "<title>Unauthorized</title>" + "</head>" + "<body>" + "<h1>Unauthorized request logged</h1>" + "</body>" "</html>"; httpd_set_header(rconn, HEADER_WWW_AUTHENTICATE, @@ -810,6 +790,7 @@ httpd_set_headers(httpd_conn_t * conn, hpair_t * header) httpd_set_header(conn, header->key, header->value); header = header->next; } + return; } int @@ -843,11 +824,6 @@ httpd_add_headers(httpd_conn_t * conn, const hpair_t * values) return; } -/* - * ----------------------------------------------------- - * FUNCTION: httpd_term - * ----------------------------------------------------- - */ #ifdef WIN32 BOOL WINAPI httpd_term(DWORD sig) @@ -894,9 +870,6 @@ _httpd_register_signal_handler(void) return; } -/*-------------------------------------------------- -FUNCTION: _httpd_wait_for_empty_conn -----------------------------------------------------*/ static conndata_t * _httpd_wait_for_empty_conn(void) { @@ -907,13 +880,13 @@ _httpd_wait_for_empty_conn(void) #else pthread_mutex_lock(&_httpd_connection_lock); #endif + for (i = 0;; i++) { if (!_httpd_run) { - #ifdef WIN32 - ReleaseMutex(_httpd_connection_lock); + ReleaseMutex(_httpd_connection_lock); #else pthread_mutex_unlock(&_httpd_connection_lock); #endif @@ -922,7 +895,7 @@ _httpd_wait_for_empty_conn(void) if (i >= _httpd_max_connections) { - system_sleep(1); + _sys_sleep(1); i = -1; } else if (_httpd_connection[i].flag == CONNECTION_FREE) @@ -931,20 +904,16 @@ _httpd_wait_for_empty_conn(void) break; } } + #ifdef WIN32 - ReleaseMutex(_httpd_connection_lock); + ReleaseMutex(_httpd_connection_lock); #else - pthread_mutex_unlock(&_httpd_connection_lock); + pthread_mutex_unlock(&_httpd_connection_lock); #endif return &_httpd_connection[i]; } -/* - * ----------------------------------------------------- - * FUNCTION: _httpd_start_thread - * ----------------------------------------------------- - */ static void _httpd_start_thread(conndata_t * conn) { @@ -969,13 +938,6 @@ _httpd_start_thread(conndata_t * conn) return; } - -/* - * ----------------------------------------------------- - * FUNCTION: httpd_run - * ----------------------------------------------------- - */ - herror_t httpd_run(void) { @@ -1074,55 +1036,8 @@ httpd_destroy(void) return; } -#ifdef WIN32 - -static void -WSAReaper(void *x) -{ - short int connections; - short int i; - char junk[10]; - int rc; - time_t ctime; - - for (;;) - { - connections = 0; - ctime = time((time_t) 0); - for (i = 0; i < _httpd_max_connections; i++) - { - if (_httpd_connection[i].tid == 0) - continue; - GetExitCodeThread((HANDLE) _httpd_connection[i].tid, (PDWORD) & rc); - if (rc != STILL_ACTIVE) - continue; - connections++; - if ((ctime - _httpd_connection[i].atime < _httpd_max_idle) || - (_httpd_connection[i].atime == 0)) - continue; - log_verbose3("Reaping socket %u from (runtime ~= %d seconds)", - _httpd_connection[i].sock, - ctime - _httpd_connection[i].atime); - shutdown(_httpd_connection[i].sock.sock, 2); - while (recv(_httpd_connection[i].sock.sock, junk, sizeof(junk), 0) > 0) - { - }; - closesocket(_httpd_connection[i].sock.sock); - _httpd_connection[i].sock.sock = 0; - TerminateThread(_httpd_connection[i].tid, (DWORD) & rc); - CloseHandle(_httpd_connection[i].tid); - memset((char *) &_httpd_connection[i], 0, sizeof(_httpd_connection[i])); - } - Sleep(100); - } - return; -} - -#endif - unsigned char * -httpd_get_postdata(httpd_conn_t * conn, hrequest_t * req, long *received, - long max) +httpd_get_postdata(httpd_conn_t * conn, struct hrequest_t * req, long *received, long max) { char *content_length_str; long content_length = 0; diff --git a/nanohttp/nanohttp-server.h b/nanohttp/nanohttp-server.h index eb3a06b..be48005 100644 --- a/nanohttp/nanohttp-server.h +++ b/nanohttp/nanohttp-server.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-server.h,v 1.23 2006/11/21 20:59:03 m0gg Exp $ + * $Id: nanohttp-server.h,v 1.24 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -24,26 +24,47 @@ #ifndef __nanohttp_server_h #define __nanohttp_server_h +/** + * + * nanohttp command line flags + * + */ +#define NHTTPD_ARG_PORT "-NHTTPport" +#define NHTTPD_ARG_TERMSIG "-NHTTPtsig" +#define NHTTPD_ARG_MAXCONN "-NHTTPmaxconn" +#define NHTTPD_ARG_TIMEOUT "-NHTTPtimeout" typedef struct httpd_conn { - hsocket_t *sock; + struct hsocket_t *sock; char content_type[25]; - http_output_stream_t *out; + struct http_output_stream_t *out; hpair_t *header; } httpd_conn_t; +/** + * + * Service callback function for a nanoHTTP service. + * + */ +typedef void (*httpd_service) (httpd_conn_t *conn, struct hrequest_t *req); -/* - Service callback +/** + * + * Authentication callback function for a nanoHTTP service. + * */ -typedef void (*httpd_service) (httpd_conn_t *, hrequest_t *); -typedef int (*httpd_auth) (hrequest_t * req, const char *user, - const char *password); +typedef int (*httpd_auth) (struct hrequest_t *req, const char *user, const char *pass); #ifdef __NHTTP_INTERNAL -struct service_statistics { +/** + * + * Service statistics per nanoHTTP service. + * + */ +struct service_statistics +{ unsigned long requests; unsigned long bytes_transmitted; unsigned long bytes_received; @@ -52,8 +73,10 @@ struct service_statistics { }; #endif -/* +/** + * * Service representation object + * */ typedef struct tag_hservice { @@ -65,7 +88,6 @@ typedef struct tag_hservice } hservice_t; - #ifdef __cplusplus extern "C" { @@ -75,43 +97,35 @@ extern "C" /* Begin httpd_* function set */ - herror_t httpd_init(int argc, char *argv[]); - void httpd_destroy(void); + extern herror_t httpd_init(int argc, char *argv[]); + extern void httpd_destroy(void); - herror_t httpd_run(void); + extern herror_t httpd_run(void); - int httpd_register(const char *ctx, httpd_service service); - int httpd_register_secure(const char *ctx, httpd_service service, - httpd_auth auth); + extern herror_t httpd_register(const char *ctx, httpd_service service); + extern herror_t httpd_register_secure(const char *ctx, httpd_service service, httpd_auth auth); - int httpd_register_default(const char *ctx, httpd_service service); - int httpd_register_default_secure(const char *ctx, httpd_service service, - httpd_auth auth); + extern herror_t httpd_register_default(const char *ctx, httpd_service service); + extern herror_t httpd_register_default_secure(const char *ctx, httpd_service service, httpd_auth auth); - int httpd_get_port(void); - int httpd_get_timeout(void); - void httpd_set_timeout(int t); + extern short httpd_get_port(void); + extern int httpd_get_timeout(void); + extern void httpd_set_timeout(int t); - const char *httpd_get_protocol(void); - int httpd_get_conncount(void); + extern const char *httpd_get_protocol(void); + extern int httpd_get_conncount(void); - hservice_t *httpd_get_services(void); - hservice_t *httpd_find_service(const char *name); + extern hservice_t *httpd_get_services(void); + extern hservice_t *httpd_find_service(const char *name); - herror_t httpd_send_header(httpd_conn_t * res, int code, const char *text); + extern herror_t httpd_send_header(httpd_conn_t * res, int code, const char *text); - int httpd_set_header(httpd_conn_t * conn, const char *key, - const char *value); - void httpd_set_headers(httpd_conn_t * conn, hpair_t * header); + extern int httpd_set_header(httpd_conn_t * conn, const char *key, const char *value); + extern void httpd_set_headers(httpd_conn_t * conn, hpair_t * header); - int httpd_add_header(httpd_conn_t * conn, const char *key, - const char *value); - void httpd_add_headers(httpd_conn_t * conn, const hpair_t * values); + extern int httpd_add_header(httpd_conn_t * conn, const char *key, const char *value); + extern void httpd_add_headers(httpd_conn_t * conn, const hpair_t * values); -/* -unsigned char *httpd_get_postdata(httpd_conn_t *conn, - hrequest_t *req, long *received, long max); -*/ /* -------------------------------------------------------------- MIME RELATED FUNCTIONS ---------------------------------------------------------------*/ @@ -123,7 +137,7 @@ unsigned char *httpd_get_postdata(httpd_conn_t *conn, Begin MIME multipart/related POST Returns: HSOCKET_OK or error flag */ - herror_t httpd_mime_send_header(httpd_conn_t * conn, + extern herror_t httpd_mime_send_header(httpd_conn_t * conn, const char *related_start, const char *related_start_info, const char *related_type, int code, @@ -133,7 +147,7 @@ unsigned char *httpd_get_postdata(httpd_conn_t *conn, Send boundary and part header and continue with next part */ - herror_t httpd_mime_next(httpd_conn_t * conn, + extern herror_t httpd_mime_next(httpd_conn_t * conn, const char *content_id, const char *content_type, const char *transfer_encoding); @@ -142,7 +156,7 @@ unsigned char *httpd_get_postdata(httpd_conn_t *conn, Send boundary and part header and continue with next part */ - herror_t httpd_mime_send_file(httpd_conn_t * conn, + extern herror_t httpd_mime_send_file(httpd_conn_t * conn, const char *content_id, const char *content_type, const char *transfer_encoding, @@ -152,7 +166,7 @@ unsigned char *httpd_get_postdata(httpd_conn_t *conn, Finish MIME request Returns: HSOCKET_OK or error flag */ - herror_t httpd_mime_end(httpd_conn_t * conn); + extern herror_t httpd_mime_end(httpd_conn_t * conn); #ifdef __cplusplus diff --git a/nanohttp/nanohttp-socket.c b/nanohttp/nanohttp-socket.c index d9e8900..9936379 100644 --- a/nanohttp/nanohttp-socket.c +++ b/nanohttp/nanohttp-socket.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-socket.c,v 1.62 2006/11/19 09:40:14 m0gg Exp $ +* $Id: nanohttp-socket.c,v 1.63 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -79,10 +79,10 @@ typedef int ssize_t; #endif -#include "nanohttp-logging.h" #include "nanohttp-common.h" #include "nanohttp-socket.h" #include "nanohttp-ssl.h" +#include "nanohttp-logging.h" #ifdef WIN32 static void @@ -114,11 +114,6 @@ _hsocket_module_sys_destroy(void) } #endif -/*-------------------------------------------------- -FUNCTION: hsocket_module_init -NOTE: This will be called from httpd_init() - for server and from httpc_init() for client -----------------------------------------------------*/ herror_t hsocket_module_init(int argc, char **argv) { @@ -127,9 +122,6 @@ hsocket_module_init(int argc, char **argv) return hssl_module_init(argc, argv); } -/*-------------------------------------------------- -FUNCTION: hsocket_module_destroy -----------------------------------------------------*/ void hsocket_module_destroy(void) { @@ -138,34 +130,25 @@ hsocket_module_destroy(void) return; } -/*-------------------------------------------------- -FUNCTION: hsocket_init -----------------------------------------------------*/ herror_t -hsocket_init(hsocket_t * sock) +hsocket_init(struct hsocket_t * sock) { - memset(sock, 0, sizeof(hsocket_t)); + memset(sock, 0, sizeof(struct hsocket_t)); sock->sock = HSOCKET_FREE; return H_OK; } -/*-------------------------------------------------- -FUNCTION: hsocket_free -----------------------------------------------------*/ void -hsocket_free(hsocket_t * sock) +hsocket_free(struct hsocket_t * sock) { /* nop */ return; } -/*-------------------------------------------------- -FUNCTION: hsocket_open -----------------------------------------------------*/ herror_t -hsocket_open(hsocket_t * dsock, const char *hostname, int port, int ssl) +hsocket_open(struct hsocket_t * dsock, const char *hostname, int port, int ssl) { struct sockaddr_in address; struct hostent *host; @@ -209,13 +192,10 @@ hsocket_open(hsocket_t * dsock, const char *hostname, int port, int ssl) return H_OK; } -/*-------------------------------------------------- -FUNCTION: hsocket_bind -----------------------------------------------------*/ herror_t -hsocket_bind(hsocket_t * dsock, unsigned short port) +hsocket_bind(struct hsocket_t *dsock, unsigned short port) { - hsocket_t sock; + struct hsocket_t sock; struct sockaddr_in addr; int opt = 1; @@ -234,8 +214,7 @@ hsocket_bind(hsocket_t * dsock, unsigned short port) addr.sin_addr.s_addr = INADDR_ANY; memset(&(addr.sin_zero), '\0', 8); /* zero the rest of the struct */ - if (bind(sock.sock, (struct sockaddr *) &addr, sizeof(struct sockaddr)) == - -1) + if (bind(sock.sock, (struct sockaddr *) &addr, sizeof(struct sockaddr)) == -1) { log_error2("Cannot bind socket (%s)", strerror(errno)); return herror_new("hsocket_bind", HSOCKET_ERROR_BIND, "Socket error (%s)", @@ -247,16 +226,15 @@ hsocket_bind(hsocket_t * dsock, unsigned short port) #ifdef WIN32 static herror_t -_hsocket_sys_accept(hsocket_t * sock, hsocket_t * dest) +_hsocket_sys_accept(struct hsocket_t * sock, struct hsocket_t * dest) { int asize; - hsocket_t sockfd; + struct hsocket_t sockfd; asize = sizeof(struct sockaddr_in); while (1) { - sockfd.sock = - accept(sock->sock, (struct sockaddr *) &(dest->addr), &asize); + sockfd.sock = accept(sock->sock, (struct sockaddr *) &(dest->addr), &asize); if (sockfd.sock == INVALID_SOCKET) { if (WSAGetLastError() != WSAEWOULDBLOCK) @@ -275,14 +253,13 @@ _hsocket_sys_accept(hsocket_t * sock, hsocket_t * dest) } #else static herror_t -_hsocket_sys_accept(hsocket_t * sock, hsocket_t * dest) +_hsocket_sys_accept(struct hsocket_t * sock, struct hsocket_t * dest) { socklen_t len; len = sizeof(struct sockaddr_in); - if ((dest->sock = - accept(sock->sock, (struct sockaddr *) &(dest->addr), &len)) == -1) + if ((dest->sock = accept(sock->sock, (struct sockaddr *) &(dest->addr), &len)) == -1) { log_warn2("accept failed (%s)", strerror(errno)); return herror_new("hsocket_accept", HSOCKET_ERROR_ACCEPT, @@ -294,11 +271,8 @@ _hsocket_sys_accept(hsocket_t * sock, hsocket_t * dest) } #endif -/*---------------------------------------------------------- -FUNCTION: hsocket_accept -----------------------------------------------------------*/ herror_t -hsocket_accept(hsocket_t * sock, hsocket_t * dest) +hsocket_accept(struct hsocket_t * sock, struct hsocket_t * dest) { herror_t status; @@ -322,11 +296,8 @@ hsocket_accept(hsocket_t * sock, hsocket_t * dest) return H_OK; } -/*-------------------------------------------------- -FUNCTION: hsocket_listen -----------------------------------------------------*/ herror_t -hsocket_listen(hsocket_t * sock) +hsocket_listen(struct hsocket_t * sock) { if (sock->sock < 0) return herror_new("hsocket_listen", HSOCKET_ERROR_NOT_INITIALIZED, @@ -344,7 +315,7 @@ hsocket_listen(hsocket_t * sock) #ifdef WIN32 static void -_hsocket_sys_close(hsocket_t * sock) +_hsocket_sys_close(struct hsocket_t * sock) { char junk[10]; @@ -359,7 +330,7 @@ _hsocket_sys_close(hsocket_t * sock) } #else static inline void -_hsocket_sys_close(hsocket_t * sock) +_hsocket_sys_close(struct hsocket_t * sock) { shutdown(sock->sock, SHUT_RDWR); @@ -370,11 +341,8 @@ _hsocket_sys_close(hsocket_t * sock) } #endif -/*-------------------------------------------------- -FUNCTION: hsocket_close -----------------------------------------------------*/ void -hsocket_close(hsocket_t * sock) +hsocket_close(struct hsocket_t * sock) { log_verbose3("closing socket %p (%d)...", sock, sock->sock); @@ -390,11 +358,8 @@ hsocket_close(hsocket_t * sock) return; } -/*-------------------------------------------------- -FUNCTION: hsocket_send -----------------------------------------------------*/ herror_t -hsocket_nsend(hsocket_t * sock, const unsigned char * bytes, int n) +hsocket_nsend(struct hsocket_t * sock, const unsigned char * bytes, int n) { herror_t status; size_t total = 0; @@ -409,7 +374,6 @@ hsocket_nsend(hsocket_t * sock, const unsigned char * bytes, int n) while (1) { - if ((status = hssl_write(sock, bytes + total, n, &size)) != H_OK) { log_warn2("hssl_write failed (%s)", herror_message(status)); @@ -425,11 +389,8 @@ hsocket_nsend(hsocket_t * sock, const unsigned char * bytes, int n) return H_OK; } -/*-------------------------------------------------- -FUNCTION: hsocket_send -----------------------------------------------------*/ herror_t -hsocket_send(hsocket_t * sock, const char *str) +hsocket_send(struct hsocket_t * sock, const char *str) { return hsocket_nsend(sock, str, strlen(str)); } @@ -457,8 +418,7 @@ hsocket_select_recv(int sock, char *buf, size_t len) } herror_t -hsocket_read(hsocket_t * sock, unsigned char * buffer, int total, int force, - int *received) +hsocket_read(struct hsocket_t * sock, unsigned char * buffer, int total, int force, int *received) { herror_t status; size_t totalRead; @@ -470,9 +430,7 @@ hsocket_read(hsocket_t * sock, unsigned char * buffer, int total, int force, do { - if ((status = - hssl_read(sock, &buffer[totalRead], (size_t) total - totalRead, - &count)) != H_OK) + if ((status = hssl_read(sock, &buffer[totalRead], (size_t) total - totalRead, &count)) != H_OK) { log_warn2("hssl_read failed (%s)", herror_message(status)); return status; diff --git a/nanohttp/nanohttp-socket.h b/nanohttp/nanohttp-socket.h index 9bb88b5..a9e4ef6 100644 --- a/nanohttp/nanohttp-socket.h +++ b/nanohttp/nanohttp-socket.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-socket.h,v 1.30 2006/11/19 09:40:14 m0gg Exp $ + * $Id: nanohttp-socket.h,v 1.31 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -29,7 +29,7 @@ /* Socket definition */ -typedef struct hsocket_t +struct hsocket_t { #ifdef WIN32 SOCKET sock; @@ -40,8 +40,7 @@ typedef struct hsocket_t size_t bytes_transmitted; size_t bytes_received; void *ssl; -} -hsocket_t; /* end of socket definition */ +}; #ifdef __cplusplus extern "C" @@ -49,157 +48,166 @@ extern "C" #endif /** - Initializes the socket modul. This should be called only - once for an application. - - @returns This function should always return H_OK. + * + * Initializes the socket modul. This should be called only once for an + * application. + * + * @returns This function should always return H_OK. + * */ - herror_t hsocket_module_init(int argc, char **argv); +extern herror_t hsocket_module_init(int argc, char **argv); /** - Destroys the socket modul. This should be called after - finishing an application. -*/ - void hsocket_module_destroy(void); - + * + * Destroys the socket modul. This should be called after finishing an + * application. + * + */ +extern void hsocket_module_destroy(void); /** - Initializes a given socket object. This function (or - hsokcet_init_ssl) should - be called for every socket before using it. - - @param sock the destination socket to initialize. - - @see hsocket_init_ssl - @returns This function should always return H_OK. + * + * Initializes a given socket object. This function (or hsokcet_init_ssl) should + * be called for every socket before using it. + * + * @param sock the destination socket to initialize. + * + * @returns This function should always return H_OK. + * + * @see hsocket_init_ssl + * */ - herror_t hsocket_init(hsocket_t * sock); +extern herror_t hsocket_init(struct hsocket_t * sock); /** - Destroys and releases a given socket. - - @param sock the socket to destroy -*/ - void hsocket_free(hsocket_t * sock); - + * + * Destroys and releases a given socket. + * + * @param sock the socket to destroy + * + */ +extern void hsocket_free(struct hsocket_t * sock); /** - Connects to a given host. The hostname can be an IP number - or a humen readable hostname. - - @param sock the destonation socket object to use - @param host hostname - @param port port number to connect to - @param ssl whether to open a SSL connection - - @returns H_OK if success. One of the followings if fails:<P> - <BR>HSOCKET_ERROR_CREATE - <BR>HSOCKET_ERROR_GET_HOSTNAME - <BR>HSOCKET_ERROR_CONNECT + * + * Connects to a given host. The hostname can be an IP number or a humen + * readable hostname. + * + * @param sock the destonation socket object to use + * @param host hostname + * @param port port number to connect to + * @param ssl whether to open a SSL connection + * + * @returns H_OK if success. One of the followings if fails:<P> + * - HSOCKET_ERROR_CREATE + * - HSOCKET_ERROR_GET_HOSTNAME + * - HSOCKET_ERROR_CONNECT + * */ - herror_t hsocket_open(hsocket_t * sock, const char *host, int port, - int ssl); - +extern herror_t hsocket_open(struct hsocket_t *sock, const char *host, int port, int ssl); /** - Close a socket connection. - - @param sock the socket to close -*/ - void hsocket_close(hsocket_t * sock); + * + * Close a socket connection. + * + * @param sock the socket to close + * + */ +extern void hsocket_close(struct hsocket_t *sock); /** - Binds a socket to a given port number. After bind you - can call hsocket_listen() to listen to the port. - - @param sock socket to use. - @param port port number to bind to - - @returns H_OK if success. One of the followings if fails:<P> - <BR>HSOCKET_ERROR_CREATE - <BR>HSOCKET_ERROR_BIND - - @see hsocket_listen + * + * Binds a socket to a given port number. After bind you can call + * hsocket_listen() to listen to the port. + * + * @param sock socket to use. + * @param port port number to bind to + * + * @returns H_OK if success. One of the followings if fails:<P> + * - HSOCKET_ERROR_CREATE + * - HSOCKET_ERROR_BIND + * + * @see hsocket_listen + * */ - herror_t hsocket_bind(hsocket_t * sock, unsigned short port); - +extern herror_t hsocket_bind(struct hsocket_t *sock, unsigned short port); /** - Set the socket to the listen mode. You must bind - the socket to a port with hsocket_bind() before - you can listen to the port. - - @param sock the socket to use - - @returns H_OK if success. One of the followings if fails:<P> - <BR>HSOCKET_ERROR_NOT_INITIALIZED - <BR>HSOCKET_ERROR_LISTEN -*/ - herror_t hsocket_listen(hsocket_t * sock); - + * + * Set the socket to the listen mode. You must bind the socket to a port with + * hsocket_bind() before you can listen to the port. + * + * @param sock the socket to use + * + * @returns H_OK if success. One of the followings if fails:<P> + * - HSOCKET_ERROR_NOT_INITIALIZED + * - HSOCKET_ERROR_LISTEN + */ +extern herror_t hsocket_listen(struct hsocket_t *sock); /** - Accepts an incoming socket request. Note that this function - will not return until a socket connection is ready. - - @param sock the socket which listents to a port - @param dest the destination socket which will be created - - @returns H_OK if success. One of the followings if fails:<P> - <BR>HSOCKET_ERROR_NOT_INITIALIZED - <BR>HSOCKET_ERROR_ACCEPT -*/ - herror_t hsocket_accept(hsocket_t *sock, hsocket_t *dest); - + * + * Accepts an incoming socket request. Note that this function + * will not return until a socket connection is ready. + * + * @param sock the socket which listents to a port + * @param dest the destination socket which will be created + * + * @returns H_OK if success. One of the followings if fails:<P> + * - HSOCKET_ERROR_NOT_INITIALIZED + * - HSOCKET_ERROR_ACCEPT + */ +extern herror_t hsocket_accept(struct hsocket_t *sock, struct hsocket_t *dest); /** - Sends data throught the socket. - - @param sock the socket to use to send the data - @param bytes bytes to send - @param size size of memory to sent pointed by bytes. - - @returns H_OK if success. One of the followings if fails:<P> - <BR>HSOCKET_ERROR_NOT_INITIALIZED - <BR>HSOCKET_ERROR_SEND -*/ - herror_t hsocket_nsend(hsocket_t * sock, const unsigned char *bytes, int size); + * + * Sends data throught the socket. + * + * @param sock the socket to use to send the data + * @param bytes bytes to send + * @param size size of memory to sent pointed by bytes. + * + * @returns H_OK if success. One of the followings if fails:<P> + * - HSOCKET_ERROR_NOT_INITIALIZED + * - HSOCKET_ERROR_SEND + */ +extern herror_t hsocket_nsend(struct hsocket_t *sock, const unsigned char *bytes, int size); /** - Sends a string throught the socket - - @param sock the socket to use to send the data - @param str the null terminated string to sent - - @returns H_OK if success. One of the followings if fails:<P> - <BR>HSOCKET_ERROR_NOT_INITIALIZED - <BR>HSOCKET_ERROR_SEND -*/ - herror_t hsocket_send(hsocket_t * sock, const char *str); + * + * Sends a string throught the socket + * + * @param sock the socket to use to send the data + * @param str the null terminated string to sent + * + * @returns H_OK if success. One of the followings if fails:<P> + * - HSOCKET_ERROR_NOT_INITIALIZED + * - HSOCKET_ERROR_SEND + * + */ +extern herror_t hsocket_send(struct hsocket_t *sock, const char *str); +extern int hsocket_select_read(int sock, char *buf, size_t len); - int hsocket_select_read(int sock, char *buf, size_t len); /** - Reads data from the socket. - - @param sock the socket to read data from - @param buffer the buffer to use to save the readed bytes - @param size the maximum size of bytes to read - @param force if force is 1 then hsocket_read() will wait until - maximum size of bytes (size parameter) was readed. Otherwise - this function will not wait and will return with the bytes - quequed on the socket. - - @returns This function will return -1 if an read error was occured. - Otherwise the return value is the size of bytes readed from - the socket. - -*/ - herror_t hsocket_read(hsocket_t * sock, unsigned char *buffer, int size, - int force, int *readed); + * + * Reads data from the socket. + * + * @param sock the socket to read data from + * @param buffer the buffer to use to save the readed bytes + * @param size the maximum size of bytes to read + * @param force if force is 1 then hsocket_read() will wait until maximum size + * of bytes (size parameter) was readed. Otherwise this function will not + * wait and will return with the bytes quequed on the socket. + * + * @returns This function will return -1 if an read error was occured. Otherwise + * the return value is the size of bytes readed from the socket. + * + */ +extern herror_t hsocket_read(struct hsocket_t * sock, unsigned char *buffer, int size, int force, int *readed); #ifdef __cplusplus } diff --git a/nanohttp/nanohttp-ssl.c b/nanohttp/nanohttp-ssl.c index d8e6e3f..8dbc948 100644 --- a/nanohttp/nanohttp-ssl.c +++ b/nanohttp/nanohttp-ssl.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-ssl.c,v 1.29 2006/11/19 09:40:14 m0gg Exp $ +* $Id: nanohttp-ssl.c,v 1.30 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2001-2005 Rochester Institute of Technology @@ -71,9 +71,10 @@ #endif #endif -#include "nanohttp-logging.h" #include "nanohttp-common.h" #include "nanohttp-socket.h" +#include "nanohttp-logging.h" + #include "nanohttp-ssl.h" #ifdef HAVE_SSL @@ -85,9 +86,42 @@ static SSL_CTX *context = NULL; static int enabled = 0; -static int _hssl_dummy_verify_cert(X509 * cert); +static int +_hssl_dummy_verify_cert(X509 * cert) +{ + /* TODO: Make sure that the client is providing a client cert, or that the + Module is providing the Module cert */ + + /* connect to anyone */ + + log_verbose1("Validating certificate."); + return 1; +} + int (*_hssl_verify_cert) (X509 * cert) = _hssl_dummy_verify_cert; +static int +_hssl_cert_verify_callback(int prev_ok, X509_STORE_CTX * ctx) +{ +/* + if ((X509_STORE_CTX_get_error(ctx) = X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN)) + { + log_verbose1("Self signed cert in chain"); + return 1; + } +*/ + log_verbose2("Cert depth = %d", X509_STORE_CTX_get_error_depth(ctx)); + if (X509_STORE_CTX_get_error_depth(ctx) == 0) + { + return _hssl_verify_cert(X509_STORE_CTX_get_current_cert(ctx)); + } + else + { + log_verbose1("Cert ok (prev)"); + return prev_ok; + } +} + static void _hssl_superseed(void) { @@ -104,7 +138,6 @@ _hssl_superseed(void) return; } - static char * _hssl_get_error(SSL * ssl, int ret) { @@ -133,7 +166,6 @@ _hssl_get_error(SSL * ssl, int ret) } } - static int _hssl_password_callback(char *buf, int num, int rwflag, void *userdata) { @@ -145,10 +177,10 @@ _hssl_password_callback(char *buf, int num, int rwflag, void *userdata) return 0; strcpy(buf, certpass); + return ret; } - int verify_sn(X509 * cert, int who, int nid, char *str) { @@ -179,70 +211,45 @@ void hssl_set_hssl_verify_cert(int func(X509 * cert)) { _hssl_verify_cert = func; -} - -static int -_hssl_dummy_verify_cert(X509 * cert) -{ - /* TODO: Make sure that the client is providing a client cert, or that the - Module is providing the Module cert */ - - /* connect to anyone */ - - log_verbose1("Validating certificate."); - return 1; -} -static int -_hssl_cert_verify_callback(int prev_ok, X509_STORE_CTX * ctx) -{ -/* - if ((X509_STORE_CTX_get_error(ctx) = X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN)) - { - log_verbose1("Self signed cert in chain"); - return 1; - } -*/ - log_verbose2("Cert depth = %d", X509_STORE_CTX_get_error_depth(ctx)); - if (X509_STORE_CTX_get_error_depth(ctx) == 0) - { - return _hssl_verify_cert(X509_STORE_CTX_get_current_cert(ctx)); - } - else - { - log_verbose1("Cert ok (prev)"); - return prev_ok; - } + return; } void hssl_set_certificate(char *c) { certificate = c; + + return; } void hssl_set_certpass(char *c) { certpass = c; + + return; } void hssl_set_ca(char *c) { ca_list = c; + + return; } void hssl_enable(void) { enabled = 1; + + return; } static void _hssl_parse_arguments(int argc, char **argv) { - int i; for (i = 1; i < argc; i++) @@ -259,7 +266,7 @@ _hssl_parse_arguments(int argc, char **argv) { ca_list = argv[i]; } - else if (!strcmp(argv[i - 1], NHTTP_ARG_HTTPS)) + else if (!strcmp(argv[i - 1], NHTTPD_ARG_HTTPS)) { enabled = 1; } @@ -268,7 +275,6 @@ _hssl_parse_arguments(int argc, char **argv) return; } - static void _hssl_library_init(void) { @@ -291,7 +297,6 @@ _hssl_library_init(void) return; } - static herror_t _hssl_server_context_init(void) { @@ -352,7 +357,6 @@ _hssl_server_context_init(void) return H_OK; } - static void _hssl_server_context_destroy(void) { @@ -364,7 +368,6 @@ _hssl_server_context_destroy(void) return; } - herror_t hssl_module_init(int argc, char **argv) { @@ -383,7 +386,6 @@ hssl_module_init(int argc, char **argv) return _hssl_server_context_init(); } - void hssl_module_destroy(void) { @@ -392,16 +394,14 @@ hssl_module_destroy(void) return; } - int hssl_enabled(void) { return enabled; } - herror_t -hssl_client_ssl(hsocket_t * sock) +hssl_client_ssl(struct hsocket_t * sock) { SSL *ssl; int ret; @@ -452,7 +452,7 @@ _hssl_bio_read(BIO * b, char *out, int outl) } herror_t -hssl_server_ssl(hsocket_t * sock) +hssl_server_ssl(struct hsocket_t *sock) { SSL *ssl; int ret; @@ -502,9 +502,8 @@ hssl_server_ssl(hsocket_t * sock) return H_OK; } - void -hssl_cleanup(hsocket_t * sock) +hssl_cleanup(struct hsocket_t * sock) { if (sock->ssl) { @@ -517,7 +516,7 @@ hssl_cleanup(hsocket_t * sock) } herror_t -hssl_read(hsocket_t * sock, char *buf, size_t len, size_t * received) +hssl_read(struct hsocket_t * sock, char *buf, size_t len, size_t * received) { int count; @@ -544,7 +543,7 @@ hssl_read(hsocket_t * sock, char *buf, size_t len, size_t * received) herror_t -hssl_write(hsocket_t * sock, const char *buf, size_t len, size_t * sent) +hssl_write(struct hsocket_t * sock, const char *buf, size_t len, size_t * sent) { int count; @@ -572,7 +571,7 @@ hssl_write(hsocket_t * sock, const char *buf, size_t len, size_t * sent) #else herror_t -hssl_read(hsocket_t * sock, char *buf, size_t len, size_t * received) +hssl_read(struct hsocket_t * sock, char *buf, size_t len, size_t * received) { int count; @@ -587,7 +586,7 @@ hssl_read(hsocket_t * sock, char *buf, size_t len, size_t * received) herror_t -hssl_write(hsocket_t * sock, const char *buf, size_t len, size_t * sent) +hssl_write(struct hsocket_t * sock, const char *buf, size_t len, size_t * sent) { int count; diff --git a/nanohttp/nanohttp-ssl.h b/nanohttp/nanohttp-ssl.h index e81668d..f796356 100644 --- a/nanohttp/nanohttp-ssl.h +++ b/nanohttp/nanohttp-ssl.h @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-ssl.h,v 1.19 2006/11/19 09:40:14 m0gg Exp $ +* $Id: nanohttp-ssl.h,v 1.20 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2001-2005 Rochester Institute of Technology @@ -34,6 +34,13 @@ #include <openssl/ssl.h> #endif +/** + * + * Commandline argument to enabled SSL in the nanoHTTP server. + * + */ +#define NHTTPD_ARG_HTTPS "-NHTTPS" + #ifdef __cplusplus extern "C" { @@ -44,26 +51,26 @@ extern "C" * Initialization and shutdown of the SSL module * */ - herror_t hssl_module_init(int argc, char **argv); - void hssl_module_destroy(void); +extern herror_t hssl_module_init(int argc, char **argv); +extern void hssl_module_destroy(void); - void hssl_set_certificate(char *c); - void hssl_set_certpass(char *c); - void hssl_set_ca(char *c); +extern void hssl_set_certificate(char *c); +extern void hssl_set_certpass(char *c); +extern void hssl_set_ca(char *c); - void hssl_enable(void); +extern void hssl_enable(void); - int hssl_enabled(void); +extern int hssl_enabled(void); /** * * Socket initialization and shutdown * */ - herror_t hssl_client_ssl(hsocket_t * sock); - herror_t hssl_server_ssl(hsocket_t * sock); +extern herror_t hssl_client_ssl(struct hsocket_t * sock); +extern herror_t hssl_server_ssl(struct hsocket_t * sock); - void hssl_cleanup(hsocket_t * sock); +extern void hssl_cleanup(struct hsocket_t * sock); /* * Callback for password checker @@ -77,7 +84,7 @@ extern "C" */ #define CERT_SUBJECT 1 - int verify_sn(X509 * cert, int who, int nid, char *str); +extern int verify_sn(X509 * cert, int who, int nid, char *str); /* * Called by framework for verify @@ -85,7 +92,7 @@ extern "C" /* static int verify_cb(int prev_ok, X509_STORE_CTX* ctx); */ - void hssl_set_user_verify(int func(X509 * cert)); +extern void hssl_set_user_verify(int func(X509 * cert)); #ifdef __cplusplus } @@ -98,6 +105,7 @@ hssl_module_init(int argc, char **argv) { return H_OK; } + static inline void hssl_module_destroy(void) { @@ -111,19 +119,19 @@ hssl_enabled(void) } static inline herror_t -hssl_client_ssl(hsocket_t * sock) +hssl_client_ssl(struct hsocket_t *sock) { return H_OK; } static inline herror_t -hssl_server_ssl(hsocket_t * sock) +hssl_server_ssl(struct hsocket_t *sock) { return H_OK; } static inline void -hssl_cleanup(hsocket_t * sock) +hssl_cleanup(struct hsocket_t *sock) { return; } @@ -135,10 +143,8 @@ extern "C" { #endif - herror_t hssl_read(hsocket_t * sock, char *buf, size_t len, - size_t * received); - herror_t hssl_write(hsocket_t * sock, const char *buf, size_t len, - size_t * sent); +extern herror_t hssl_read(struct hsocket_t * sock, char *buf, size_t len, size_t * received); +extern herror_t hssl_write(struct hsocket_t * sock, const char *buf, size_t len, size_t * sent); #ifdef __cplusplus } diff --git a/nanohttp/nanohttp-stream.c b/nanohttp/nanohttp-stream.c index 27d8d62..09d06b2 100755 --- a/nanohttp/nanohttp-stream.c +++ b/nanohttp/nanohttp-stream.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-stream.c,v 1.14 2006/11/19 09:40:14 m0gg Exp $ +* $Id: nanohttp-stream.c,v 1.15 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -79,16 +79,16 @@ _http_stream_is_chunked(hpair_t * header) /** Creates a new input stream. */ -http_input_stream_t * -http_input_stream_new(hsocket_t *sock, hpair_t * header) +struct http_input_stream_t * +http_input_stream_new(struct hsocket_t *sock, hpair_t * header) { - http_input_stream_t *result; + struct http_input_stream_t *result; char *content_length; /* Paranoya check */ /* if (header == NULL) return NULL; */ /* Create object */ - if (!(result = (http_input_stream_t *) malloc(sizeof(http_input_stream_t)))) + if (!(result = (struct http_input_stream_t *) malloc(sizeof(struct http_input_stream_t)))) { log_error2("malloc failed (%s)", strerror(errno)); return NULL; @@ -132,10 +132,10 @@ http_input_stream_new(hsocket_t *sock, hpair_t * header) This function was added for MIME messages and for debugging. */ -http_input_stream_t * +struct http_input_stream_t * http_input_stream_new_from_file(const char *filename) { - http_input_stream_t *result; + struct http_input_stream_t *result; FILE *fd; if (!(fd = fopen(filename, "rb"))) { @@ -145,7 +145,7 @@ http_input_stream_new_from_file(const char *filename) } /* Create object */ - if (!(result = (http_input_stream_t *) malloc(sizeof(http_input_stream_t)))) + if (!(result = (struct http_input_stream_t *) malloc(sizeof(struct http_input_stream_t)))) { log_error2("malloc failed (%s)", strerror(errno)); fclose(fd); @@ -164,7 +164,7 @@ http_input_stream_new_from_file(const char *filename) Free input stream */ void -http_input_stream_free(http_input_stream_t * stream) +http_input_stream_free(struct http_input_stream_t * stream) { if (stream->type == HTTP_TRANSFER_FILE && stream->fd) { @@ -178,31 +178,31 @@ http_input_stream_free(http_input_stream_t * stream) } static int -_http_input_stream_is_content_length_ready(http_input_stream_t * stream) +_http_input_stream_is_content_length_ready(struct http_input_stream_t * stream) { return (stream->content_length > stream->received); } static int -_http_input_stream_is_chunked_ready(http_input_stream_t * stream) +_http_input_stream_is_chunked_ready(struct http_input_stream_t * stream) { return stream->chunk_size != 0; } static int -_http_input_stream_is_connection_closed_ready(http_input_stream_t * stream) +_http_input_stream_is_connection_closed_ready(struct http_input_stream_t * stream) { return !stream->connection_closed; } static int -_http_input_stream_is_file_ready(http_input_stream_t * stream) +_http_input_stream_is_file_ready(struct http_input_stream_t * stream) { return !feof(stream->fd); } static int -_http_input_stream_content_length_read(http_input_stream_t * stream, unsigned char *dest, int size) +_http_input_stream_content_length_read(struct http_input_stream_t * stream, unsigned char *dest, int size) { herror_t status; int read; @@ -223,7 +223,7 @@ _http_input_stream_content_length_read(http_input_stream_t * stream, unsigned ch } static int -_http_input_stream_chunked_read_chunk_size(http_input_stream_t * stream) +_http_input_stream_chunked_read_chunk_size(struct http_input_stream_t * stream) { char chunk[25]; int status, i = 0; @@ -282,7 +282,7 @@ _http_input_stream_chunked_read_chunk_size(http_input_stream_t * stream) } static int -_http_input_stream_chunked_read(http_input_stream_t * stream, unsigned char *dest, +_http_input_stream_chunked_read(struct http_input_stream_t * stream, unsigned char *dest, int size) { int status, counter; @@ -386,8 +386,7 @@ _http_input_stream_chunked_read(http_input_stream_t * stream, unsigned char *des static int -_http_input_stream_connection_closed_read(http_input_stream_t * stream, - unsigned char *dest, int size) +_http_input_stream_connection_closed_read(struct http_input_stream_t * stream, unsigned char *dest, int size) { int status; herror_t err; @@ -407,7 +406,7 @@ _http_input_stream_connection_closed_read(http_input_stream_t * stream, } static int -_http_input_stream_file_read(http_input_stream_t * stream, unsigned char *dest, int size) +_http_input_stream_file_read(struct http_input_stream_t * stream, unsigned char *dest, int size) { size_t len; @@ -425,7 +424,7 @@ _http_input_stream_file_read(http_input_stream_t * stream, unsigned char *dest, Returns the actual status of the stream. */ int -http_input_stream_is_ready(http_input_stream_t * stream) +http_input_stream_is_ready(struct http_input_stream_t * stream) { /* paranoia check */ if (stream == NULL) @@ -455,7 +454,7 @@ http_input_stream_is_ready(http_input_stream_t * stream) <0 on error */ int -http_input_stream_read(http_input_stream_t * stream, unsigned char *dest, int size) +http_input_stream_read(struct http_input_stream_t * stream, unsigned char *dest, int size) { int len = 0; /* paranoia check */ @@ -505,10 +504,10 @@ HTTP OUTPUT STREAM /** Creates a new output stream. Transfer code will be found from header. */ -http_output_stream_t * -http_output_stream_new(hsocket_t *sock, hpair_t * header) +struct http_output_stream_t * +http_output_stream_new(struct hsocket_t *sock, hpair_t * header) { - http_output_stream_t *result; + struct http_output_stream_t *result; char *content_length; /* Paranoya check */ @@ -516,7 +515,7 @@ http_output_stream_new(hsocket_t *sock, hpair_t * header) return NULL; */ /* Create object */ - if (!(result = (http_output_stream_t *) malloc(sizeof(http_output_stream_t)))) + if (!(result = (struct http_output_stream_t *) malloc(sizeof(struct http_output_stream_t)))) { log_error2("malloc failed (%s)", strerror(errno)); return NULL; @@ -555,7 +554,7 @@ http_output_stream_new(hsocket_t *sock, hpair_t * header) Free output stream */ void -http_output_stream_free(http_output_stream_t * stream) +http_output_stream_free(struct http_output_stream_t * stream) { free(stream); @@ -567,7 +566,7 @@ http_output_stream_free(http_output_stream_t * stream) Returns socket error flags or H_OK. */ herror_t -http_output_stream_write(http_output_stream_t * stream, +http_output_stream_write(struct http_output_stream_t * stream, const unsigned char *bytes, int size) { herror_t status; @@ -600,7 +599,7 @@ http_output_stream_write(http_output_stream_t * stream, Returns socket error flags or H_OK. */ herror_t -http_output_stream_write_string(http_output_stream_t * stream, +http_output_stream_write_string(struct http_output_stream_t * stream, const char *str) { return http_output_stream_write(stream, str, strlen(str)); @@ -608,7 +607,7 @@ http_output_stream_write_string(http_output_stream_t * stream, herror_t -http_output_stream_flush(http_output_stream_t * stream) +http_output_stream_flush(struct http_output_stream_t * stream) { herror_t status; diff --git a/nanohttp/nanohttp-stream.h b/nanohttp/nanohttp-stream.h index 88e783e..cb37deb 100755 --- a/nanohttp/nanohttp-stream.h +++ b/nanohttp/nanohttp-stream.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-stream.h,v 1.11 2006/11/19 09:40:14 m0gg Exp $ + * $Id: nanohttp-stream.h,v 1.12 2006/11/23 15:27:33 m0gg Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003-2004 Ferhat Ayaz @@ -24,35 +24,38 @@ #ifndef __nanohttp_stream_h #define __nanohttp_stream_h -/* - HTTP Stream modul: - - nanohttp supports 2 different streams: - - 1. http_input_stream_t - 2. http_output_stream_t - - These are not regular streams. They will care about - transfer styles while sending/receiving data. - - Supported transfer styles are - - o Content-length - o Chunked encoding - o Connection: "close" - - A stream will set its transfer style from the header - information, which must be given while creating a stream. - - A stream will start sending/receiving data "after" - sending/receiving header information. (After <CF><CF>)" - -*/ +/** + * + * HTTP Stream modul: + * + * nanohttp supports 2 different streams: + * + * 1. http_input_stream_t + * 2. http_output_stream_t + * + * These are not regular streams. They will care about transfer styles while + * sending/receiving data. + * + * Supported transfer styles are + * + * - Content-length + * - Chunked encoding + * - Connection: "close" + * + * A stream will set its transfer style from the header information, which must + * be given while creating a stream. + * + * A stream will start sending/receiving data "after" sending/receiving header + * information. (After <CF><CF>)" + * + */ /** - Transfer types supported while - sending/receiving data. -*/ + * + * Transfer types supported while + * sending/receiving data. + * + */ typedef enum http_transfer_type { /** The stream cares about Content-length */ @@ -61,23 +64,23 @@ typedef enum http_transfer_type /** The stream sends/receives chunked data */ HTTP_TRANSFER_CHUNKED, - /** The stream sends/receives data until - connection is closed */ + /** The stream sends/receives data until connection is closed */ HTTP_TRANSFER_CONNECTION_CLOSE, - /** This transfer style will be used by MIME support - and for debug purposes.*/ + /** This transfer style will be used by MIME support and for debug purposes.*/ HTTP_TRANSFER_FILE } http_transfer_type_t; /** - HTTP INPUT STREAM. Receives data from a socket/file - and cares about the transfer style. -*/ -typedef struct http_input_stream + * + * HTTP INPUT STREAM. Receives data from a socket/file + * and cares about the transfer style. + * + */ +struct http_input_stream_t { - hsocket_t *sock; + struct hsocket_t *sock; herror_t err; http_transfer_type_t type; int received; @@ -89,180 +92,175 @@ typedef struct http_input_stream FILE *fd; char filename[255]; int deleteOnExit; /* default is 0 */ -} http_input_stream_t; - +}; /** - HTTP OUTPUT STREAM. Sends data to a socket - and cares about the transfer style. -*/ -typedef struct http_output_stream + * + * HTTP OUTPUT STREAM. Sends data to a socket + * and cares about the transfer style. + * + */ +struct http_output_stream_t { - hsocket_t *sock; + struct hsocket_t *sock; http_transfer_type_t type; int content_length; int sent; -} http_output_stream_t; +}; #ifdef __cplusplus extern "C" { #endif -/* --------------------------------------------------------------- - HTTP INPUT STREAM --------------------------------------------------------------- -*/ - /** - Creates a new input stream. The transfer style will be - choosen from the given header. - - @param sock the socket to receive data from - @param header the http header. This must be received before - creating a http_input_stream_t. - - @returns a newly created http_input_stream_t object. If no - transfer style was found in the header, - HTTP_TRANSFER_CONNECTION_CLOSE will be used as default. - - @see http_input_stream_free -*/ -http_input_stream_t *http_input_stream_new(hsocket_t *sock, hpair_t *header); - + * + * Creates a new input stream. The transfer style will be + * choosen from the given header. + * + * @param sock the socket to receive data from + * @param header the http header. This must be received before + * creating a http_input_stream_t. + * + * @returns a newly created http_input_stream_t object. If no transfer style was + * found in the header, HTTP_TRANSFER_CONNECTION_CLOSE will be used as + * default. + * + * @see http_input_stream_free + * + */ +extern struct http_input_stream_t *http_input_stream_new(struct hsocket_t *sock, hpair_t *header); /** - Creates a new input stream from file. - This function was added for MIME messages - and for debugging. The transfer style is always - HTTP_TRANSFER_FILE. - - @param filename the name of the file to open and read. - - @returns The return value is a http_input_stream_t object - if the file exists and could be opened. NULL otherwise. - - @see http_input_stream_free -*/ -http_input_stream_t *http_input_stream_new_from_file(const char *filename); - + * + * Creates a new input stream from file. This function was added for MIME + * messages and for debugging. The transfer style is always HTTP_TRANSFER_FILE. + * + * @param filename the name of the file to open and read. + * + * @returns The return value is a http_input_stream_t object if the file exists + * and could be opened. NULL otherwise. + * + * @see http_input_stream_free + * + */ +extern struct http_input_stream_t *http_input_stream_new_from_file(const char *filename); /** - Free input stream. Note that the socket will not be closed - by this functions. - - @param stream the input stream to free. -*/ -void http_input_stream_free(http_input_stream_t * stream); - + * + * Free input stream. Note that the socket will not be closed by this functions. + * + * @param stream the input stream to free. + * + */ +extern void http_input_stream_free(struct http_input_stream_t * stream); /** - Returns the actual status of the stream. - - @param stream the stream to check its status - @returns <br>1 if there are still data to read. - <br>0 if no more data exists. -*/ -int http_input_stream_is_ready(http_input_stream_t * stream); - + * + * Returns the actual status of the stream. + * + * @param stream the stream to check its status + * + * @returns <br>1 if there are still data to read. + * <br>0 if no more data exists. + */ +extern int http_input_stream_is_ready(struct http_input_stream_t * stream); /** - Tries to read 'size' bytes from the stream. Check always - with http_input_stream_is_ready() if there are some data - to read. If it returns 0, no more data is available on - stream. - <P> - On error this function will return -1. In this case the - "err" field of stream will be set to the actual error. - This can be one of the followings: <P> - - <BR>STREAM_ERROR_NO_CHUNK_SIZE - <BR>STREAM_ERROR_WRONG_CHUNK_SIZE - <BR>STREAM_ERROR_INVALID_TYPE - <BR>HSOCKET_ERROR_RECEIVE - - @param stream the stream to read data from - @param dest destination memory to store readed bytes - @param size maximum size of 'dest' (size to read) - - @returns the actual readed bytes or -1 on error. -*/ -int http_input_stream_read(http_input_stream_t * stream, - unsigned char* dest, int size); - - -/* --------------------------------------------------------------- - HTTP OUTPUT STREAM --------------------------------------------------------------- -*/ + * + * Tries to read 'size' bytes from the stream. Check always with + * http_input_stream_is_ready() if there are some data to read. If it returns 0, + * no more data is available on stream. + * + * On error this function will return -1. In this case the "err" field of stream + * will be set to the actual error. This can be one of the followings: + * + * - STREAM_ERROR_NO_CHUNK_SIZE + * - STREAM_ERROR_WRONG_CHUNK_SIZE + * - STREAM_ERROR_INVALID_TYPE + * - HSOCKET_ERROR_RECEIVE + * + * @param stream the stream to read data from + * @param dest destination memory to store readed bytes + * @param size maximum size of 'dest' (size to read) + * + * @returns the actual readed bytes or -1 on error. + * + */ +extern int http_input_stream_read(struct http_input_stream_t * stream, unsigned char *dest, int size); /** - Creates a new output stream. Transfer style will be found - from the given header. - - @param sock the socket to to send data to - @param header the header which must be sent before - - @returns a http_output_stream_t object. If no proper transfer - style was found in the header, HTTP_TRANSFER_CONNECTION_CLOSE - will be used as default. - - @see http_output_stream_free -*/ -http_output_stream_t *http_output_stream_new(hsocket_t *sock, - hpair_t * header); + * + * Creates a new output stream. Transfer style will be found from the given + * header. + * + * @param sock the socket to to send data to + * @param header the header which must be sent before + * + * @returns a http_output_stream_t object. If no proper transfer style was found + * in the header, HTTP_TRANSFER_CONNECTION_CLOSE will be used as default. + * + * @see http_output_stream_free + * + */ +extern struct http_output_stream_t *http_output_stream_new(struct hsocket_t *sock, hpair_t * header); /** - Free output stream. Note that this functions will not - close any socket connections. - - @param stream the stream to free. -*/ -void http_output_stream_free(http_output_stream_t * stream); - + * + * Free output stream. Note that this functions will not close any socket + * connections. + * + * @param stream the stream to free. + * + */ +extern void http_output_stream_free(struct http_output_stream_t * stream); /** - Writes 'size' bytes of 'bytes' into stream. - - @param stream the stream to use to send data - @param bytes bytes to send - @param size size of bytes to send - - @returns H_OK if success. One of the followings otherwise - <BR>HSOCKET_ERROR_NOT_INITIALIZED - <BR>HSOCKET_ERROR_SEND -*/ -herror_t http_output_stream_write(http_output_stream_t * stream, - const unsigned char* bytes, int size); + * + * Writes 'size' bytes of 'bytes' into stream. + * + * @param stream the stream to use to send data + * @param bytes bytes to send + * @param size size of bytes to send + * + * @returns H_OK if success. One of the followings otherwise + * + * - HSOCKET_ERROR_NOT_INITIALIZED + * - HSOCKET_ERROR_SEND + * + */ +extern herror_t http_output_stream_write(struct http_output_stream_t *stream, const unsigned char* bytes, int size); /** - Writes a null terminated string to the stream. - - @param stream the stream to use to send data - @param str a null terminated string to send - - @returns H_OK if success. One of the followings otherwise - <BR>HSOCKET_ERROR_NOT_INITIALIZED - <BR>HSOCKET_ERROR_SEND -*/ -herror_t http_output_stream_write_string(http_output_stream_t * stream, - const char *str); - + * + * Writes a null terminated string to the stream. + * + * @param stream the stream to use to send data + * @param str a null terminated string to send + * + * @returns H_OK if success. One of the followings otherwise + * + * - HSOCKET_ERROR_NOT_INITIALIZED + * - HSOCKET_ERROR_SEND + * + */ +extern herror_t http_output_stream_write_string(struct http_output_stream_t *stream, const char *str); /** - Sends finish flags if nesseccary (like in chunked transport). - Call always this function before closing the connections. - - @param stream the stream to send post data. - - @returns H_OK if success. One of the followings otherwise - <BR>HSOCKET_ERROR_NOT_INITIALIZED - <BR>HSOCKET_ERROR_SEND -*/ -herror_t http_output_stream_flush(http_output_stream_t * stream); + * + * Sends finish flags if nesseccary (like in chunked transport). + * Call always this function before closing the connections. + * + * @param stream the stream to send post data. + * + * @returns H_OK if success. One of the followings otherwise + * + * - HSOCKET_ERROR_NOT_INITIALIZED + * - HSOCKET_ERROR_SEND + * + */ +extern herror_t http_output_stream_flush(struct http_output_stream_t *stream); #ifdef __cplusplus } |