Implementing CURL command using libcurl in C/C++

Bob Gailer bgailer at gmail.com
Fri Dec 13 04:08:02 EST 2019


This list is for Python, not C/C++.

On Dec 13, 2019 3:50 AM, "Karthik Sharma" <karthik.sharma at gmail.com> wrote:

> The `CURL` command that I am using is shown below.
>
>     curl -F 'file=@/home/karthik/Workspace/downloadfile.out'
> http://127.0.0.1:5000/file-upload --verbose
>
> The response from the server is shown below.
>
>     *   Trying 127.0.0.1...
>     * Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0)
>     > POST /file-upload HTTP/1.1
>     > Host: 127.0.0.1:5000
>     > User-Agent: curl/7.47.0
>     > Accept: */*
>     > Content-Length: 663876790
>     > Expect: 100-continue
>     > Content-Type: multipart/form-data; boundary=---------------------
> ---4e96ef0714498bd7
>     >
>     < HTTP/1.1 100 Continue
>     * HTTP 1.0, assume close after body
>     < HTTP/1.0 201 CREATED
>     < Content-Type: application/json
>     < Content-Length: 46
>     < Server: Werkzeug/0.16.0 Python/3.5.2
>     < Date: Sat, 14 Dec 2019 07:05:15 GMT
>     <
>     {
>       "message": "File successfully uploaded"
>     }
>     * Closing connection 0
>
> I want to implement the same command in C/C++ using libcurl. I am using
> the following function.
>
>     int FileUploadDownload::upload(const std::string &filename, const
> std::string &url) {
>
>         CURL *curl;
>         CURLcode res;
>         struct stat file_info;
>         curl_off_t speed_upload, total_time;
>         FILE *fd;
>
>         fd = fopen(filename.c_str(), "rb");
>         if(!fd) {
>             m_logger->errorf("unable to open file: %s\n",strerror(errno));
>             return 1;
>         }
>         if(fstat(fileno(fd), &file_info) != 0) {
>             m_logger->errorf("unable to get file stats:
> %s\n",strerror(errno));
>             return 2;
>         }
>
>         std::cout << "filename : "<< filename << std::endl;
>         std::cout << "url : " << url << std::endl;
>
>         curl = curl_easy_init();
>         if(curl) {
>
>             curl_easy_setopt(curl, CURLOPT_URL,
>                              url.c_str());
>
>             curl_easy_setopt(curl, CURLOPT_POSTFIELDS, filename.c_str());
>             curl_easy_setopt(curl, CURLOPT_POST, 1L);
>             curl_easy_setopt(curl, CURLOPT_READDATA, fd);
>             curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
>                              (curl_off_t) file_info.st_size);
>             curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
>
>             res = curl_easy_perform(curl);
>             if (res != CURLE_OK) {
>                 m_logger->errorf("curl_easy_perform() failed:
> %s\n",curl_easy_strerror(res));
>             } else {
>                 curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD,
> &speed_upload);
>                 curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time);
>                 m_logger->infof("Speed: %" CURL_FORMAT_CURL_OFF_T "
> bytes/sec during %"
>                                 CURL_FORMAT_CURL_OFF_T ".%06ld seconds\n",
>                                 speed_upload,
>                                 (total_time / 1000000), (long) (total_time
> % 1000000));
>             }
>         }
>         return 0;
>     }
> The below is the result that I get from the server.
>
>     The result that I get is shown below.
>        *   Trying 127.0.0.1...
>     * Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0)
>     > POST /file-upload HTTP/1.1
>     > Host: 127.0.0.1:5000
>     > User-Agent: curl/7.47.0
>     > Accept: */*
>     > Content-Length: 550
>     > Expect: 100-continue
>     > Content-Type: multipart/form-data; boundary=---------------------
> ---c8ef4837136fca99
>     >
>     < HTTP/1.1 100 Continue
>     * HTTP 1.0, assume close after body
>     < HTTP/1.0 201 CREATED
>     < Content-Type: application/json
>     < Content-Length: 46
>     < Server: Werkzeug/0.16.0 Python/3.5.2
>     < Date: Sat, 14 Dec 2019 07:09:47 GMT
>     <
>     {
>       "message": "File successfully uploaded"
>     }
>     * Closing connection 0
>
>
> My aim is to mimic the curl command above in the C/C++ code below. What am
> I doing wrong ?
> --
> https://mail.python.org/mailman/listinfo/python-list
>


More information about the Python-list mailing list