File: curl_client.c

package info (click to toggle)
xmlrpc-c 1.59.03-10.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 8,132 kB
  • sloc: ansic: 55,248; cpp: 13,541; sh: 3,321; makefile: 2,553; perl: 593; xml: 134
file content (151 lines) | stat: -rw-r--r-- 4,292 bytes parent folder | download | duplicates (2)
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/* Same as xmlrpc_sample_add_client.c, except it demonstrates use of Curl
   transport parameters, including timeout and SSL stuff.

   You specify the server URL as an argument, which can be an "http:" URL for
   true XML-RPC or "https:" for the secure SSL/TLS variation of XML-RPC.

   Example that works with 'xmlrpc_sample_add_server' example server:

     $ ./curl_client http::/localhost:8080/RPC2

   Example that works with 'ssl_server' example server:

     $ ./curl_client https::/localhost:8080/RPC2
   
*/

#define _XOPEN_SOURCE 600
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

#include <xmlrpc-c/base.h>
#include <xmlrpc-c/client.h>

#include "config.h"  /* information about this build environment */



static void 
die_if_fault_occurred (xmlrpc_env * const envP) {
    if (envP->fault_occurred) {
        fprintf(stderr, "XML-RPC Fault: %s (%d)\n",
                envP->fault_string, envP->fault_code);
        exit(1);
    }
}



static void
add(xmlrpc_client * const clientP,
    const char *    const serverUrl,
    int             const addend,
    int             const adder) {

    const char * const methodName = "sample.add";

    xmlrpc_env env;
    xmlrpc_value * resultP;
    xmlrpc_int32 sum;

    xmlrpc_env_init(&env);

    printf("Making XMLRPC call to server url '%s' method '%s' "
           "to request the sum "
           "of %d and %d...\n", serverUrl, methodName, addend, adder);

    /* Make the remote procedure call */

    xmlrpc_client_call2f(&env, clientP, serverUrl, methodName, &resultP,
                         "(ii)", (xmlrpc_int32) addend, (xmlrpc_int32) adder);
    die_if_fault_occurred(&env);

    /* Get our sum and print it out. */
    xmlrpc_read_int(&env, resultP, &sum);
    die_if_fault_occurred(&env);
    printf("The sum is %d\n", sum);
    
    /* Dispose of our result value. */
    xmlrpc_DECREF(resultP);

    xmlrpc_env_clean(&env);
}



int 
main(int           const argc, 
     const char ** const argv) {

    const char * serverUrl;

    xmlrpc_env env;
    struct xmlrpc_curl_xportparms transportParms;
    struct xmlrpc_clientparms clientParms;
    xmlrpc_client * clientP;

    if (argc-1 < 1) {
        fprintf(stderr, "You must specify the server URL as an argument.  "
                "Example: http://localhost:8080/RPC2\n");
        exit(1);
    } else {
        serverUrl = argv[1];
    }

    /* Initialize our error-handling environment. */
    xmlrpc_env_init(&env);

    /* Required before any use of Xmlrpc-c client library: */
    xmlrpc_client_setup_global_const(&env);
    die_if_fault_occurred(&env);

    transportParms.network_interface = NULL;
    transportParms.no_ssl_verifypeer = 1;
    transportParms.no_ssl_verifyhost = 1;
    transportParms.user_agent = NULL;
    transportParms.ssl_cert = NULL;
    transportParms.sslcerttype = NULL;
    transportParms.sslcertpasswd = NULL;
    transportParms.sslkey = NULL;
    transportParms.sslkeytype = NULL;
    transportParms.sslengine = NULL;
    transportParms.sslengine_default = 0;
    transportParms.sslversion = XMLRPC_SSLVERSION_DEFAULT;
    transportParms.cainfo = NULL;
    transportParms.capath = NULL;
    transportParms.randomfile = NULL;
    transportParms.egdsocket= NULL;
    transportParms.ssl_cipher_list= "ALL:eNULL:aNULL";
    transportParms.timeout = 2000;  /* milliseconds */

    clientParms.transport = "curl";
    clientParms.transportparmsP = &transportParms;
    clientParms.transportparm_size = XMLRPC_CXPSIZE(timeout);

    /* Create a client object */
    xmlrpc_client_create(&env, 0, NULL, NULL,
                         &clientParms, XMLRPC_CPSIZE(transportparm_size),
                         &clientP);

    die_if_fault_occurred(&env);

    /* If our server is running 'xmlrpc_sample_add_server' normally, the
       RPC will finish almost instantly.  UNLESS the adder is 1, in which
       case said server is programmed to take 3 seconds to do the
       computation, thus allowing us to demonstrate a timeout.
    */

    add(clientP, serverUrl, 5, 7);
        /* Should finish instantly */

    add(clientP, serverUrl, 5, 1);
        /* Should time out after 2 seconds */

    xmlrpc_env_clean(&env);
    xmlrpc_client_destroy(clientP);
    xmlrpc_client_teardown_global_const();

    return 0;
}