diff options
Diffstat (limited to 'libcsoap')
| -rw-r--r-- | libcsoap/soap-client.c | 136 | ||||
| -rw-r--r-- | libcsoap/soap-client.h | 15 | ||||
| -rwxr-xr-x | libcsoap/soap-ctx.c | 8 | ||||
| -rwxr-xr-x | libcsoap/soap-ctx.h | 4 | ||||
| -rw-r--r-- | libcsoap/soap-env.c | 215 | ||||
| -rw-r--r-- | libcsoap/soap-env.h | 48 | ||||
| -rw-r--r-- | libcsoap/soap-server.c | 76 | ||||
| -rw-r--r-- | libcsoap/soap-server.h | 12 | ||||
| -rw-r--r-- | libcsoap/soap-service.h | 4 | 
9 files changed, 284 insertions, 234 deletions
diff --git a/libcsoap/soap-client.c b/libcsoap/soap-client.c index 5562399..2a56e11 100644 --- a/libcsoap/soap-client.c +++ b/libcsoap/soap-client.c @@ -1,5 +1,5 @@  /****************************************************************** -*  $Id: soap-client.c,v 1.9 2004/10/20 14:17:36 snowdrop Exp $ +*  $Id: soap-client.c,v 1.10 2004/10/28 10:30:46 snowdrop Exp $  *  * CSOAP Project:  A SOAP client/server library in C  * Copyright (C) 2003  Ferhat Ayaz @@ -27,7 +27,7 @@  /*--------------------------------- */
  static int _block_socket = 0; -static SoapEnv *_soap_client_build_result(hresponse_t *res); +static herror_t _soap_client_build_result(hresponse_t *res, SoapEnv **out);  /*--------------------------------- */  void soap_client_block_socket(int block)
 @@ -42,11 +42,11 @@ int soap_client_get_blockmode() -int soap_client_init_args(int argc, char *argv[]) +herror_t soap_client_init_args(int argc, char *argv[])  { -	return !httpc_init(argc, argv); +	return httpc_init(argc, argv);  } @@ -65,17 +65,15 @@ long _file_get_size(const char* filename)    return size;  } -SoapCtx* -soap_client_invoke(SoapCtx *call, const char *url, const char *soap_action) +
 +herror_t +soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const char *soap_action)  {    /* Status */ -  hstatus_t status; +  herror_t status;  	/* Result document */ -	SoapEnv* doc; - -	/* Result Context */ -	SoapCtx *ctx; +	SoapEnv* res_env;  	/* Buffer variables*/  	xmlBufferPtr buffer; @@ -118,48 +116,27 @@ soap_client_invoke(SoapCtx *call, const char *url, const char *soap_action)      if (status != H_OK) {        httpc_free(conn); -    	xmlBufferFree(buffer); -  		return soap_ctx_new( -  		        soap_env_new_with_fault(Fault_Client,  -          			"Can not begin post envelope","","")); +    	xmlBufferFree(buffer);
 +		return status;      }      status = http_output_stream_write_string(conn->out, content);      if (status != H_OK) {        httpc_free(conn);      	xmlBufferFree(buffer); -  		return soap_ctx_new( -  		        soap_env_new_with_fault(Fault_Client,    -  		         	"Can not post envelope","","")); +		return status;
      } -  /*	res = httpc_post(conn, url, (int)strlen(content), content);*/ -    res = httpc_post_end(conn); -    if (res == NULL) { +    status = httpc_post_end(conn, &res); +    if (status != H_OK) {        httpc_free(conn);      	xmlBufferFree(buffer); -  		return soap_ctx_new( -  		         soap_env_new_with_fault(Fault_Client,  -           			conn->errmsg,"","")); +		return status;
      }  	}   	else  	{ -	  /* Use content-length transport */ -    /*for (part=call->attachments->parts; part; part=part->next) { -      file_size = _file_get_size(part->filename); -      if (file_size == -1) [ -        httpc_free(conn); -      	xmlBufferFree(buffer); -    		return soap_ctx_new( -    		        soap_env_new_with_fault(Fault_Client,    -    		         	"Can not open file!","","")); -      } -       -      total_size += file_size + BOUDARY_LENGTH; -    }*/ -      /* Use chunked transport */      httpc_set_header(conn, HEADER_TRANSFER_ENCODING, TRANSFER_ENCODING_CHUNKED); @@ -168,27 +145,21 @@ soap_client_invoke(SoapCtx *call, const char *url, const char *soap_action)      if (status != H_OK) {        httpc_free(conn);      	xmlBufferFree(buffer); -  		return soap_ctx_new( -  		        soap_env_new_with_fault(Fault_Client,    -  		         	"Can not begin MIME transport","","")); +		return status;
      }      status = httpc_mime_next(conn, start_id, "text/xml", "binary");      if (status != H_OK) {        httpc_free(conn);      	xmlBufferFree(buffer); -  		return soap_ctx_new( -  		        soap_env_new_with_fault(Fault_Client,    -  		         	"MIME transport error","","")); +		return status;
      }      status = http_output_stream_write(conn->out, content, strlen(content));      if (status != H_OK) {        httpc_free(conn);      	xmlBufferFree(buffer); -  		return soap_ctx_new( -  		        soap_env_new_with_fault(Fault_Client,    -  		         	"MIME transport error","","")); +		return status;
      } @@ -200,20 +171,16 @@ soap_client_invoke(SoapCtx *call, const char *url, const char *soap_action)            log_error2("Send file failed. Status:%d", status);            httpc_free(conn);          	xmlBufferFree(buffer); -      		return soap_ctx_new( -      		        soap_env_new_with_fault(Fault_Client,    -      		         	"MIME transport error while sending file","","")); +			return status;
          }      } -    res = httpc_mime_end(conn); -    if (!res) +    status = httpc_mime_end(conn, &res); +    if (status != H_OK)      {        httpc_free(conn);      	xmlBufferFree(buffer); -  		return soap_ctx_new( -  		        soap_env_new_with_fault(Fault_Client,    -  		         	"MIME transport error","","")); +		return status;
      }  	} @@ -221,59 +188,54 @@ soap_client_invoke(SoapCtx *call, const char *url, const char *soap_action)  	xmlBufferFree(buffer);  	/* Build result */ -	/* TODO: If res == NULL, find out where and why it is NULL! */ -	doc = _soap_client_build_result(res);  +	status = _soap_client_build_result(res, &res_env);  +	if (status != H_OK)
 +		return status;
  	/* Create Context */ -	ctx = soap_ctx_new(doc); -	soap_ctx_add_files(ctx, res->attachments); +	*response = soap_ctx_new(res_env); +	soap_ctx_add_files(*response, res->attachments); -	return ctx; +	return H_OK;  } -static  -SoapEnv* _soap_client_build_result(hresponse_t *res) -{ -	SoapEnv *env; +static 
 +herror_t + _soap_client_build_result(hresponse_t *res, SoapEnv** env) +{
 +	herror_t err;  	log_verbose2("Building result (%p)", res);  	if (res == NULL) -		return soap_env_new_with_fault(Fault_Client,  -		"Response is NULL","",""); +		return herror_new("_soap_client_build_result", 
 +			GENERAL_INVALID_PARAM, "hresponse_t is NULL");  	if (res->in == NULL) -		return soap_env_new_with_fault(Fault_Client,  -		"Empty response from server!","",""); - +		return herror_new("_soap_client_build_result", 
 +			GENERAL_INVALID_PARAM, "Empty response from server"); -/* -	doc = xmlParseDoc(BAD_CAST res->body); -	if (doc == NULL) { -		return soap_env_new_with_fault(Fault_Client,  -			"Response is not in XML format!","",""); -	} -	env = soap_env_new_from_doc(doc); -*/ -  env = soap_env_new_from_stream(res->in); +    err = soap_env_new_from_stream(res->in, env); -	if (env == NULL) { -/*		xmlFreeDoc(doc);*/ -		return soap_env_new_with_fault(Fault_Client,  -			"Can not create envelope","",""); +	if (err != H_OK) {
 +		return err;  	} -	return env; +	return H_OK;  } -SoapCtx *soap_client_ctx_new(const char *urn, const char *method) -{ -  SoapCtx *ctx = soap_ctx_new(soap_env_new_with_method(urn, method)); +herror_t soap_client_ctx_new(const char *urn, const char *method, SoapCtx **out) +{
 +	SoapEnv *env;
 +	herror_t err;
 +	err = soap_env_new_with_method(urn, method, &env);
 +	if (err != H_OK) return err; +    *out = soap_ctx_new(env); -  return ctx; +  return H_OK;  } diff --git a/libcsoap/soap-client.h b/libcsoap/soap-client.h index 6820c14..22e41bb 100644 --- a/libcsoap/soap-client.h +++ b/libcsoap/soap-client.h @@ -1,5 +1,5 @@  /******************************************************************
 - *  $Id: soap-client.h,v 1.5 2004/10/20 14:17:36 snowdrop Exp $
 + *  $Id: soap-client.h,v 1.6 2004/10/28 10:30:46 snowdrop Exp $
   *
   * CSOAP Project:  A SOAP client/server library in C
   * Copyright (C) 2003  Ferhat Ayaz
 @@ -30,7 +30,7 @@  /**
  	Initializes the client side soap engine
  */
 -int soap_client_init_args(int argc, char *argv[]);
 +herror_t soap_client_init_args(int argc, char *argv[]);
  /**
 @@ -38,19 +38,22 @@ int soap_client_init_args(int argc, char *argv[]);     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 the result envelope. In case of failure,
 -     this function return an envelope with a fault object.
 +    @returns H_OK if success 
   */
 -SoapCtx* soap_client_invoke(SoapCtx *ctx, 
 +herror_t soap_client_invoke(SoapCtx *ctx, SoapCtx** response, 
  			    const char *url,
  			    const char *soap_action);
 -SoapCtx *soap_client_ctx_new(const char *urn, const char *method);
 +/**
 +	Creates a new soap context object.
 +*/
 +herror_t soap_client_ctx_new(const char *urn, const char *method, SoapCtx **out);
  /**
  	Sets the underlaying socket to use while connecting
 diff --git a/libcsoap/soap-ctx.c b/libcsoap/soap-ctx.c index a77bbdd..944abf0 100755 --- a/libcsoap/soap-ctx.c +++ b/libcsoap/soap-ctx.c @@ -1,5 +1,5 @@  /******************************************************************
 - *  $Id: soap-ctx.c,v 1.1 2004/10/15 13:33:48 snowdrop Exp $
 + *  $Id: soap-ctx.c,v 1.2 2004/10/28 10:30:46 snowdrop Exp $
   *
   * CSOAP Project:  A SOAP client/server library in C
   * Copyright (C) 2003-2004  Ferhat Ayaz
 @@ -49,14 +49,16 @@ void soap_ctx_add_files(SoapCtx* ctx, attachments_t *attachments)  }
 -hstatus_t soap_ctx_add_file(SoapCtx* ctx, const char* filename, const char* content_type, char *dest_href)
 +herror_t soap_ctx_add_file(SoapCtx* ctx, const char* filename, const char* content_type, char *dest_href)
  {
    char cid[250];
    char id[250];
    part_t *part;
    static int counter = 1;
    FILE *test = fopen(filename, "r");
 -  if (!test) return FILE_ERROR_OPEN;
 +  if (!test) 
 +	  return herror_new("soap_ctx_add_file", FILE_ERROR_OPEN, 
 +	  "Can not open file '%s'", filename);
    fclose(test);
 diff --git a/libcsoap/soap-ctx.h b/libcsoap/soap-ctx.h index c32f372..2ea107b 100755 --- a/libcsoap/soap-ctx.h +++ b/libcsoap/soap-ctx.h @@ -1,5 +1,5 @@  /******************************************************************
 - *  $Id: soap-ctx.h,v 1.1 2004/10/15 13:33:48 snowdrop Exp $
 + *  $Id: soap-ctx.h,v 1.2 2004/10/28 10:30:46 snowdrop Exp $
   *
   * CSOAP Project:  A SOAP client/server library in C
   * Copyright (C) 2003-2004  Ferhat Ayaz
 @@ -40,7 +40,7 @@ typedef struct _SoapCtx  SoapCtx* soap_ctx_new(SoapEnv *env); /* should only be used internally */
  /* Size of destination dest_href should be MAX_HREF_SIZE */
 -hstatus_t soap_ctx_add_file(SoapCtx* ctx, const char* filename, const char* content_type, char *dest_href);
 +herror_t soap_ctx_add_file(SoapCtx* ctx, const char* filename, const char* content_type, char *dest_href);
  void soap_ctx_add_files(SoapCtx* ctx, attachments_t *attachments);
  void soap_ctx_free(SoapCtx* ctx);
 diff --git a/libcsoap/soap-env.c b/libcsoap/soap-env.c index 7d7811b..6527028 100644 --- a/libcsoap/soap-env.c +++ b/libcsoap/soap-env.c @@ -1,5 +1,5 @@  /****************************************************************** -*  $Id: soap-env.c,v 1.8 2004/10/15 14:33:07 snowdrop Exp $ +*  $Id: soap-env.c,v 1.9 2004/10/28 10:30:46 snowdrop Exp $  *  * CSOAP Project:  A SOAP client/server library in C  * Copyright (C) 2003  Ferhat Ayaz @@ -102,21 +102,96 @@ static  /* ---------------------------------------------------------------------------- */ -SoapEnv * +
 +
 +herror_t
 +soap_env_new_from_doc (xmlDocPtr doc, SoapEnv **out)
 +{
 +  xmlNodePtr node;
 +  SoapEnv *env;
 +
 +  if (doc == NULL)
 +  {
 +    log_error1 ("Can not create xml document!");
 +    return herror_new("soap_env_new_from_doc", 
 +		GENERAL_INVALID_PARAM, "XML Document (xmlDocPtr) is NULL");
 +  }
 +
 +  node = xmlDocGetRootElement (doc);
 +  if (node == NULL)
 +  {
 +    log_error1 ("xml document is empty!");
 +    return herror_new("soap_env_new_from_doc", 
 +		XML_ERROR_EMPTY_DOCUMENT, "XML Document is empty!");
 +  }
 +
 +  env = (SoapEnv *) malloc (sizeof (SoapEnv));
 +
 +  /* set root */
 +  env->root = node;
 +
 +  /* set method root
 +     set call->cur (current node) to <method>.
 +     xpath: //Envelope/Body/
 +   */
 +  node = soap_xml_get_children (env->root);/* Check for NULL ! */
 +  env->cur = soap_xml_get_children (node); /* Check for NULL ! */
 +
 +  *out = env;
 +  return H_OK;
 +}
 +
 +
 +
 +
 +herror_t
 +soap_env_new_from_buffer (const char *buffer, SoapEnv **out)
 +{
 +  xmlDocPtr doc;
 +  herror_t err;
 +
 +  if (buffer == NULL)
 +     return herror_new("soap_env_new_from_buffer", 
 +		GENERAL_INVALID_PARAM, "buffer (first param) is NULL");
 +
 +  doc = xmlParseDoc (BAD_CAST buffer);
 +  if (doc == NULL)
 +     return herror_new("soap_env_new_from_buffer", 
 +		XML_ERROR_PARSE, "Can not parse xml");
 +
 +  err = soap_env_new_from_doc (doc, out);
 +  if (err != H_OK)  {
 +    xmlFreeDoc (doc);
 +  }
 +
 +  return err;
 +}
 +
 +
 +herror_t  soap_env_new_with_fault (fault_code_t faultcode,  			 const char *faultstring, -			 const char *faultactor, const char *detail) +			 const char *faultactor, const char *detail, SoapEnv **out)  {    xmlDocPtr doc; +  herror_t err;
 +	
    doc = soap_fault_build (faultcode, faultstring, faultactor, detail);    if (doc == NULL) -    return NULL; -  return soap_env_new_from_doc (doc); +    return herror_new("soap_env_new_with_fault", 
 +		XML_ERROR_PARSE, "Can not parse fault xml");
 +
 +  err = soap_env_new_from_doc (doc, out);
 +  if (err != H_OK)  {
 +    xmlFreeDoc (doc);
 +  }
 +
 +  return err;
  } -SoapEnv * -soap_env_new_with_response (SoapEnv * request) +herror_t +soap_env_new_with_response (SoapEnv * request, SoapEnv **out)  {    char urn[100];    char methodname[150]; @@ -124,19 +199,20 @@ soap_env_new_with_response (SoapEnv * request)    if (request == NULL)    { -    log_error1 ("request object is NULL"); -    return NULL; +     return herror_new("soap_env_new_with_response", 
 +		GENERAL_INVALID_PARAM, "request (first param) is NULL");
    }    if (request->root == NULL)    { -    log_error1 ("request has no xml"); -    return NULL; -  } +     return herror_new("soap_env_new_with_response", 
 +		GENERAL_INVALID_PARAM, "request (first param) has no xml structure");
 +   }    if (!soap_env_find_methodname (request, methodname))    { -    return NULL; +     return herror_new("soap_env_new_with_response", 
 +		GENERAL_INVALID_PARAM, "Method name '%s' not found in request", SAVE_STR(methodname));
    }    if (!soap_env_find_urn (request, urn)) @@ -148,15 +224,14 @@ soap_env_new_with_response (SoapEnv * request)    }    sprintf (methodname2, "%sResponse", methodname); -  return soap_env_new_with_method (urn, methodname2); +  return soap_env_new_with_method (urn, methodname2, out);  } -SoapEnv * -soap_env_new_with_method (const char *urn, const char *method) +herror_t +soap_env_new_with_method (const char *urn, const char *method, SoapEnv **out)  {    xmlDocPtr env; -  SoapEnv *call;    xmlChar buffer[1054]; @@ -188,19 +263,30 @@ soap_env_new_with_method (const char *urn, const char *method)  #endif    } -  env = xmlParseDoc (buffer); -  call = soap_env_new_from_doc (env); +  
 +  env = xmlParseDoc (buffer);
 +  if (!env)
 +    return herror_new("soap_env_new_with_method", 
 +		XML_ERROR_PARSE, "Can not parse xml");
 + +  return soap_env_new_from_doc (env, out); -  return call;  } +
 +
  static   int _soap_env_xml_io_read(void* ctx, char *buffer, int len) -{ -  http_input_stream_t *in = (http_input_stream_t *)ctx; -  if(!http_input_stream_is_ready(in)) -    return 0; -  return http_input_stream_read(in, buffer, len); +{
 +	int readed; +	http_input_stream_t *in = (http_input_stream_t*)ctx;
 +	if(!http_input_stream_is_ready(in)) +		return 0;
 +  
 +	readed = http_input_stream_read(in, buffer, len);
 +	if (readed == -1)
 +		return 0;
 +	return readed;  }  static @@ -210,15 +296,21 @@ int _soap_env_xml_io_close(void *ctx)    return 0;  } -SoapEnv * -soap_env_new_from_stream(http_input_stream_t *in) +
 +herror_t +soap_env_new_from_stream(http_input_stream_t *in, SoapEnv **out)  { -  xmlDocPtr doc; -   +  xmlDocPtr doc;
 +  herror_t err; + 
    doc = xmlReadIO(_soap_env_xml_io_read,      _soap_env_xml_io_close,  in, "", NULL, 0); - -  return soap_env_new_from_doc (doc); +
 +  if (in->err != H_OK) return in->err;
 +  if (doc == NULL) return herror_new("soap_env_new_from_stream", 
 +	  XML_ERROR_PARSE, "Trying to parse not valid xml"); +  err = soap_env_new_from_doc (doc, out);
 +  return err;
  } @@ -346,67 +438,6 @@ soap_env_free (SoapEnv * env)  } -SoapEnv * -soap_env_new_from_doc (xmlDocPtr doc) -{ -  SoapEnv *env; -  xmlNodePtr node; - -  if (doc == NULL) -  { -    log_error1 ("Can not create xml document!"); -    return NULL; -  } - -  node = xmlDocGetRootElement (doc); -  if (node == NULL) -  { -    log_error1 ("xml document is empty!"); -    return NULL; -  } - -  env = (SoapEnv *) malloc (sizeof (SoapEnv)); - -  /* set root */ -  env->root = node; - -  /* set method root -     set call->cur (current node) to <method>. -     xpath: //Envelope/Body/ -   */ -  node = soap_xml_get_children (env->root); -  env->cur = soap_xml_get_children (node); - -  return env; -} - - - - -SoapEnv * -soap_env_new_from_buffer (const char *buffer) -{ -  xmlDocPtr doc; -  SoapEnv *env; - -  if (buffer == NULL) -    return NULL; - -  doc = xmlParseDoc (BAD_CAST buffer); -  if (doc == NULL) -    return NULL; - -  env = soap_env_new_from_doc (doc); -  if (env == NULL) -  { -    xmlFreeDoc (doc); -    return NULL; -  } - -  return env; -} - -  xmlNodePtr  soap_env_get_body (SoapEnv * env)  { diff --git a/libcsoap/soap-env.h b/libcsoap/soap-env.h index 5b3bd7f..58af136 100644 --- a/libcsoap/soap-env.h +++ b/libcsoap/soap-env.h @@ -1,5 +1,5 @@  /****************************************************************** - *  $Id: soap-env.h,v 1.7 2004/10/15 13:33:13 snowdrop Exp $ + *  $Id: soap-env.h,v 1.8 2004/10/28 10:30:46 snowdrop Exp $   *   * CSOAP Project:  A SOAP client/server library in C   * Copyright (C) 2003  Ferhat Ayaz @@ -50,8 +50,8 @@ typedef struct _SoapEnv     @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) - -   @returns A Soap envelope object like follows  +   @param out the result envelope out parameter like follows +   @returns H_OK if success     <pre>     <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." SOAP-ENV:encoding="..." @@ -71,11 +71,12 @@ typedef struct _SoapEnv     </pre> - */ -SoapEnv *soap_env_new_with_fault(fault_code_t faultcode,  + */
 +herror_t +soap_env_new_with_fault(fault_code_t faultcode,   				 const char *faultstring,  				 const char *faultactor, -				 const char *detail); +				 const char *detail, SoapEnv **out);  /**     Creates an envelope with a method to invoke a soap service. @@ -84,7 +85,8 @@ SoapEnv *soap_env_new_with_fault(fault_code_t faultcode,     @param urn The urn of the soap service to invoke     @param method The method name of the soap service -   @returns A Soap envelope object like follows  +   @param out the result envelope out parameter like follows
 +   @returns H_OK if success
     <pre>     <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." SOAP-ENV:encoding="..." @@ -101,7 +103,8 @@ SoapEnv *soap_env_new_with_fault(fault_code_t faultcode,     </pre>   */ -SoapEnv *soap_env_new_with_method(const char *urn, const char *method); +herror_t
 +soap_env_new_with_method(const char *urn, const char *method, SoapEnv **out);  /** @@ -115,7 +118,8 @@ SoapEnv *soap_env_new_with_method(const char *urn, const char *method);     @param req The request object. A response object will be created      to this request. -   @returns A Soap envelope object like follows  +   @param out the result envelope out paramter like follows
 +   @returns H_OK if success
     <pre>     <SOAP-ENV:Envelope xmlns:SOAP-ENV="..." SOAP-ENV:encoding="..." @@ -133,18 +137,19 @@ SoapEnv *soap_env_new_with_method(const char *urn, const char *method);   */ -SoapEnv *soap_env_new_with_response(SoapEnv *req); +herror_t soap_env_new_with_response(SoapEnv *req,SoapEnv **out);  /**     Creates an envelope from a given libxml2 xmlDoc      pointer. -   @param doc the xml document pointer -   @returns A Soap envelop object if success,  -    NULL otherwise. +   @param doc the xml document pointer
 +   @param out the output envelope object
 +   @returns H_OK if success +       */ -SoapEnv *soap_env_new_from_doc(xmlDocPtr doc); +herror_t soap_env_new_from_doc(xmlDocPtr doc, SoapEnv **out);  /** @@ -152,17 +157,20 @@ SoapEnv *soap_env_new_from_doc(xmlDocPtr doc);     The string must be in xml format.     @param buffer The string to parse into a envelope. -   @returns A soap envelope object if success or -    NULL if the string can not be parsed or the string -    does not represent an soap envelope in xml format. +   @param out the output envelope object
 +   @returns H_OK if success   */ -SoapEnv *soap_env_new_from_buffer(const char* buffer); +herror_t soap_env_new_from_buffer(const char* buffer,SoapEnv **out);  /** -  Create an envelope from input stream +  Create an envelope from input stream
 + +   @param in the input stream object to read from 
 +   @param out the output envelope object
 +   @returns H_OK if success
  */ -SoapEnv *soap_env_new_from_stream(http_input_stream_t *in); +herror_t soap_env_new_from_stream(http_input_stream_t *in, SoapEnv **out);  /* --------------------------------------------------- */  /*      XML Serializer functions  and typedefs         */ diff --git a/libcsoap/soap-server.c b/libcsoap/soap-server.c index 690fa6b..65bef3f 100644 --- a/libcsoap/soap-server.c +++ b/libcsoap/soap-server.c @@ -1,5 +1,5 @@  /****************************************************************** -*  $Id: soap-server.c,v 1.6 2004/10/20 14:17:36 snowdrop Exp $ +*  $Id: soap-server.c,v 1.7 2004/10/28 10:30:46 snowdrop Exp $  *  * CSOAP Project:  A SOAP client/server library in C  * Copyright (C) 2003  Ferhat Ayaz @@ -58,9 +58,9 @@ void _soap_server_send_fault(httpd_conn_t *conn, hpair_t *header,  /*---------------------------------*/ -int soap_server_init_args(int argc, char *argv[]) +herror_t soap_server_init_args(int argc, char *argv[])  { -	return !httpd_init(argc, argv); +	return httpd_init(argc, argv);  } @@ -82,7 +82,7 @@ int soap_server_register_router(SoapRouter *router, const char* context)  } -int soap_server_run() +herror_t soap_server_run()  {  	return httpd_run();  } @@ -113,7 +113,8 @@ void soap_server_entry(httpd_conn_t *conn, hrequest_t *req)  	SoapCtx *ctx, *ctxres;  	SoapRouter *router;  	SoapService *service; -	SoapEnv *env; +	SoapEnv *env;
 +	herror_t err;  	if (req->method != HTTP_REQUEST_POST) { @@ -125,10 +126,17 @@ void soap_server_entry(httpd_conn_t *conn, hrequest_t *req)  		return;  	} -/*	postdata = httpd_get_postdata(conn, req, &received, -1);*/ -  env = soap_env_new_from_stream(req->in); -	header = hpairnode_new(HEADER_CONTENT_TYPE, "text/xml", NULL); +	header = hpairnode_new(HEADER_CONTENT_TYPE, "text/xml", NULL);
 +
 +	err = soap_env_new_from_stream(req->in, &env);
 +	if (err != H_OK) 
 +	{
 +  		_soap_server_send_fault(conn, header, herror_message(err));
 +		herror_release(err);
 +		return;
 +	}
 +  	if (env == NULL) { @@ -183,13 +191,22 @@ void soap_server_entry(httpd_conn_t *conn, hrequest_t *req)  					return;  				} else { -					log_verbose2("func: %p", service->func); +					log_verbose2("func: %p", service->func);
 +					ctxres = soap_ctx_new(NULL);  					/* ===================================== */            /*       CALL SERVICE FUNCTION           */  					/* ===================================== */ -					ctxres = service->func(ctx); -					log_verbose2("func returned: (%p)", ctxres); -					if (ctxres == NULL) { +					err = service->func(ctx, ctxres);
 +					if (err != H_OK) {
 +						sprintf(buffer, "Service returned following error message: '%s'",
 +							herror_message(err));
 +						herror_release(err);
 +						_soap_server_send_fault(conn, header, buffer);
 +						soap_ctx_free(ctx);
 +						return;
 +					}
 + +					if (ctxres->env == NULL) {  						sprintf(buffer, "Service '%s' returned no envelope", urn);  						_soap_server_send_fault(conn, header, buffer); @@ -271,13 +288,38 @@ static  void _soap_server_send_fault(httpd_conn_t *conn, hpair_t *header,   							 const char* errmsg)  { -	SoapEnv *envres; +	SoapEnv *envres;
 +	herror_t err;
 +	char buffer[45];  	httpd_set_headers(conn, header); -	httpd_send_header(conn, 500, "FAILED"); -	envres = soap_env_new_with_fault(Fault_Server, +	err = httpd_send_header(conn, 500, "FAILED");
 +	if (err != H_OK) {
 +		 /* WARNING: unhandled exception !*/
 +		log_error4("%s():%s [%d]", herror_func(err), herror_message(err), herror_code(err));
 +		return;
 +	}
 + +	err = soap_env_new_with_fault(Fault_Server,  		errmsg?errmsg:"General error", -		"cSOAP_Server", NULL); -	_soap_server_send_env(conn->out, envres); +		"cSOAP_Server", NULL, &envres);
 +	 if (err != H_OK) {
 +		 log_error1(herror_message(err));
 +		http_output_stream_write_string(conn->out, "<html><head></head><body>");
 +		http_output_stream_write_string(conn->out, "<h1>Error</h1><hr>");
 +		http_output_stream_write_string(conn->out, "Error while sending fault object:<br>Message: ");
 +		http_output_stream_write_string(conn->out, herror_message(err));
 +		http_output_stream_write_string(conn->out, "<br>Function: ");
 +		http_output_stream_write_string(conn->out, herror_func(err));
 +		http_output_stream_write_string(conn->out, "<br>Error code: ");
 +		sprintf(buffer, "%d", herror_code(err));
 +		http_output_stream_write_string(conn->out, buffer);
 +		http_output_stream_write_string(conn->out, "</body></html>");
 +		return;
 +
 +		 herror_release(err);
 +	 } else { +	_soap_server_send_env(conn->out, envres);
 +	 }  } diff --git a/libcsoap/soap-server.h b/libcsoap/soap-server.h index 13abd92..62d136c 100644 --- a/libcsoap/soap-server.h +++ b/libcsoap/soap-server.h @@ -1,5 +1,5 @@  /****************************************************************** - *  $Id: soap-server.h,v 1.3 2004/10/15 13:33:13 snowdrop Exp $ + *  $Id: soap-server.h,v 1.4 2004/10/28 10:30:46 snowdrop Exp $   *   * CSOAP Project:  A SOAP client/server library in C   * Copyright (C) 2003  Ferhat Ayaz @@ -19,7 +19,7 @@   * Free Software Foundation, Inc., 59 Temple Place - Suite 330,   * Boston, MA  02111-1307, USA.   *  - * Email: ayaz@jprogrammer.net + * Email: ferhatayaz@yahoo.com   ******************************************************************/  #ifndef cSOAP_SERVER_H  #define cSOAP_SERVER_H @@ -34,7 +34,9 @@     <TABLE border=1>     <TR><TH>Argument</TH><TH>Description</TH></TR> -   <TR><TD>-NHTTPport [port]</TD><TD>Port to listen (default: 10000)</TD></TR> +   <TR><TD>-NHTTPport [port]</TD><TD>Port to listen (default: 10000)</TD></TR>
 +   <TR><TD>-NHTTPmaxconn [num]</TD><TD>Maximum thread connections</TD></TR>
 +   <TR><TD>-NHTTPlog [logfilename]</TD><TD>logfile</TD></TR>
     </TABLE>     @param argc commandline arg count @@ -42,7 +44,7 @@     @returns 1 if success, 0 otherwise   */ -int soap_server_init_args(int argc, char *argv[]); +herror_t soap_server_init_args(int argc, char *argv[]);  /** @@ -66,7 +68,7 @@ int soap_server_register_router(SoapRouter *router, const char* context);     Enters the server loop and starts to listen to      http requests.   */ -int soap_server_run(); +herror_t soap_server_run();  /** diff --git a/libcsoap/soap-service.h b/libcsoap/soap-service.h index 7c2855e..c03d7df 100644 --- a/libcsoap/soap-service.h +++ b/libcsoap/soap-service.h @@ -1,5 +1,5 @@  /****************************************************************** - *  $Id: soap-service.h,v 1.2 2004/10/15 13:34:02 snowdrop Exp $ + *  $Id: soap-service.h,v 1.3 2004/10/28 10:30:46 snowdrop Exp $   *   * CSOAP Project:  A SOAP client/server library in C   * Copyright (C) 2003  Ferhat Ayaz @@ -28,7 +28,7 @@  #include <libcsoap/soap-env.h>  #include <libcsoap/soap-ctx.h> -typedef SoapCtx* (*SoapServiceFunc)(SoapCtx*); +typedef herror_t (*SoapServiceFunc)(SoapCtx*, SoapCtx*);  typedef struct _SoapService  | 
