xref: /curl/packages/OS400/rpg-examples/HTTPPOST (revision 7c142d05)
1      * Curl MIME post data and display response
2      *
3     h DFTACTGRP(*NO) ACTGRP(*NEW)
4     h OPTION(*NOSHOWCPY)
5     h BNDDIR('CURL')
6      *
7      **************************************************************************
8      *                                  _   _ ____  _
9      *  Project                     ___| | | |  _ \| |
10      *                             / __| | | | |_) | |
11      *                            | (__| |_| |  _ <| |___
12      *                             \___|\___/|_| \_\_____|
13      *
14      * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
15      *
16      * This software is licensed as described in the file COPYING, which
17      * you should have received as part of this distribution. The terms
18      * are also available at https://curl.se/docs/copyright.html.
19      *
20      * You may opt to use, copy, modify, merge, publish, distribute and/or sell
21      * copies of the Software, and permit persons to whom the Software is
22      * furnished to do so, under the terms of the COPYING file.
23      *
24      * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
25      * ANY KIND, either express or implied.
26      *
27      * SPDX-License-Identifier: curl
28      *
29      **************************************************************************
30      *
31      /include H,CURL.INC
32      *
33      * Example to HTTP POST data using the MIME API. Displays the response.
34      *
35     d                 pi
36     d userinput                    120                                         User data to post
37      *
38     d url             c                   'http://httpbin.org/anything'
39      *
40      *
41     d inputlen        s             10u 0                                      User input length
42      **************************************************************************
43
44        inputlen = trimmed_length(userinput: %len(userinput));
45
46        // Do the curl stuff.
47
48        curl_global_init(CURL_GLOBAL_ALL);
49        main();
50        curl_global_cleanup();
51        *inlr = *on;            // Exit
52      *
53      **************************************************************************
54      * Main procedure: do the curl job.
55      **************************************************************************
56      *
57     p main            b
58     d main            pi
59      *
60     d h               s               *                                        Easy handle
61     d result          s                   like(CURLcode)                       Curl return code
62     d                                     inz(CURLE_OUT_OF_MEMORY)
63     d errmsgp         s               *                                        Error string pointer
64     d response        s             52                                         For error display
65     d mime            s               *                                        MIME handle
66     d mimepart        s               *                                        MIME part handle
67     d parthdrs        s               *   inz(*NULL)                           Part headers
68
69            // Create and fill curl handle.
70
71        h = curl_easy_init();
72        if h <> *NULL;
73            curl_easy_setopt_ccsid(h: CURLOPT_URL: url: 0);
74            curl_easy_setopt(h: CURLOPT_FOLLOWLOCATION: 1);
75            mime = curl_mime_init(h);
76            mimepart = curl_mime_addpart(mime);
77            curl_mime_name_ccsid(mimepart: 'autofield': 0);
78            curl_mime_data_ccsid(mimepart: 'program-generated value':
79                                 CURL_ZERO_TERMINATED: 0);
80            mimepart = curl_mime_addpart(mime);
81            curl_mime_name_ccsid(mimepart: 'userfield': 0);
82            curl_mime_data_ccsid(mimepart: %subst(userinput: 1: inputlen):
83                                 CURL_ZERO_TERMINATED: 0);
84            mimepart = curl_mime_addpart(mime);
85            curl_mime_name_ccsid(mimepart: 'ebcdicfield': 0);
86            curl_mime_data(mimepart: %subst(userinput: 1: inputlen): inputlen);
87            curl_mime_encoder_ccsid(mimepart: 'base64': 0);
88            // Avoid server to convert base64 to text.
89            parthdrs = curl_slist_append_ccsid(parthdrs:
90                                       'Content-Transfer-Encoding: bit': 0);
91            curl_mime_headers(mimepart: parthdrs: 1);
92            curl_easy_setopt(h: CURLOPT_MIMEPOST: mime);
93
94            // Perform the request.
95
96            result = curl_easy_perform(h);
97            curl_mime_free(mime);
98            curl_easy_cleanup(h);       // Release handle
99        endif;
100
101        // Check for error and report if some.
102
103        if result <> CURLE_OK;
104            errmsgp = curl_easy_strerror_ccsid(result: 0);
105            response = %str(errmsgp);
106            dsply '' '*EXT' response;
107        endif;
108     p main            e
109      *
110      **************************************************************************
111      * Get the length of right-trimmed string
112      **************************************************************************
113      *
114     p trimmed_length  b
115     d trimmed_length  pi            10u 0
116     d  string                   999999    const options(*varsize)
117     d  length                       10u 0 value
118      *
119     d len             s             10u 0
120      *
121        len = %scan(X'00': string: 1: length); // Limit to zero-terminated string
122        if len = 0;
123            len = length + 1;
124        endif;
125        if len <= 1;
126            return 0;
127        endif;
128        return %checkr(' ': string: len - 1);  // Trim right
129     p trimmed_length  e
130