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