1 * Curl header API: extract headers post transfer 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 * Extract headers post transfer with the header API. 34 * 35 d pi 36 d url 120 37 * 38 d urllen s 10u 0 URL length 39 * 40 ************************************************************************** 41 42 urllen = trimmed_length(url: %len(url)); 43 44 // Do the curl stuff. 45 46 curl_global_init(CURL_GLOBAL_ALL); 47 main(); 48 curl_global_cleanup(); 49 *inlr = *on; // Exit 50 * 51 ************************************************************************** 52 * Main procedure: do the curl job. 53 ************************************************************************** 54 * 55 p main b 56 d main pi 57 * 58 d h s * Easy handle 59 d result s like(CURLcode) Curl return code 60 d inz(CURLE_OUT_OF_MEMORY) 61 d header ds likeds(curl_header) based(hp) 62 d strp1 s * Work string pointer 63 d strp2 s * Work string pointer 64 d inout s 52 For error display 65 66 // Create and fill curl handle. 67 68 h = curl_easy_init(); 69 if h <> *NULL; 70 curl_easy_setopt_ccsid(h: CURLOPT_URL: %subst(url: 1: urllen): 0); 71 curl_easy_setopt(h: CURLOPT_FOLLOWLOCATION: 1); 72 curl_easy_setopt(h: CURLOPT_WRITEFUNCTION: %paddr(in_data_cb)); // Ignore input data 73 74 // Perform the request. 75 76 result = curl_easy_perform(h); 77 endif; 78 79 // Check for error and report if some. 80 81 if result <> CURLE_OK; 82 inout = %str(curl_easy_strerror_ccsid(result: 0)); 83 dsply '' '*EXT' inout; 84 else; 85 if curl_easy_header_ccsid(h: 'Content-Type': 0: CURLH_HEADER: -1: 86 hp: 0) = CURLHE_OK; 87 strp2 = curl_to_ccsid(header.value: 0); 88 inout = 'Content-Type: ' + %str(strp2); 89 dsply inout; 90 curl_free(strp2); 91 endif; 92 dsply ' All server headers:'; 93 hp = *NULL; 94 dow *on; 95 hp = curl_easy_nextheader(h: CURLH_HEADER: -1: hp); 96 if hp = *NULL; 97 leave; 98 endif; 99 strp1 = curl_to_ccsid(header.name: 0); 100 strp2 = curl_to_ccsid(header.value: 0); 101 inout = %str(strp1) + ': ' + %str(strp2) + 102 ' (' + %char(header.amount) + ')'; 103 curl_free(strp2); 104 curl_free(strp1); 105 dsply inout; 106 enddo; 107 inout = 'Done'; 108 dsply '' '*EXT' inout; 109 curl_easy_cleanup(h); // Release handle 110 endif; 111 p main e 112 * 113 ************************************************************************** 114 * Dummy data input callback procedure. 115 ************************************************************************** 116 * 117 p in_data_cb b 118 d in_data_cb pi 10u 0 119 d ptr * value Input data pointer 120 d size 10u 0 value Data element size 121 d nmemb 10u 0 value Data element count 122 d userdata * value User data pointer 123 * 124 return size * nmemb; 125 p in_data_cb e 126 * 127 ************************************************************************** 128 * Get the length of right-trimmed string 129 ************************************************************************** 130 * 131 p trimmed_length b 132 d trimmed_length pi 10u 0 133 d string 999999 const options(*varsize) 134 d length 10u 0 value 135 * 136 d len s 10u 0 137 * 138 len = %scan(X'00': string: 1: length); // Limit to zero-terminated string 139 if len = 0; 140 len = length + 1; 141 endif; 142 if len <= 1; 143 return 0; 144 endif; 145 return %checkr(' ': string: len - 1); // Trim right 146 p trimmed_length e 147