      * curl simple URL request (free-format RPG)
      *
        ctl-opt dftactgrp(*NO) actgrp(*NEW)
                option(*NOSHOWCPY)
                bnddir('CURL');
      *
      **************************************************************************
      *                                  _   _ ____  _
      *  Project                     ___| | | |  _ \| |
      *                             / __| | | | |_) | |
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
      * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
      * are also available at https://curl.se/docs/copyright.html.
      *
      * You may opt to use, copy, modify, merge, publish, distribute and/or sell
      * copies of the Software, and permit persons to whom the Software is
      * furnished to do so, under the terms of the COPYING file.
      *
      * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
      * ANY KIND, either express or implied.
      *
      * SPDX-License-Identifier: curl
      *
      **************************************************************************

      /include H,CURL.INC

      * Simple free-format RPG program to request the URL given as command line
      * parameter and output its response.

        dcl-pi *N;
            url char(120);
        end-pi;

        dcl-s urllen int(10);           // URL length

      **************************************************************************

        urllen = trimmed_length(url: %len(url));

        // Do the curl stuff.

        curl_global_init(CURL_GLOBAL_ALL);
        main();
        curl_global_cleanup();
        *inlr = *on;            // Exit

      **************************************************************************
      * Main procedure: do the curl job.
      **************************************************************************

        dcl-proc main;
            dcl-pi *N end-pi;

            dcl-s h pointer;                                            // Easy handle
            dcl-s result like(CURLcode) inz(CURLE_OUT_OF_MEMORY);       // Curl return code
            dcl-s errmsgp pointer;                                      // Error string pointer
            dcl-s response char(52);                                    // For error display

            // Create and fill curl handle.

            h = curl_easy_init();
            if h <> *NULL;
                curl_easy_setopt_ccsid(h: CURLOPT_URL: %subst(url: 1: urllen):
                                       0);
                curl_easy_setopt(h: CURLOPT_FOLLOWLOCATION: 1);

                // Perform the request.

                result = curl_easy_perform(h);
                curl_easy_cleanup(h);       // Release handle
            endif;

            // Check for error and report if some.

            if result <> CURLE_OK;
                errmsgp = curl_easy_strerror_ccsid(result: 0);
                response = %str(errmsgp);
                dsply '' '*EXT' response;
            endif;
        end-proc;
      *
      **************************************************************************
      * Get the length of right-trimmed string
      **************************************************************************
      *
        dcl-proc trimmed_length;
            dcl-pi *N uns(10);
                string char(9999999) const options(*varsize);
                length uns(10) value;
            end-pi;

            dcl-s len uns(10);

            len = %scan(X'00': string: 1: length); // Limit to null-terminated string
            if len = 0;
                len = length + 1;
            endif;
            if len <= 1;
                return 0;
            endif;
            return %checkr(' ': string: len - 1);  // Trim right
        end-proc;
