http_xml_send
,
http_xml_send_xmlrpc
, —
XML and XML-RPC requests over HTTP
PDEL Library (libpdel, -lpdel)
#include
<sys/types.h>
#include
<netinet/in.h>
#include
<pdel/http/xml.h>
int
http_xml_send
(
struct
http_client *client,
struct in_addr
ip,
u_int16_t
port,
int
https,
const
char *urlpath,
const char
*username,
const
char *password,
const char
*ptag,
const
char *pattrs,
const struct
structs_type *ptype,
const void
*payload,
int
pflags,
const
char *rtag,
char
**rattrsp,
const
char *rattrs_mtype,
const struct
structs_type *rtype,
void *reply,
int rflags,
structs_xmllog_t
*rlogger);
int
http_xml_send_xmlrpc
(
struct
http_client *client,
struct in_addr
ip,
u_int16_t
port,
int
https,
const
char *username,
const char
*password,
const
char *methodName,
u_int nparams,
const struct
structs_type **ptypes,
const void
**pdatas,
const
struct structs_type *rtype,
void *reply,
struct
xmlrpc_compact_fault *fault,
structs_xmllog_t
*rlogger);
These functions send and receive XML and XML-RPC over HTTP and HTTPS. They are
convenience wrappers around the
http_request(3),
http_response(3),
structx_xml_input(3),
structs_xml_output(3),
and
structs_xmlrpc(3)
routines.
http_xml_send
() uses
client to send an HTTP request for the URL
path
urlpath (which must being with a '/') to
IP address
ip and port
port. If
https is non-zero, an SSL (HTTPS) request is
made. The
username and
password may be non-
NULL
for "Basic" HTTP
authentication.
The remaining arguments to
http_xml_send
()
describe the optional XML request payload and the expected XML reply payload.
To include a payload in the request,
payload
should be non-
NULL
. If so,
ptag,
pattrs,
ptype,
payload, and
pflags are handled exactly like the
elem_tag,
attrs,
type,
data, and
flags parameters (respectively) to the
function
structs_xml_output(3).
The request payload will be sent using an HTTP POST with MIME type
"text/xml". If
payload is
NULL
, an HTTP GET request is sent instead.
The HTTP response must contain an XML document, which is parsed and converted
into native binary format. The
rtag,
rattrsp,
rattrs_mtype,
rtype,
reply,
rflags, and
rlogger are handled exactly like the
elem_tag,
attrp,
attr_type,
type,
data,
flags, and
logger parameters (respectively) to the
function
structs_xml_input(3).
http_xml_send_xmlrpc
() sends an XML-RPC
request. The
client,
ip,
port,
https,
username,
password, and
rlogger parameters are as with
http_xml_send
(). The XML-RPC method name is
pointed to by
methodName.
nparams XML-RPC request parameters are sent;
ptypes must point to an array of
nparams parameter types and
pdatas to an array of
nparams parameter values having the
corresponding types. These are “compact”
structs(3)
types that will be automatically expanded into “exploded”
XML-RPC types when the actual request is sent (see
structs_xmlrpc(3)).
To send exploded XML-RPC values directly, set
ptypes to
NULL
. Then it will be assumed that each
element in the
pdatas array is an instance of
structs_type_xmlrpc_value(3),
i.e., a
struct xmlrpc_value_union
.
If
reply is
NULL
, the reply is ignored. Otherwise, the
XML-RPC return value must have “compact” type matching
rtype and
reply must point to an uninitialized region
of memory large enough to hold an instance of
rtype. If the request is successful and no
fault is returned,
http_send_xmlrpc
()
returns zero and
reply will be initialized
with the “compacted” XML-RPC return value. If the returned value
does not match
rtype, then -1 is returned
with
errno set appropriately.
To have the exploded XML-RPC value returned directly, set
rtype to
NULL
. Then it will be assumed that
reply points to an uninitialized instance of
structs_type_xmlrpc_value(3),
i.e., a
struct xmlrpc_value_union
, and the reply will
be returned unmodified.
If an XML-RPC fault is returned, then
*reply
remains unmodified and
http_xml_send_xmlrpc
() returns -2. In
addition, if
fault is not
NULL
, then it is assumed to point to an
uninitialized instance of
structs_type_xmlrpc_compact_fault, i.e., a
struct xmlrpc_compact_fault
. The instance will be
initialized with the received XML-RPC fault. The calling function is
responsible for eventually uninitializing it.
Upon error,
http_xml_send
() and
http_xml_send_xmlrpc
() return -1 and set
errno to an appropriate value.
If
http_xml_send_xmlrpc
() receives an XML-RPC
fault from the server, -2 is returned.
http_client(3),
http_request(3),
http_response(3),
http_servlet_xml(3),
http_servlet_xmlrpc(3),
libpdel(3),
structs_xml_input(3),
structs_xmlrpc(3)
XML-RPC Home Page,
http://www.xmlrpc.org/.
The PDEL library was developed at Packet Design, LLC.
http://www.packetdesign.com/
Archie Cobbs
⟨archie@freebsd.org⟩
HTTP redirects are not followed; instead they generate an error.