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