quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

HEADERAPI (5995B)


      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 null-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