text: /***************************************************************************
   *                                  _   _ ____  _
   *  Project                     ___| | | |  _ \| |
   *                             / __| | | | |_) | |
   *                            | (__| |_| |  _ <| |___
   *                             \___|\___/|_| \_\_____|
   *
   * Copyright (C) 1998 - 2018, 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.haxx.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.
   *
   ***************************************************************************/
  /* <DESC>
   * The file is based on CURL example and aimed at do request to a web page.
   * https://github.com/curl/curl/raw/master/docs/examples/getinmemory.c
   * </DESC>
   */
  
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  
  #include <curl/curl.h>
  #include "getinmemory.h"
  
  struct MemoryStruct {
      char *memory;
      size_t size;
  };
  
  static size_t
  WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
      size_t realsize = size * nmemb;
      struct MemoryStruct *mem = (struct MemoryStruct *) userp;
  
      char *ptr = realloc(mem->memory, mem->size + realsize + 1);
      if (ptr == NULL) {
          /* out of memory! */
          printf("not enough memory (realloc returned NULL)\n");
          return 0;
      }
  
      mem->memory = ptr;
      memcpy(&(mem->memory[mem->size]), contents, realsize);
      mem->size += realsize;
      mem->memory[mem->size] = 0;
  
      return realsize;
  }
  
  requests Post(const char *url, const char *PostData, const char *useragent) {
      CURL *curl_handle;
      CURLcode res;
      requests req;
  
      struct MemoryStruct chunk;
  
      chunk.memory = malloc(1);  /* will be grown as needed by the realloc above */
      chunk.size = 0;    /* no data at this point */
  
      curl_global_init(CURL_GLOBAL_ALL);
  
      /* init the curl session */
      curl_handle = curl_easy_init();
  
      /* specify URL to get */
      curl_easy_setopt(curl_handle, CURLOPT_URL, url);
  
      /* send all data to this function  */
      curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
  
      /* we pass our 'chunk' struct to the callback function */
      curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *) &chunk);
  
      curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, PostData);
      /* some servers don't like requests that are made without a user-agent
         field, so we provide one */
      curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, useragent);
      /* get it! */
      res = curl_easy_perform(curl_handle);
  
      /* check for errors */
      if (res != CURLE_OK) {
          fprintf(stderr, "request failed: %s\n",
                  curl_easy_strerror(res));
          free(chunk.memory);
          req.content = NULL;
          return req;
      } else {
          // DATA IS HERE. PASS IT TO WHEREVER YOU WANT
          /* this is the status code*/
          curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &(req.code));
          curl_easy_cleanup(curl_handle);
          curl_global_cleanup();
          req.content = chunk.memory;
          req.size = chunk.size;
          return req;
      }
  }
  