summaryrefslogtreecommitdiffstats
path: root/libcsoap/soap-client.c
blob: f7e4536ee860687a74a912da66d5e93922b7ce26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/******************************************************************
 *  $Id: soap-client.c,v 1.3 2004/04/14 09:20:36 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
 ******************************************************************/
#include <libcsoap/soap-client.h>
#include <nanohttp/nanohttp-client.h>


/*--------------------------------- */
static SoapEnv *_soap_client_build_result(hresponse_t *res);
/*--------------------------------- */


SoapEnv*
soap_client_invoke(SoapEnv *call, const char *url, const char *soap_action)
{
  /* Result document */
  xmlDocPtr doc;

  /* Buffer variables*/
  xmlBufferPtr buffer;
  char *content;

  /* Transport variables */
  httpc_conn_t *conn;
  hresponse_t *res;
  
  /* Create buffer */
  buffer = xmlBufferCreate();
  xmlNodeDump(buffer, call->root->doc,call->root, 1 ,0);
  content = (char*)xmlBufferContent(buffer);
  
  /* Transport via HTTP */
  conn = httpc_new();

  /* content-type is always 'text/xml' */
  httpc_set_header(conn, HEADER_CONTENT_TYPE, "text/xml");

  if (soap_action != NULL) {
    httpc_set_header(conn, "SoapAction", soap_action);
  }
  res = httpc_post(conn, url, strlen(content), content);

  /* Free buffer */
  xmlBufferFree(buffer);

  /* Build result */
  /* TODO: If res == NULL, find out where and why it is NULL! */
  doc = _soap_client_build_result(res); 

  return doc;
}


static 
SoapEnv* _soap_client_build_result(hresponse_t *res)
{
  xmlDocPtr doc;
  SoapEnv *env;

  log_verbose2("Building result (%p)", res);

  if (res == NULL)
    return soap_env_new_with_fault(Fault_Client, 
			    "Response is NULL","","");

  if (res->body == NULL)
    return soap_env_new_with_fault(Fault_Client, 
			    "Empty response from server!","","");


  
  doc = xmlParseDoc(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);

  if (env == NULL) {
    xmlFreeDoc(doc);
    return soap_env_new_with_fault(Fault_Client, 
			    "Can not create envelope","","");
  }

  return env;
}