diff options
Diffstat (limited to 'libcsoap/soap-client.c')
-rw-r--r-- | libcsoap/soap-client.c | 136 |
1 files changed, 49 insertions, 87 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; } |