diff options
Diffstat (limited to 'libcsoap/soap-server.c')
-rw-r--r-- | libcsoap/soap-server.c | 342 |
1 files changed, 171 insertions, 171 deletions
diff --git a/libcsoap/soap-server.c b/libcsoap/soap-server.c index ac259e8..e4a5775 100644 --- a/libcsoap/soap-server.c +++ b/libcsoap/soap-server.c @@ -1,36 +1,36 @@ /****************************************************************** - * $Id: soap-server.c,v 1.2 2004/05/12 22:23:30 snowdrop Exp $ - * - * CSOAP Project: A SOAP client/server library in C - * Copyright (C) 2003 Ferhat Ayaz - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Email: ayaz@jprogrammer.net - ******************************************************************/ +* $Id: soap-server.c,v 1.3 2004/08/26 17:06:18 rans Exp $ +* +* CSOAP Project: A SOAP client/server library in C +* Copyright (C) 2003 Ferhat Ayaz +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Library General Public +* License as published by the Free Software Foundation; either +* version 2 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Library General Public License for more details. +* +* You should have received a copy of the GNU Library General Public +* License along with this library; if not, write to the +* Free Software Foundation, Inc., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Email: ayaz@jprogrammer.net +******************************************************************/ #include <libcsoap/soap-server.h> #include <nanohttp/nanohttp-server.h> - +#include <string.h> typedef struct _SoapRouterNode { - char *context; - SoapRouter *router; - struct _SoapRouterNode *next; + char *context; + SoapRouter *router; + struct _SoapRouterNode *next; }SoapRouterNode; @@ -39,8 +39,8 @@ SoapRouterNode *tail = NULL; static SoapRouterNode *router_node_new(SoapRouter *router, - const char *context, - SoapRouterNode *next); + const char *context, + SoapRouterNode *next); static SoapRouter *router_find(const char *context); @@ -51,179 +51,179 @@ static void _soap_server_send_env(hsocket_t sock, SoapEnv* env); static void _soap_server_send_fault(httpd_conn_t *conn, hpair_t *header, - const char* errmsg); + const char* errmsg); /*---------------------------------*/ int soap_server_init_args(int argc, char *argv[]) { - return !httpd_init(argc, argv); + return !httpd_init(argc, argv); } int soap_server_register_router(SoapRouter *router, const char* context) { - - if (!httpd_register(context, soap_server_entry)) { - return 0; - } - - if (tail == NULL) { - head = tail = router_node_new(router, context, NULL); - } else { - tail->next = router_node_new(router, context, NULL); - tail = tail->next; - } - - return 1; + + if (!httpd_register(context, soap_server_entry)) { + return 0; + } + + if (tail == NULL) { + head = tail = router_node_new(router, context, NULL); + } else { + tail->next = router_node_new(router, context, NULL); + tail = tail->next; + } + + return 1; } int soap_server_run() { - return httpd_run(); + return httpd_run(); } void soap_server_destroy() { - SoapRouterNode *node = head; - SoapRouterNode *tmp; - - while (node != NULL) { - tmp = node->next; - log_verbose2("soap_router_free(%p)", node->router); - soap_router_free(node->router); - free(node->context); - free(node); - node = tmp; - } + SoapRouterNode *node = head; + SoapRouterNode *tmp; + + while (node != NULL) { + tmp = node->next; + log_verbose2("soap_router_free(%p)", node->router); + soap_router_free(node->router); + free(node->context); + free(node); + node = tmp; + } } void soap_server_entry(httpd_conn_t *conn, hrequest_t *req) { - hpair_t *header; - char *postdata; - char buffer[1054]; - char urn[150]; - char method[150]; - long received; - SoapEnv *env, *envres; - SoapRouter *router; - SoapService *service; + hpair_t *header; + char *postdata; + char buffer[1054]; + char urn[150]; + char method[150]; + long received; + SoapEnv *env, *envres; + SoapRouter *router; + SoapService *service; + + if (strcmp(req->method, "POST")) { + + httpd_send_header(conn, 200, "OK", header); + hsocket_send(conn->sock, "<html><head></head><body>"); + hsocket_send(conn->sock, "<h1>Sorry! </h1><hr>"); + hsocket_send(conn->sock, "I only speak with 'POST' method"); + hsocket_send(conn->sock, "</body></html>"); + return; + } - if (strcmp(req->method, "POST")) { - - httpd_send_header(conn, 200, "OK", header); - hsocket_send(conn->sock, "<html><head></head><body>"); - hsocket_send(conn->sock, "<h1>Sorry! </h1><hr>"); - hsocket_send(conn->sock, "I only speak with 'POST' method"); - hsocket_send(conn->sock, "</body></html>"); - return; - } + postdata = httpd_get_postdata(conn, req, &received, -1); - postdata = httpd_get_postdata(conn, req, &received, -1); + header = hpairnode_new(HEADER_CONTENT_TYPE, "text/xml", NULL); - header = hpairnode_new(HEADER_CONTENT_TYPE, "text/xml", NULL); + if (postdata == NULL) { - if (postdata == NULL) { - - _soap_server_send_fault(conn, header,"Can not receive POST data!"); + _soap_server_send_fault(conn, header,"Can not receive POST data!"); - } else { + } else { - env = soap_env_new_from_buffer(postdata); + env = soap_env_new_from_buffer(postdata); - if (env == NULL) { + if (env == NULL) { - _soap_server_send_fault(conn, header,"Can not parse POST data!"); - - } else { + _soap_server_send_fault(conn, header,"Can not parse POST data!"); - /*soap_xml_doc_print(env->root->doc);*/ + } else { - router = router_find(req->path); + /*soap_xml_doc_print(env->root->doc);*/ - if ( router == NULL) { - - _soap_server_send_fault(conn, header, "Can not find router!"); - - } else { + router = router_find(req->path); - if (!soap_env_find_urn(env, urn)) { - - _soap_server_send_fault(conn, header, "No URN found!"); - return; - } else { - log_verbose2("urn: '%s'", urn); - } + if ( router == NULL) { - if (!soap_env_find_methodname(env, method)) { - - _soap_server_send_fault(conn, header, "No method found!"); - return; - }else { - log_verbose2("method: '%s'", method); - } + _soap_server_send_fault(conn, header, "Can not find router!"); - service = soap_router_find_service(router, urn, method); + } else { - if (service == NULL) { + if (!soap_env_find_urn(env, urn)) { - sprintf(buffer, "URN '%s' not found", urn); - _soap_server_send_fault(conn, header, buffer); - return; - } else { + _soap_server_send_fault(conn, header, "No URN found!"); + return; + } else { + log_verbose2("urn: '%s'", urn); + } - log_verbose2("func: %p", service->func); - envres = service->func(env); - log_verbose2("func returned: (%p)", envres); - if (envres == NULL) { + if (!soap_env_find_methodname(env, method)) { - sprintf(buffer, "Service '%s' returned no envelope", urn); - _soap_server_send_fault(conn, header, buffer); - return; + _soap_server_send_fault(conn, header, "No method found!"); + return; + }else { + log_verbose2("method: '%s'", method); + } - } else { - - httpd_send_header(conn, 200, "OK", header); - _soap_server_send_env(conn->sock, envres); - /* free envres */ - } + service = soap_router_find_service(router, urn, method); - } + if (service == NULL) { + + sprintf(buffer, "URN '%s' not found", urn); + _soap_server_send_fault(conn, header, buffer); + return; + } else { - } - } - } + log_verbose2("func: %p", service->func); + envres = service->func(env); + log_verbose2("func returned: (%p)", envres); + if (envres == NULL) { + + sprintf(buffer, "Service '%s' returned no envelope", urn); + _soap_server_send_fault(conn, header, buffer); + return; + + } else { + + httpd_send_header(conn, 200, "OK", header); + _soap_server_send_env(conn->sock, envres); + /* free envres */ + } + + } + + } + } + } } static void _soap_server_send_env(hsocket_t sock, SoapEnv* env) { - xmlBufferPtr buffer; - if (env == NULL || env->root == NULL) return; - - buffer = xmlBufferCreate(); - xmlNodeDump(buffer, env->root->doc, env->root, 1 ,1); - hsocket_send(sock, (const char*)xmlBufferContent(buffer)); - xmlBufferFree(buffer); - + xmlBufferPtr buffer; + if (env == NULL || env->root == NULL) return; + + buffer = xmlBufferCreate(); + xmlNodeDump(buffer, env->root->doc, env->root, 1 ,1); + hsocket_send(sock, (const char*)xmlBufferContent(buffer)); + xmlBufferFree(buffer); + } static void _soap_server_send_fault(httpd_conn_t *conn, hpair_t *header, - const char* errmsg) + const char* errmsg) { - SoapEnv *envres; - httpd_send_header(conn, 500, "FAILED", header); - envres = soap_env_new_with_fault(Fault_Server, - errmsg?errmsg:"General error", - "cSOAP_Server", NULL); - _soap_server_send_env(conn->sock, envres); + SoapEnv *envres; + httpd_send_header(conn, 500, "FAILED", header); + envres = soap_env_new_with_fault(Fault_Server, + errmsg?errmsg:"General error", + "cSOAP_Server", NULL); + _soap_server_send_env(conn->sock, envres); } @@ -231,39 +231,39 @@ void _soap_server_send_fault(httpd_conn_t *conn, hpair_t *header, static SoapRouterNode *router_node_new(SoapRouter *router, - const char *context, - SoapRouterNode *next) + const char *context, + SoapRouterNode *next) { - SoapRouterNode *node; - const char *noname = "/lost_find"; - - node = (SoapRouterNode*)malloc(sizeof(SoapRouterNode)); - if (context) { - node->context = (char*)malloc(strlen(context)+1); - strcpy(node->context, context); - } else { - log_warn2("context is null. Using '%s'", noname); - node->context = (char*)malloc(strlen(noname)+1); - strcpy(node->context, noname); - } - - node->router = router; - node->next = next; - - return node; + SoapRouterNode *node; + const char *noname = "/lost_find"; + + node = (SoapRouterNode*)malloc(sizeof(SoapRouterNode)); + if (context) { + node->context = (char*)malloc(strlen(context)+1); + strcpy(node->context, context); + } else { + log_warn2("context is null. Using '%s'", noname); + node->context = (char*)malloc(strlen(noname)+1); + strcpy(node->context, noname); + } + + node->router = router; + node->next = next; + + return node; } static SoapRouter *router_find(const char* context) { - SoapRouterNode *node = head; - - while (node != NULL) { - if (!strcmp(node->context, context)) - return node->router; - node = node->next; - } - - return NULL; + SoapRouterNode *node = head; + + while (node != NULL) { + if (!strcmp(node->context, context)) + return node->router; + node = node->next; + } + + return NULL; } |