Ignore curl response body in c++ - c++

I am doing a post request using CURL in c++ and I wanted to know if theres a way to ignore the response body that gets printed to the output. This is what my code looks like currently
if (curl) {
// Set url
curl_easy_setopt(curl, CURLOPT_URL, str_url);
// Set header
list = curl_slist_append(list, header);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
// Set request type and data
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(body));
res = curl_easy_perform(curl);
everything works but I keep getting the response body posted to the output and I just want to ignore it since all I need is the response code. With the command line I can make a curl request with the following curl --silent --output to ignore it but is there a way to do this in c++?

Related

Umlauts problem when sending Json Post with VS2017 C++ using libcurl

when posting data to zendesk, all of my umlauts are saved as "?" characters.
the same post from the postmann app works fine.
i even copied the whole postman C - libcurl code, compiled and fired it up:
same result, umlauts are shown as questionsmarks.
Whats the difference between postman posting the json and visual studio posting it?
here is the code:
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(curl, CURLOPT_URL, "https://xx.zendesk.com/api/v2/users/create_or_update.json");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "id: 1");
headers = curl_slist_append(headers, "Authorization: Basic eXaMpLe1234");
headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, "Cookie: __cfruid=2c9eb500bc16cc34cd7390604b24ece125e7e8ad-187187187");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
const char *data = "{ \"user\": {\"external_id\": \"160102\", \"name\" : \"TestÜÄÖ\", \"phone\": \"014567-0\", \"user_fields\": { \"anrede\": \"Herr\"}, \"organization\":{\"name\":\"testorg\"}, \"email\" : \"\"} }";
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
res = curl_easy_perform(curl);
}
curl_easy_cleanup(curl);
is there a configuration in VS that i have to do to tell him i want utf-8 encoding when posting data?
"charset utf-8" in header yields the same results
Edit: sending a basic curl with the same data using windows cmd behaves the same and saved umlauts as questionmarks, even tho postman generated that curl statement which works when postman sends it.
for people googling:
the u8 prefix as commented by Botje worked

POST request fails while using libcurl, C++

TEST(ApiTest, TestPostMethod) {
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
std::string url = "https://postman-echo.com/post";
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
struct curl_slist *headers = NULL;
// curl_slist_append(headers, "HOST: postman-echo.com");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
ASSERT_EQ(CURLE_OK, res);
}
}
Error: CURLE_COULDNT_RESOLVE_HOST (6)
When I tested this POST request on postman it worked as expected. Also curl command
curl --location --request POST 'https://postman-echo.com/post'
works fine.
Expected equality of these values:
CURLE_OK
Which is: 0
res
Which is: 6
Run NSLOOKUP as suggested by #Andreas Wenzel
> postman-echo.com
Server: 75.75.75.75
Address: 75.75.75.75#53
Non-authoritative answer:
Name: postman-echo.com
Address: 3.210.84.203
Name: postman-echo.com
Address: 52.22.211.29
https://github.com/alexzk1/ed_highway/blob/master/utils/restclient.cpp
this works for many sites last 3-4 years. you can pick those 2 files only.
It uses CURLOPT_POSTFIELDS for post.
Btw, in your code u're following redirects, are u sure website don't redirect you to non-existing link?
Sorry. I figured this out. My server on which I was run this has restrictions in connecting with outside world. Thanks everyone for looking into this.

libcurl, enabling chunk encoding with multipart form data

What i want to achieve is to be able to upload a file of any size and also send post data in the same request. The server is guaranteed to be able to handle chunked encoding and also support unlimited size of size.
To achieve that I used CURLOPT_HTTPOST and set the header Transfer-Encoding: chunked, The problem is that I'm am not sure if libcurl is actually using chunked encoding at all. In my attempts to try and figure out I set CURLOPT_VERBOSE to 1 and implemented a custom debug callback to monitor the http headers. From curl I can only see 1 HTTP Request and only 1 HTTP Response (code 200). I didn't see any http code 201 responses.
My question is how do I enable chunk encoding for file uploads in multipart POST requests? If what I'm doing is correct why does libcurl not show me all the requests, how do I make sure it works like it is required?
Bellow is a short example of what I am doing in code.
//Assume `curl` has been initialised
struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL;
struct curl_slist *headerlist=NULL;
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME,
"foo",
CURLFORM_COPYCONTENTS,
"bar",
CURLFORM_END);
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME,
"file",
CURLFORM_FILE,
"filepath",
CURLFORM_FILENAME,
"filename",
CURLFORM_END);
headerlist = curl_slist_append(headerlist, "Transfer-Encoding: chunked");
curl_easy_setopt(curl, CURLOPT_URL, "https://foo/uploadfile");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write_to_string);
curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, curl_progress_cb);
curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &progress_id);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1);
CURLcode res = curl_easy_perform(curl);
Thanks in advance

Send Custom String with cURL in Qt C++

i use the cURL Library for send and login users to my application and server and use POST method in cURL. but i want to send custom and get input from user and send to the server and response but seem's error. my source below (the username and password is defined string):
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "Username=" + username + "&Password=" + password);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
But this do not work. Only agree with this sample pattern:
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "Username=sina&Password=12781278");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

libcurl specifying the header

I am currently using pre-compiled minGW32 libraries for libcurl-7.21.6, C++, QT libraries, minGW32 windows compiler (in QT creator) and QT creator as my IDE.
I am trying to post some http information but keep running into a problem. I need to remove Expect: 100... from my header. From everything i have seen online,
headerlist = curl_slist_append(headerlist, "Expect:");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
should do it, but it seems to get nullified by:
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
If i call the HTTPPOST before the HTTPHEADER, it seems like the HTTPHEADER nullifies everything from the HTTPPOST, and vice versa.
Am I doing something wrong? Should the Expect: be somehow included in the HTTPPOST instead of separately in HTTPHEADER?
I am trying to get rid of the Expect header because the server keeps responding to my request with Expectation Failed.
Here is the curl command used with curl.exe to do the samething i'm trying to do with libcurl:
system("curl --referer http://192.168.16.23/upthefile.html -F uploadfile=#instructions.xml -F config=on http://192.168.16.23/cgi-bin/upload.cgi -H \"Expect:\">nul");
Any help will be appreciated.
Using cURL 7.25.0 and this snippet:
curl_global_init(CURL_GLOBAL_ALL);
struct curl_httppost *formpost = NULL;
struct curl_httppost *lastptr = NULL;
struct curl_slist *headerlist = curl_slist_append(NULL, "Expect:");
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "field", CURLFORM_COPYCONTENTS, "value", CURLFORM_END);
CURL *curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
CURLcode res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
curl_formfree(formpost);
curl_slist_free_all(headerlist);
}
I obtain the following request (Wireshark'd):
POST / HTTP/1.1
Host: www.example.com
Accept: */*
Content-Length: 145
Content-Type: multipart/form-data; boundary=----------------------------523d686b5061
------------------------------523d686b5061
Content-Disposition: form-data; name="field"
value
------------------------------523d686b5061--
While omitting the line curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); the header contains also:
HTTP/1.1 100 Continue