Buy commercial curl support from WolfSSL. We help you work
out your issues, debug your libcurl applications, use the API, port to new
platforms, add new features and more. With a team lead by the curl founder
himself.
Re: curl post fails.
- Contemporary messages sorted: [ by date ] [ by thread ] [ by subject ] [ by author ] [ by messages with attachments ]
From: jian he via curl-library <curl-library_at_lists.haxx.se>
Date: Tue, 4 Oct 2022 13:08:48 +0530
Hi.
On Tue, Oct 4, 2022 at 12:13 PM jian he <jian.universality_at_gmail.com> wrote:
> Hi.
>
>
> On Mon, Oct 3, 2022 at 3:31 AM Ray Satiro via curl-library <
> curl-library_at_lists.haxx.se> wrote:
>
>> On 10/2/2022 2:09 PM, jian he via curl-library wrote:
>>
>> Follow this url (https://www.backblaze.com/b2/docs/b2_upload_file.html)
>> The command line way will work.
>>
>>> FILE_TO_UPLOAD=/home/jian/helloc/curl_1.c
>>> MIME_TYPE=text/plain
>>> SHA1_OF_FILE=$(openssl dgst -sha1 $FILE_TO_UPLOAD | awk '{print $2;}')
>>> UPLOAD_URL=
>>> https://pod-040-2009-17.backblaze.com/b2api/v2/b2_upload_file/daed35e922928ea38f340519/c004_v0402009_t0052
>>>
>>> UPLOAD_AUTHORIZATION_TOKEN="4_004ad5922e3f4590000000000_01a7620b_106677_upld_sg7Wnh52ocxqngTkjBLSfzE_ZzM="
>>> curl \
>>> -v \
>>> -H "Authorization: $UPLOAD_AUTHORIZATION_TOKEN" \
>>> -H "X-Bz-File-Name: $FILE_TO_UPLOAD" \
>>> -H "Content-Type: $MIME_TYPE" \
>>> -H "X-Bz-Content-Sha1: $SHA1_OF_FILE" \
>>> -H "X-Bz-Info-Author: unknown" \
>>> -H "X-Bz-Server-Side-Encryption: AES256" \
>>> --data-binary "_at_$FILE_TO_UPLOAD" \
>>> $UPLOAD_URL
>>>
>>
>> I am trying to write it in libcurl. Then it fails.
>> /*
>> gcc -Wall -Wextra -pedantic -Wshadow -Ofast curl_upload.c -lcurl &&./a.out
>> valgrind ./a.out
>> openssl dgst -sha1 "/home/jian/helloc/curl_stmp1.c" | awk '{print $2;}'
>> 03cc73740b9672c51a0cfe1b382c11bbb6a706c7
>> */
>> #include <stdio.h>
>> #include <curl/curl.h>
>> #include <string.h>
>> #include <stdlib.h>
>> #include <errno.h>
>> #include <sys/stat.h>
>> #include<stdlib.h>
>> const char access_token[] =
>> "4_004ad5922e3f4590000000000_01a7620b_106677_upld_sg7Wnh52ocxqngTkjBLSfzE_ZzM=";
>> const char upload_url[] = "
>> https://pod-040-2009-17.backblaze.com/b2api/v2/b2_upload_file/daed35e922928ea38f340519/c004_v0402009_t0052
>> ";
>> const char buckId[] = "daed35e922928ea38f340519";
>> int main(void)
>> {
>> // unsigned char buffer[BUFSIZ];
>> CURL *curl_handle = curl_easy_init();
>> struct stat file_info;
>> char *filename = "curl_1.c";
>> char *path = realpath(filename,NULL);
>> stat(filename,&file_info);
>>
>> printf("%s file size is %zu bytes\n",path,file_info.st_size);
>> FILE *fp = fopen(path,"rb");
>> if(fp == NULL){
>> perror("failed");
>> return 1;
>> }
>>
>> struct curl_slist *chunk = NULL;
>> chunk = curl_slist_append(chunk,"Content-Type: text/plain");
>> chunk = curl_slist_append(chunk,"X-Bz-File-Name:
>> /home/jian/helloc/curl_1.c");
>> chunk = curl_slist_append(chunk,"Content-Length: 799");
>> chunk = curl_slist_append(chunk,"Content-Length: 799");
>> chunk = curl_slist_append(chunk,"X-Bz-Server-Side-Encryption:
>> AES256");
>> chunk = curl_slist_append(chunk,"X-Bz-Content-Sha1:
>> 4ce3ebcd1ac59818d2884b4e96123b794ba69c4c");
>> chunk = curl_slist_append(chunk,"X-Bz-Info-Author: unknown");
>>
>> /* Content-Length: [NUMBER_OF_BYTES_IN_FILE] */
>> char size[200];
>> snprintf(size,200,"Content-Length: %lld",(long long
>> int)file_info.st_size);
>> printf("size=%s\n",size);
>>
>> char auth[300];
>> strcat(auth,"Authorization: ");
>> strcat(auth,access_token);
>> printf("auth:%s\n\n\n",auth);
>> chunk = curl_slist_append(chunk,auth);
>> curl_easy_setopt(curl_handle,CURLOPT_VERBOSE,1L);
>> curl_easy_setopt(curl_handle,CURLOPT_HTTPHEADER,chunk);
>> curl_easy_setopt(curl_handle, CURLOPT_HTTP_VERSION,
>> CURL_HTTP_VERSION_1_1);
>> curl_easy_setopt(curl_handle,CURLOPT_URL,upload_url);
>> curl_easy_setopt(curl_handle,CURLOPT_POST,1L);
>> curl_easy_setopt(curl_handle,CURLOPT_READDATA,fp);
>> CURLcode res = curl_easy_perform(curl_handle);
>> if(res != CURLE_OK){
>> fprintf(stderr,"curl_easy_perform() failed:
>> %s\n",curl_easy_strerror(res));
>> }else{
>> printf("\n\nSuccess\n");
>> }
>> curl_easy_cleanup(curl_handle);
>> return 0;
>> }
>>
>> The verbose message:
>>
>>> /home/jian/helloc/curl_1.c file size is 759 bytes
>>> size=Content-Length: 759
>>> auth:Authorization:
>>> 4_004ad5922e3f4590000000000_01a7620b_106677_upld_sg7Wnh52ocxqngTkjBLSfzE_ZzM=
>>>
>>>
>>> * Trying 149.137.133.93:443...
>>> * Connected to pod-040-2009-17.backblaze.com (149.137.133.93) port 443
>>> (#0)
>>> * found 384 certificates in /etc/ssl/certs
>>> * GnuTLS ciphers: NORMAL:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509:-VERS-SSL3.0
>>> * ALPN, offering http/1.1
>>> * SSL connection using TLS1.3 / ECDHE_RSA_AES_128_GCM_SHA256
>>> * server certificate verification OK
>>> * server certificate status verification SKIPPED
>>> * common name: backblaze.com (matched)
>>> * server certificate expiration date OK
>>> * server certificate activation date OK
>>> * certificate public key: RSA
>>> * certificate version: #3
>>> * subject: CN=backblaze.com
>>> * start date: Mon, 26 Sep 2022 21:40:41 GMT
>>> * expire date: Sun, 25 Dec 2022 21:40:40 GMT
>>> * issuer: C=US,O=Let's Encrypt,CN=R3
>>> * ALPN, server did not agree to a protocol
>>> > POST
>>> /b2api/v2/b2_upload_file/daed35e922928ea38f340519/c004_v0402009_t0052
>>> HTTP/1.1
>>> Host: pod-040-2009-17.backblaze.com
>>> Accept: */*
>>> Transfer-Encoding: chunked
>>> Content-Type: text/plain
>>> X-Bz-File-Name: /home/jian/helloc/curl_1.c
>>> Content-Length: 799
>>> Content-Length: 799
>>> X-Bz-Server-Side-Encryption: AES256
>>> X-Bz-Content-Sha1: 4ce3ebcd1ac59818d2884b4e96123b794ba69c4c
>>> X-Bz-Info-Author: unknown
>>> Authorization:
>>> 4_004ad5922e3f4590000000000_01a7620b_106677_upld_sg7Wnh52ocxqngTkjBLSfzE_ZzM=
>>> Expect: 100-continue
>>>
>>> * Mark bundle as not supporting multiuse
>>> < HTTP/1.1 400
>>> < Content-Type: text/html;charset=utf-8
>>> < Content-Language: en
>>> < Content-Length: 435
>>> < Date: Sun, 02 Oct 2022 18:02:23 GMT
>>> < Connection: close
>>> <
>>> * Closing connection 0
>>> <!doctype html><html lang="en"><head><title>HTTP Status 400 – Bad
>>> Request</title><style type="text/css">body
>>> {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b
>>> {color:white;background-color:#525D76;} h1 {font-size:22px;} h2
>>> {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;}
>>> .line
>>> {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP
>>> Status 400 – Bad Request</h1></body></html>
>>>
>>> Success
>>>
>>
>> I am not so sure why it failed.
>> Interesting part: if I only have one chunk =
>> curl_slist_append(chunk,"Content-Length: 799");
>> then it will fail error message is like:
>> {
>> "code": "bad_request",
>> "message": "Missing header: Content-Length",
>> "status": 400
>> * Closing connection 0
>> }
>>
>> If I have two lines chunk = curl_slist_append(chunk,"Content-Length:
>> 799"); then it will fail because of Bad Request.
>> Why did I set Length to 799? 759 + 40 = 799.
>> In the doc: https://www.backblaze.com/b2/docs/b2_upload_file.html aout
>> Content length:
>>
>>> The number of bytes in the file being uploaded. Note that this header is
>>> required; you cannot leave it out and just use chunked encoding.
>>> When sending the SHA1 checksum at the end, the Content-Length should be
>>> set to the size of the file plus the 40 bytes of hex checksum.
>>>
>>
>> Since the only message is "HTTP Status 400 – Bad Request" then I don't
>> know how to debug it any more...
>>
>>
>> You can use curl option --libcurl [1] to get the source code equivalent.
>> That will show you that CURLOPT_POSTFIELDS and CURLOPT_POSTFIELDSIZE_LARGE
>> are used to respectively set the already read in data and its size.
>>
>> In your example you have chosen instead to use CURLOPT_POST [2] and
>> CURLOPT_READDATA to read the data from a file. That's fine, however you
>> should also set CURLOPT_SEEKFUNCTION [3] (basically forward to fseek; read
>> the doc for pitfalls) and CURLOPT_SEEKDATA to the same pointer as READDATA.
>> That way if the first post request fails (like, authentication required)
>> the file can be properly rewound and read again from the beginning.
>>
>> Your example also sets the content length header twice, but it should not
>> do that even once. By using the read function you are by default sending
>> data using chunked encoding, and then you are adding the content length
>> header. The bad request looks like this:
>>
>> Transfer-Encoding: chunked
>> Content-Type: text/plain
>> X-Bz-File-Name: /home/jian/helloc/curl_1.c
>> Content-Length: 799
>> Content-Length: 799
>>
>> You could set CURLOPT_POSTFIELDSIZE_LARGE to set the content length
>> instead of using chunked encoding. These are things you need to review the
>> documentation for, review the links at the bottom of this e-mail.
>>
>> There are other problems with your example. You are not checking the
>> return code of stat and you are concatenating to an uninitialized string
>> auth[] which will likely cause memory corruption.
>>
>>
>> [1]: https://curl.se/docs/manpage.html#--libcurl
>> [2]: https://curl.se/libcurl/c/CURLOPT_POST.html
>> [3]: https://curl.se/libcurl/c/CURLOPT_SEEKFUNCTION.html
>>
>> --
>> Unsubscribe: https://lists.haxx.se/listinfo/curl-library
>> Etiquette: https://curl.se/mail/etiquette.html
>>
>
>
> Thanks for the command line --libcurl trick. By following through example
> code, the CURLOPT_POSTFIELDS option is easier to understand compared to
> CURLOPT_READDATA.
>
> How does the curl command line encode the PNG file data to (char
> *postdata) [0]?
>
>
> [0]: https://curl.se/libcurl/c/CURLOPT_POSTFIELDS.html
>
> --
> I recommend David Deutsch's <<The Beginning of Infinity>>
>
> Jian
>
>
>
If the file is text, then all things would be pretty easy. However, if I
upload a png file, Then the auto generated c code will not build and run
again.
The following code is generated by curl. It cannot recompile and run again.
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
* https://curl.se/libcurl/c/curl_easy_setopt.html\
*
*
gcc testcurl_elephant.c -lcurl &&./a.out
************************************************************************/
#include <curl/curl.h>
int main(int argc, char *argv[])
{
CURLcode ret;
CURL *hnd;
struct curl_slist *slist1;
slist1 = NULL;
slist1 = curl_slist_append(slist1, "Authorization:
4_004ad5922e3f4590000000002_01a7683f_d87468_upld_MYVQlhLtt7es6KyLq72D4HEBH9U=");
slist1 = curl_slist_append(slist1, "X-Bz-File-Name:
/home/jian/helloc/elephant.png");
slist1 = curl_slist_append(slist1, "Content-Type: image/png");
slist1 = curl_slist_append(slist1, "X-Bz-Content-Sha1:
037a513d56d029729e044d6a8e68e68025aaf0c2");
slist1 = curl_slist_append(slist1, "X-Bz-Info-Author: unknown");
slist1 = curl_slist_append(slist1, "X-Bz-Server-Side-Encryption: AES256");
hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "
https://pod-040-2001-00.backblaze.com/b2api/v2/b2_upload_file/daed35e922928ea38f340519/c004_v0402001_t0049
");
curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(hnd, CURLOPT_POSTFIELDS,
"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\x1c\x00\x00\x02-\x08\x06\x00\x00\x00r\xd8\xa3t\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x00\x07tIME\x07\xd8\x01\x10\x13\x12\x01NS\x17\xa1\x00\x00
\x00IDATx\x9c\xec\x9dwxT\xd7\xb5\xb7\xdf\x19\xf5Q\xef\x12*HBB\x08$z\x11\x180`\xb01`p\x89\xe3\xb8&N\x9c8q\x8b\x9d\x1b\xdf\xf8\xe6\xc6I\xae\xd3\x9c\xd8\x9f\xe3\xc45\x89\xe3\xb8\xe2\x82\xc1\xd8\xc6t\xd3\xab\xa8\x12\xea\xa0\x82z\xaf\xa3\xae\x99\xf9\xfe8\x801H
\x9d}F3\x1a\xed\xf7y\xe6\xd1
\xcd^{\x01\x9a3\xbf\xb3\xf6*:$\x12\x89D2\x9c\t\x06B\x01\x7f
\xa0\x8f\x87\x01\xf0\x00\xbc\x01\x17\xc0\x0fp\x05<\x07\xb9\x8f\x05h:\xf7\xbc\x190\x03m_at_
;\xd0\x004\xf6\xf1\xb5\x1e(\x01\x8c\xaa\xfef\x12\x87Bgk\x07$\x12\x89D\xd2/\xc1_at_\xcc\xb9G,\x10\x05D\xa2\x08\x8c\xf3_]m\xe4\xdb`h\x01J\x81\xb2\x8b\x1e%\xc0i
\x17\xa8\xb5\x9dk\x92\xa1B\n\x0e\x89D\"\xb1-\xbe_at_\xe2\xb9\xc7\xb8s_\x13\x801\x0c>\n1\\i\x00\xf2\x81\x1c
\xef\xdc\xf3\x0c\xa0\x10%\xb2\"q\x00\xa4\xe0\x90H$\x92\xa1A\x07\xc4\x01S\x80\xc9\xe7\x1e)_at_\xb4-\x9d\xb2sZ\x80t\xe0\xe4\xb9\xc7Q
\x1b\xe8\xb5\xa5S\x12uH\xc1!\x91H$\xda\xe3\x02\x8cG\x11\x17SQ\xc4\xc5$\xc0\xc7\x96N9\x08\x1d(\xe2\xe3\x18\x8a\x009\x8ar,c\xb2\xa5S\x92\xab#\x05\x87D\"\x91\x88\xe1\x0cL\x03f\xf2u\xe4\"\x99\xe1\x91[\xe1(\x18\x81}\xc0\x0e`\x17p\x1c)_at_\xec\x0e)8$\x12I\x7f\x04\xa3\x84\xfb#\x810
\xe8\xdc#\xf0\xdcW\x03\xe0u\xee\xab\x1bJ\xf5\x833W\xbf\x8boA\t\x897\x9d\xfb\xda\nt\xa2\xdc\xb9\x1a\x81\x9es?\xeb8\xf7\xb3Z\xa0\xee\xdc\xa3\xea\xa2\xe7]\x9a\xfc-\x07\x8f7\x90\n\xcc\x05\xe6\xa1\x08\x8d\x91\x92k1\\h\x01v\x03;Q\x04H:JU\x8d\xc4\x86H\xc1\xe1\x18\x18P>\x1c|QB\xb9\xfas\xcfA)\x87s?\xf7\xdc\x8f\xbe\xff\xcf\xdb\x80n\x94;\x82\x96s\xdf;\x7f\xe1?\xff\x81\xd0\x82\x92\xd8%\xdf\xb4\x8e\x85?\x90\x84\x12\xfe\x1fw\xeek\xcc\xb9\x87\x87\xcd\xbc\x1a\x18\xad|S\x80T\x01gQ\x12\r\x8b\xce=\xaa5\xd8\xc7\x0b\xb8\x0eX\x88\"2&\x03N\x1a\xd8\x95\x0c\x1d\x95\xc0\xe7\xc0z\x14\x11b+\xb1:\xa2\x91\x82\xc3\xbe\tBI2\x1b\x83R\xfe\x16r\xeek\xf0\xb9G\xd8\xb9\xafCywU\x8f\"<\xea\xfbx~\xbe\xec\xad\xe4\xdc\xf3\xce!\xf4Kru\xe2\xf8:\x9f\xe0\xfc#\xc2\xa6\x1eY\x9f6\xa0\x98\xafEH\xe1\xb9?\xe7\x9d{\xde\xdd\xc7\x1a=\xca\xbf\xd3\x12`)0\x07%r#q\x0cZ\x81\xcd\xc0\xa7\xc0&\xbe\xee-\"\xb12Rp\xd8\x1e\x1dJ}}20\x01\x98\x08\x8cE\x11\x19\xbeWX7\x1c\xa8A\x11\x1e\xa5(\"\xa4\x04\xe5B\x9f\x87r\xf1\x97\x99\xe6\xd6#\x08%\xdc?\x03%\xbf`\x06J4C\xf25\xbd(\xa2#\x03\xa5\x0cs\x14\xca\xfbn\x1c\x8a\x90\x978>=(\x11\x8fw\x80u(\xc7x\x12+!\x05\xc7\xd0\xe2\x86R\x06wqY\xdcD\x94\x90\xedH\xa3\x1b\xe5b\x9f\x83r\xb1\xcfG\xc94\xcfF\xdeq\xa8!\x00%\xec\x7f-\xb0\x00\xe5hD\xbe\xbf%\x92\x81\xd3\x0c|\x82\">\xf6\"\xfb\x7fh\x8e\xbc
Y\x97x\x94p\xec\xccs\x8fI\xc8\xcc\xf5\x81P\x84R\xf6\x96\x8er\xf7y\xf2\xdc\xf7$\xdf$\x05X\x01\xdc\x88\xf2{&\xf3\n$\x12m(\x00\xde>\xf7(\xb1\xb1/\x0e\x83\x14\x1c\xda2\x1a%\xb1l!\xb0\x08%\xbb_\xa2\rM|\xdd\xfc\xe7\xbc\x10\xc9\xa4\xef3xGf\x12\xf0m\xe0\x0e\x94\xf0\xbfD\"\xb1\x1ef\x94R\xdb\xb7P\xa2\x1f2\xd9T\x00)8\xc4\xd0\xa3\x94\xc7\xdd\x84r\xa7\x99l[wF\x1c=_at_\x16\x90\x06\x1c\x06\x0e\xa1\x1c\xcb8Z%\xcd(\xe0~\xe0\x1e\x94\xfc\x02\x89D2\xf44\x00\xab\x81WQ\x8e\x82%\x83D\n\x8e\xc1\xa3GI\xc6\xbb\x0b\xb8\x05\x99\\fo4\xa3\x08\x90C|-B\xeam\xea\x91:\\\x80e\xc0\x8f\x80\x1b\x90\xc7%\x12\rqqq\xc1\xcbKI\x1d\xf3\xf1\xf1\xc1\xc9\xe9\xca\xbf^\xcd\xcd\xcd\xf4\xf6\xf6\xd2\xdc\xdc<\x14\xee\xd9;\x16`\x0b\xf0W`\x1b2\xd7c\xc0H\xc11pR\x80\xfb\x80\xef
\x8fJ\x86\x13\x16\x94(\xc8.`\xcf\xb9\x87\x16\xbd\x19\xac\xc58\xe0{(\x11\x8d\x10\xdb\xba\"\xb1gt:\x1d!!!\x84\x84\x84\x10\x16\x16Fhh(!!!\x84\x87\x87\xe3\xef\xef\x8f\xaf\xaf/~~~\xf8\xf9\xf9\xe1\xeb\xeb{\xe1\xcf\xae\xaebidF\xa3\x91\xf6\xf6v\x8cF#\xcd\xcd\xcd\xb4\xb7\xb7\xd3\xd0\xd0_at_MM\r\x95\x95\x95\xd4\xd6\xd6R[[Kee\xe5\x85\xef566j\xf4\xb7\xb6;\xb2\x80\xbf\x01\xef\"\xdb\x00\\\x15)8\xae\x8c/J$\xe3\x07(\xa5\x85\x12\xc7
\x07\xa5\x0b\xe1\x1e\xe0+\x94\xf2][\xe2\x0c\xdc\x06<\x84\x12=\x93\xefK\tz\xbd\x9e\xe8\xe8h\x12\x12\x12\x18=z4\xd1\xd1\xd1\xc4\xc4\xc4\\x\x1e\x11\x11\x81\x8b\x8b\x8b\xad\xdd\x1c\x10MMM\x14\x16\x16RXXHQQ\xd1\x85\xe7\x85\x85\x85\x14\x17\x17\xd3\xdb;\xec+\xe4\xeb\x80\xd7\x81\x97\xb1\xef\x1b\x1a\x9b\"/l}3\x07x\x10\xb8\x1d\xfb\xef\xb6(\x11\xc3\x82\x92\x88\xba\x1d\xd8\x8a2\x8fa\xa8\xeeT\xfcP\x8eL\x1e\x01\xa2\x86hO\x89\x9d\x11\x18\x18Hbb\"\xe3\xc6\x8dc\xec\xd8\xb1$$$\\\xf8\xea\xe6\xe6fk\xf7\xacNww7\x05\x05\x05dee\x91\x91\x91\xc1\xa9S\xa7HOO\xa7\xb8\xb8\x18\x8be\xd8\x9dVt\x00\xaf\x00\x7fF\x11!\x92\x8b\x90\x82\xe3k|\x80\xbbQ\x84\xc6$\x1b\xfb\"\xb1\x1d\x1d(5\xf8[\x81/Q\x92P\xb5&\x04x\x12\xf8\tr\x06\xc7\x88\xc1\xdd\xdd\x9d\xe4\xe4dRRR\xbe\xf15<<\xdc\xd6\xae\xd9%---\x9c:u\x8aS\xa7Nq\xf2\xe4I\x8e\x1e=Jzz\xfap\x89\x86\x18\x81\x17\x81\xff\x87\xec+t\x01)8\x94\n\x80'P\x84\x86\xb7\x8d}\x91\xd8\x1fgP\x84\xc7\x97(\xc70\"e\xb8a\xc0\x7f\xa3\xfc\xae\x19\xc4]\x93\xd8+z\xbd\x9e\xa4\xa4$f\xce\x9c\xc9\x8c\x193\x989s&\x13'N\x1c6G
\xf6\x8a\xd1h\xe4\xd0\xa1C\x1c8p\x80\xbd{\xf7r\xf8\xf0aZ[[m\xed\xd6\x95hB\x11\x1d/\xa2\x88\x90\x11\xcdH\x16\x1ccQ.\xfe\xf7\"\x9bqI\x06\x86\x91\xafg0l\xe0\xebAwW\xc3\x0bx\n\xf8)\x0e\xd8U\xd6\xd3\xd3\x13www|}}1\x18\x0cW<\x06hii\xc1d2\xd1\xda\xdaJoo/F\xa3\x91\x9e\x9e\x9e!\xf4\xd6:\x8c\x1a5\x8a\xd9\xb3g3k\xd6,f\xcc\x98\xc1\xb4i\xd3\xf0\xf6\x96\xf7/\xd6\xc6d2q\xf2\xe4I\xf6\xef\xdf\xcf\x96-[\xd8\xb5k\x17\xed\xed\xed\xb6v\xab/\xea\x80?\xa1\xe4x\x8c\xb4\xdeA\x17\x18\x89\x82#\x1a\xf8?\x94\x8a\x13\xbd\x8d}\x91\x0c_\xbaP\x8e]\xd6\xa2L\xa1\xec+\r\xdf\x19%G\xe3\xd7(C\xf7\x86\r\xae\xae\xaeDGG\x13\x17\x17GLL\x0cQQQ\x84\x87\x87\x13\x1c\x1cLpp0!!!\x04\x07\x07\xe3\xe3s\xb5I\xf4W\xa7\xbd\xbd\x9d\xa6\xa6&\x9a\x9a\x9ahll\xa4\xa9\xa9\x89\xba\xba:***\xa8\xaa\xaa\xa2\xaa\xaa\x8a\xca\xcaJ***(--\xa5\xbb\xdb\xf6\xd7\xeb\xd0\xd0P\x16,X\xc0\xc2\x85\x0bY\xb8p!c\xc7\x8e\xb5\xb5K\x12\xa0\xb3\xb3\x93\x9d;w\xb2q\xe3F6m\xdaDAA\x81\xad]\xba\x94\\\xe01\x94r\xda\x11\xc7H\x12\x1cA\xc0/Q*\x01...");
curl_easy_setopt(hnd, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)50279);
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, slist1);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.81.0");
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS);
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
/* Here is a list of options the curl code used that cannot get generated
as source easily. You may choose to either not use them or implement
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
CURLOPT_SEEKDATA set to a objectpointer
CURLOPT_SEEKFUNCTION set to a functionpointer
CURLOPT_ERRORBUFFER set to a objectpointer
CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/
ret = curl_easy_perform(hnd);
curl_easy_cleanup(hnd);
hnd = NULL;
curl_slist_free_all(slist1);
slist1 = NULL;
return (int)ret;
}
/**** End of sample code ****/
Date: Tue, 4 Oct 2022 13:08:48 +0530
Hi.
On Tue, Oct 4, 2022 at 12:13 PM jian he <jian.universality_at_gmail.com> wrote:
> Hi.
>
>
> On Mon, Oct 3, 2022 at 3:31 AM Ray Satiro via curl-library <
> curl-library_at_lists.haxx.se> wrote:
>
>> On 10/2/2022 2:09 PM, jian he via curl-library wrote:
>>
>> Follow this url (https://www.backblaze.com/b2/docs/b2_upload_file.html)
>> The command line way will work.
>>
>>> FILE_TO_UPLOAD=/home/jian/helloc/curl_1.c
>>> MIME_TYPE=text/plain
>>> SHA1_OF_FILE=$(openssl dgst -sha1 $FILE_TO_UPLOAD | awk '{print $2;}')
>>> UPLOAD_URL=
>>> https://pod-040-2009-17.backblaze.com/b2api/v2/b2_upload_file/daed35e922928ea38f340519/c004_v0402009_t0052
>>>
>>> UPLOAD_AUTHORIZATION_TOKEN="4_004ad5922e3f4590000000000_01a7620b_106677_upld_sg7Wnh52ocxqngTkjBLSfzE_ZzM="
>>> curl \
>>> -v \
>>> -H "Authorization: $UPLOAD_AUTHORIZATION_TOKEN" \
>>> -H "X-Bz-File-Name: $FILE_TO_UPLOAD" \
>>> -H "Content-Type: $MIME_TYPE" \
>>> -H "X-Bz-Content-Sha1: $SHA1_OF_FILE" \
>>> -H "X-Bz-Info-Author: unknown" \
>>> -H "X-Bz-Server-Side-Encryption: AES256" \
>>> --data-binary "_at_$FILE_TO_UPLOAD" \
>>> $UPLOAD_URL
>>>
>>
>> I am trying to write it in libcurl. Then it fails.
>> /*
>> gcc -Wall -Wextra -pedantic -Wshadow -Ofast curl_upload.c -lcurl &&./a.out
>> valgrind ./a.out
>> openssl dgst -sha1 "/home/jian/helloc/curl_stmp1.c" | awk '{print $2;}'
>> 03cc73740b9672c51a0cfe1b382c11bbb6a706c7
>> */
>> #include <stdio.h>
>> #include <curl/curl.h>
>> #include <string.h>
>> #include <stdlib.h>
>> #include <errno.h>
>> #include <sys/stat.h>
>> #include<stdlib.h>
>> const char access_token[] =
>> "4_004ad5922e3f4590000000000_01a7620b_106677_upld_sg7Wnh52ocxqngTkjBLSfzE_ZzM=";
>> const char upload_url[] = "
>> https://pod-040-2009-17.backblaze.com/b2api/v2/b2_upload_file/daed35e922928ea38f340519/c004_v0402009_t0052
>> ";
>> const char buckId[] = "daed35e922928ea38f340519";
>> int main(void)
>> {
>> // unsigned char buffer[BUFSIZ];
>> CURL *curl_handle = curl_easy_init();
>> struct stat file_info;
>> char *filename = "curl_1.c";
>> char *path = realpath(filename,NULL);
>> stat(filename,&file_info);
>>
>> printf("%s file size is %zu bytes\n",path,file_info.st_size);
>> FILE *fp = fopen(path,"rb");
>> if(fp == NULL){
>> perror("failed");
>> return 1;
>> }
>>
>> struct curl_slist *chunk = NULL;
>> chunk = curl_slist_append(chunk,"Content-Type: text/plain");
>> chunk = curl_slist_append(chunk,"X-Bz-File-Name:
>> /home/jian/helloc/curl_1.c");
>> chunk = curl_slist_append(chunk,"Content-Length: 799");
>> chunk = curl_slist_append(chunk,"Content-Length: 799");
>> chunk = curl_slist_append(chunk,"X-Bz-Server-Side-Encryption:
>> AES256");
>> chunk = curl_slist_append(chunk,"X-Bz-Content-Sha1:
>> 4ce3ebcd1ac59818d2884b4e96123b794ba69c4c");
>> chunk = curl_slist_append(chunk,"X-Bz-Info-Author: unknown");
>>
>> /* Content-Length: [NUMBER_OF_BYTES_IN_FILE] */
>> char size[200];
>> snprintf(size,200,"Content-Length: %lld",(long long
>> int)file_info.st_size);
>> printf("size=%s\n",size);
>>
>> char auth[300];
>> strcat(auth,"Authorization: ");
>> strcat(auth,access_token);
>> printf("auth:%s\n\n\n",auth);
>> chunk = curl_slist_append(chunk,auth);
>> curl_easy_setopt(curl_handle,CURLOPT_VERBOSE,1L);
>> curl_easy_setopt(curl_handle,CURLOPT_HTTPHEADER,chunk);
>> curl_easy_setopt(curl_handle, CURLOPT_HTTP_VERSION,
>> CURL_HTTP_VERSION_1_1);
>> curl_easy_setopt(curl_handle,CURLOPT_URL,upload_url);
>> curl_easy_setopt(curl_handle,CURLOPT_POST,1L);
>> curl_easy_setopt(curl_handle,CURLOPT_READDATA,fp);
>> CURLcode res = curl_easy_perform(curl_handle);
>> if(res != CURLE_OK){
>> fprintf(stderr,"curl_easy_perform() failed:
>> %s\n",curl_easy_strerror(res));
>> }else{
>> printf("\n\nSuccess\n");
>> }
>> curl_easy_cleanup(curl_handle);
>> return 0;
>> }
>>
>> The verbose message:
>>
>>> /home/jian/helloc/curl_1.c file size is 759 bytes
>>> size=Content-Length: 759
>>> auth:Authorization:
>>> 4_004ad5922e3f4590000000000_01a7620b_106677_upld_sg7Wnh52ocxqngTkjBLSfzE_ZzM=
>>>
>>>
>>> * Trying 149.137.133.93:443...
>>> * Connected to pod-040-2009-17.backblaze.com (149.137.133.93) port 443
>>> (#0)
>>> * found 384 certificates in /etc/ssl/certs
>>> * GnuTLS ciphers: NORMAL:-ARCFOUR-128:-CTYPE-ALL:+CTYPE-X509:-VERS-SSL3.0
>>> * ALPN, offering http/1.1
>>> * SSL connection using TLS1.3 / ECDHE_RSA_AES_128_GCM_SHA256
>>> * server certificate verification OK
>>> * server certificate status verification SKIPPED
>>> * common name: backblaze.com (matched)
>>> * server certificate expiration date OK
>>> * server certificate activation date OK
>>> * certificate public key: RSA
>>> * certificate version: #3
>>> * subject: CN=backblaze.com
>>> * start date: Mon, 26 Sep 2022 21:40:41 GMT
>>> * expire date: Sun, 25 Dec 2022 21:40:40 GMT
>>> * issuer: C=US,O=Let's Encrypt,CN=R3
>>> * ALPN, server did not agree to a protocol
>>> > POST
>>> /b2api/v2/b2_upload_file/daed35e922928ea38f340519/c004_v0402009_t0052
>>> HTTP/1.1
>>> Host: pod-040-2009-17.backblaze.com
>>> Accept: */*
>>> Transfer-Encoding: chunked
>>> Content-Type: text/plain
>>> X-Bz-File-Name: /home/jian/helloc/curl_1.c
>>> Content-Length: 799
>>> Content-Length: 799
>>> X-Bz-Server-Side-Encryption: AES256
>>> X-Bz-Content-Sha1: 4ce3ebcd1ac59818d2884b4e96123b794ba69c4c
>>> X-Bz-Info-Author: unknown
>>> Authorization:
>>> 4_004ad5922e3f4590000000000_01a7620b_106677_upld_sg7Wnh52ocxqngTkjBLSfzE_ZzM=
>>> Expect: 100-continue
>>>
>>> * Mark bundle as not supporting multiuse
>>> < HTTP/1.1 400
>>> < Content-Type: text/html;charset=utf-8
>>> < Content-Language: en
>>> < Content-Length: 435
>>> < Date: Sun, 02 Oct 2022 18:02:23 GMT
>>> < Connection: close
>>> <
>>> * Closing connection 0
>>> <!doctype html><html lang="en"><head><title>HTTP Status 400 – Bad
>>> Request</title><style type="text/css">body
>>> {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b
>>> {color:white;background-color:#525D76;} h1 {font-size:22px;} h2
>>> {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;}
>>> .line
>>> {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP
>>> Status 400 – Bad Request</h1></body></html>
>>>
>>> Success
>>>
>>
>> I am not so sure why it failed.
>> Interesting part: if I only have one chunk =
>> curl_slist_append(chunk,"Content-Length: 799");
>> then it will fail error message is like:
>> {
>> "code": "bad_request",
>> "message": "Missing header: Content-Length",
>> "status": 400
>> * Closing connection 0
>> }
>>
>> If I have two lines chunk = curl_slist_append(chunk,"Content-Length:
>> 799"); then it will fail because of Bad Request.
>> Why did I set Length to 799? 759 + 40 = 799.
>> In the doc: https://www.backblaze.com/b2/docs/b2_upload_file.html aout
>> Content length:
>>
>>> The number of bytes in the file being uploaded. Note that this header is
>>> required; you cannot leave it out and just use chunked encoding.
>>> When sending the SHA1 checksum at the end, the Content-Length should be
>>> set to the size of the file plus the 40 bytes of hex checksum.
>>>
>>
>> Since the only message is "HTTP Status 400 – Bad Request" then I don't
>> know how to debug it any more...
>>
>>
>> You can use curl option --libcurl [1] to get the source code equivalent.
>> That will show you that CURLOPT_POSTFIELDS and CURLOPT_POSTFIELDSIZE_LARGE
>> are used to respectively set the already read in data and its size.
>>
>> In your example you have chosen instead to use CURLOPT_POST [2] and
>> CURLOPT_READDATA to read the data from a file. That's fine, however you
>> should also set CURLOPT_SEEKFUNCTION [3] (basically forward to fseek; read
>> the doc for pitfalls) and CURLOPT_SEEKDATA to the same pointer as READDATA.
>> That way if the first post request fails (like, authentication required)
>> the file can be properly rewound and read again from the beginning.
>>
>> Your example also sets the content length header twice, but it should not
>> do that even once. By using the read function you are by default sending
>> data using chunked encoding, and then you are adding the content length
>> header. The bad request looks like this:
>>
>> Transfer-Encoding: chunked
>> Content-Type: text/plain
>> X-Bz-File-Name: /home/jian/helloc/curl_1.c
>> Content-Length: 799
>> Content-Length: 799
>>
>> You could set CURLOPT_POSTFIELDSIZE_LARGE to set the content length
>> instead of using chunked encoding. These are things you need to review the
>> documentation for, review the links at the bottom of this e-mail.
>>
>> There are other problems with your example. You are not checking the
>> return code of stat and you are concatenating to an uninitialized string
>> auth[] which will likely cause memory corruption.
>>
>>
>> [1]: https://curl.se/docs/manpage.html#--libcurl
>> [2]: https://curl.se/libcurl/c/CURLOPT_POST.html
>> [3]: https://curl.se/libcurl/c/CURLOPT_SEEKFUNCTION.html
>>
>> --
>> Unsubscribe: https://lists.haxx.se/listinfo/curl-library
>> Etiquette: https://curl.se/mail/etiquette.html
>>
>
>
> Thanks for the command line --libcurl trick. By following through example
> code, the CURLOPT_POSTFIELDS option is easier to understand compared to
> CURLOPT_READDATA.
>
> How does the curl command line encode the PNG file data to (char
> *postdata) [0]?
>
>
> [0]: https://curl.se/libcurl/c/CURLOPT_POSTFIELDS.html
>
> --
> I recommend David Deutsch's <<The Beginning of Infinity>>
>
> Jian
>
>
>
If the file is text, then all things would be pretty easy. However, if I
upload a png file, Then the auto generated c code will not build and run
again.
The following code is generated by curl. It cannot recompile and run again.
/********* Sample code generated by the curl command line tool **********
* All curl_easy_setopt() options are documented at:
* https://curl.se/libcurl/c/curl_easy_setopt.html\
*
*
gcc testcurl_elephant.c -lcurl &&./a.out
************************************************************************/
#include <curl/curl.h>
int main(int argc, char *argv[])
{
CURLcode ret;
CURL *hnd;
struct curl_slist *slist1;
slist1 = NULL;
slist1 = curl_slist_append(slist1, "Authorization:
4_004ad5922e3f4590000000002_01a7683f_d87468_upld_MYVQlhLtt7es6KyLq72D4HEBH9U=");
slist1 = curl_slist_append(slist1, "X-Bz-File-Name:
/home/jian/helloc/elephant.png");
slist1 = curl_slist_append(slist1, "Content-Type: image/png");
slist1 = curl_slist_append(slist1, "X-Bz-Content-Sha1:
037a513d56d029729e044d6a8e68e68025aaf0c2");
slist1 = curl_slist_append(slist1, "X-Bz-Info-Author: unknown");
slist1 = curl_slist_append(slist1, "X-Bz-Server-Side-Encryption: AES256");
hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
curl_easy_setopt(hnd, CURLOPT_URL, "
https://pod-040-2001-00.backblaze.com/b2api/v2/b2_upload_file/daed35e922928ea38f340519/c004_v0402001_t0049
");
curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(hnd, CURLOPT_POSTFIELDS,
"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\x1c\x00\x00\x02-\x08\x06\x00\x00\x00r\xd8\xa3t\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x00\x07tIME\x07\xd8\x01\x10\x13\x12\x01NS\x17\xa1\x00\x00
\x00IDATx\x9c\xec\x9dwxT\xd7\xb5\xb7\xdf\x19\xf5Q\xef\x12*HBB\x08$z\x11\x180`\xb01`p\x89\xe3\xb8&N\x9c8q\x8b\x9d\x1b\xdf\xf8\xe6\xc6I\xae\xd3\x9c\xd8\x9f\xe3\xc45\x89\xe3\xb8\xe2\x82\xc1\xd8\xc6t\xd3\xab\xa8\x12\xea\xa0\x82z\xaf\xa3\xae\x99\xf9\xfe8\x801H
\x9d}F3\x1a\xed\xf7y\xe6\xd1
\xcd^{\x01\x9a3\xbf\xb3\xf6*:$\x12\x89D2\x9c\t\x06B\x01\x7f
\xa0\x8f\x87\x01\xf0\x00\xbc\x01\x17\xc0\x0fp\x05<\x07\xb9\x8f\x05h:\xf7\xbc\x190\x03m_at_
;\xd0\x004\xf6\xf1\xb5\x1e(\x01\x8c\xaa\xfef\x12\x87Bgk\x07$\x12\x89D\xd2/\xc1_at_\xcc\xb9G,\x10\x05D\xa2\x08\x8c\xf3_]m\xe4\xdb`h\x01J\x81\xb2\x8b\x1e%\xc0i
\x17\xa8\xb5\x9dk\x92\xa1B\n\x0e\x89D\"\xb1-\xbe_at_\xe2\xb9\xc7\xb8s_\x13\x801\x0c>\n1\\i\x00\xf2\x81\x1c
\xef\xdc\xf3\x0c\xa0\x10%\xb2\"q\x00\xa4\xe0\x90H$\x92\xa1A\x07\xc4\x01S\x80\xc9\xe7\x1e)_at_\xb4-\x9d\xb2sZ\x80t\xe0\xe4\xb9\xc7Q
\x1b\xe8\xb5\xa5S\x12uH\xc1!\x91H$\xda\xe3\x02\x8cG\x11\x17SQ\xc4\xc5$\xc0\xc7\x96N9\x08\x1d(\xe2\xe3\x18\x8a\x009\x8ar,c\xb2\xa5S\x92\xab#\x05\x87D\"\x91\x88\xe1\x0cL\x03f\xf2u\xe4\"\x99\xe1\x91[\xe1(\x18\x81}\xc0\x0e`\x17p\x1c)_at_\xec\x0e)8$\x12I\x7f\x04\xa3\x84\xfb#\x810
\xe8\xdc#\xf0\xdcW\x03\xe0u\xee\xab\x1bJ\xf5\x833W\xbf\x8boA\t\x897\x9d\xfb\xda\nt\xa2\xdc\xb9\x1a\x81\x9es?\xeb8\xf7\xb3Z\xa0\xee\xdc\xa3\xea\xa2\xe7]\x9a\xfc-\x07\x8f7\x90\n\xcc\x05\xe6\xa1\x08\x8d\x91\x92k1\\h\x01v\x03;Q\x04H:JU\x8d\xc4\x86H\xc1\xe1\x18\x18P>\x1c|QB\xb9\xfas\xcfA)\x87s?\xf7\xdc\x8f\xbe\xff\xcf\xdb\x80n\x94;\x82\x96s\xdf;\x7f\xe1?\xff\x81\xd0\x82\x92\xd8%\xdf\xb4\x8e\x85?\x90\x84\x12\xfe\x1fw\xeek\xcc\xb9\x87\x87\xcd\xbc\x1a\x18\xad|S\x80T\x01gQ\x12\r\x8b\xce=\xaa5\xd8\xc7\x0b\xb8\x0eX\x88\"2&\x03N\x1a\xd8\x95\x0c\x1d\x95\xc0\xe7\xc0z\x14\x11b+\xb1:\xa2\x91\x82\xc3\xbe\tBI2\x1b\x83R\xfe\x16r\xeek\xf0\xb9G\xd8\xb9\xafCywU\x8f\"<\xea\xfbx~\xbe\xec\xad\xe4\xdc\xf3\xce!\xf4Kru\xe2\xf8:\x9f\xe0\xfc#\xc2\xa6\x1eY\x9f6\xa0\x98\xafEH\xe1\xb9?\xe7\x9d{\xde\xdd\xc7\x1a=\xca\xbf\xd3\x12`)0\x07%r#q\x0cZ\x81\xcd\xc0\xa7\xc0&\xbe\xee-\"\xb12Rp\xd8\x1e\x1dJ}}20\x01\x98\x08\x8cE\x11\x19\xbeWX7\x1c\xa8A\x11\x1e\xa5(\"\xa4\x04\xe5B\x9f\x87r\xf1\x97\x99\xe6\xd6#\x08%\xdc?\x03%\xbf`\x06J4C\xf25\xbd(\xa2#\x03\xa5\x0cs\x14\xca\xfbn\x1c\x8a\x90\x978>=(\x11\x8fw\x80u(\xc7x\x12+!\x05\xc7\xd0\xe2\x86R\x06wqY\xdcD\x94\x90\xedH\xa3\x1b\xe5b\x9f\x83r\xb1\xcfG\xc94\xcfF\xdeq\xa8!\x00%\xec\x7f-\xb0\x00\xe5hD\xbe\xbf%\x92\x81\xd3\x0c|\x82\">\xf6\"\xfb\x7fh\x8e\xbc
Y\x97x\x94p\xec\xccs\x8fI\xc8\xcc\xf5\x81P\x84R\xf6\x96\x8er\xf7y\xf2\xdc\xf7$\xdf$\x05X\x01\xdc\x88\xf2{&\xf3\n$\x12m(\x00\xde>\xf7(\xb1\xb1/\x0e\x83\x14\x1c\xda2\x1a%\xb1l!\xb0\x08%\xbb_\xa2\rM|\xdd\xfc\xe7\xbc\x10\xc9\xa4\xef3xGf\x12\xf0m\xe0\x0e\x94\xf0\xbfD\"\xb1\x1ef\x94R\xdb\xb7P\xa2\x1f2\xd9T\x00)8\xc4\xd0\xa3\x94\xc7\xdd\x84r\xa7\x99l[wF\x1c=_at_\x16\x90\x06\x1c\x06\x0e\xa1\x1c\xcb8Z%\xcd(\xe0~\xe0\x1e\x94\xfc\x02\x89D2\xf44\x00\xab\x81WQ\x8e\x82%\x83D\n\x8e\xc1\xa3GI\xc6\xbb\x0b\xb8\x05\x99\\fo4\xa3\x08\x90C|-B\xeam\xea\x91:\\\x80e\xc0\x8f\x80\x1b\x90\xc7%\x12\rqqq\xc1\xcbKI\x1d\xf3\xf1\xf1\xc1\xc9\xe9\xca\xbf^\xcd\xcd\xcd\xf4\xf6\xf6\xd2\xdc\xdc<\x14\xee\xd9;\x16`\x0b\xf0W`\x1b2\xd7c\xc0H\xc11pR\x80\xfb\x80\xef
\x8fJ\x86\x13\x16\x94(\xc8.`\xcf\xb9\x87\x16\xbd\x19\xac\xc58\xe0{(\x11\x8d\x10\xdb\xba\"\xb1gt:\x1d!!!\x84\x84\x84\x10\x16\x16Fhh(!!!\x84\x87\x87\xe3\xef\xef\x8f\xaf\xaf/~~~\xf8\xf9\xf9\xe1\xeb\xeb{\xe1\xcf\xae\xaebidF\xa3\x91\xf6\xf6v\x8cF#\xcd\xcd\xcd\xb4\xb7\xb7\xd3\xd0\xd0_at_MM\r\x95\x95\x95\xd4\xd6\xd6R[[Kee\xe5\x85\xef566j\xf4\xb7\xb6;\xb2\x80\xbf\x01\xef\"\xdb\x00\\\x15)8\xae\x8c/J$\xe3\x07(\xa5\x85\x12\xc7
\x07\xa5\x0b\xe1\x1e\xe0+\x94\xf2][\xe2\x0c\xdc\x06<\x84\x12=\x93\xefK\tz\xbd\x9e\xe8\xe8h\x12\x12\x12\x18=z4\xd1\xd1\xd1\xc4\xc4\xc4\\x\x1e\x11\x11\x81\x8b\x8b\x8b\xad\xdd\x1c\x10MMM\x14\x16\x16RXXHQQ\xd1\x85\xe7\x85\x85\x85\x14\x17\x17\xd3\xdb;\xec+\xe4\xeb\x80\xd7\x81\x97\xb1\xef\x1b\x1a\x9b\"/l}3\x07x\x10\xb8\x1d\xfb\xef\xb6(\x11\xc3\x82\x92\x88\xba\x1d\xd8\x8a2\x8fa\xa8\xeeT\xfcP\x8eL\x1e\x01\xa2\x86hO\x89\x9d\x11\x18\x18Hbb\"\xe3\xc6\x8dc\xec\xd8\xb1$$$\\\xf8\xea\xe6\xe6fk\xf7\xacNww7\x05\x05\x05dee\x91\x91\x91\xc1\xa9S\xa7HOO\xa7\xb8\xb8\x18\x8be\xd8\x9dVt\x00\xaf\x00\x7fF\x11!\x92\x8b\x90\x82\xe3k|\x80\xbbQ\x84\xc6$\x1b\xfb\"\xb1\x1d\x1d(5\xf8[\x81/Q\x92P\xb5&\x04x\x12\xf8\tr\x06\xc7\x88\xc1\xdd\xdd\x9d\xe4\xe4dRRR\xbe\xf15<<\xdc\xd6\xae\xd9%---\x9c:u\x8aS\xa7Nq\xf2\xe4I\x8e\x1e=Jzz\xfap\x89\x86\x18\x81\x17\x81\xff\x87\xec+t\x01)8\x94\n\x80'P\x84\x86\xb7\x8d}\x91\xd8\x1fgP\x84\xc7\x97(\xc70\"e\xb8a\xc0\x7f\xa3\xfc\xae\x19\xc4]\x93\xd8+z\xbd\x9e\xa4\xa4$f\xce\x9c\xc9\x8c\x193\x989s&\x13'N\x1c6G
\xf6\x8a\xd1h\xe4\xd0\xa1C\x1c8p\x80\xbd{\xf7r\xf8\xf0aZ[[m\xed\xd6\x95hB\x11\x1d/\xa2\x88\x90\x11\xcdH\x16\x1ccQ.\xfe\xf7\"\x9bqI\x06\x86\x91\xafg0l\xe0\xebAwW\xc3\x0bx\n\xf8)\x0e\xd8U\xd6\xd3\xd3\x13www|}}1\x18\x0cW<\x06hii\xc1d2\xd1\xda\xdaJoo/F\xa3\x91\x9e\x9e\x9e!\xf4\xd6:\x8c\x1a5\x8a\xd9\xb3g3k\xd6,f\xcc\x98\xc1\xb4i\xd3\xf0\xf6\x96\xf7/\xd6\xc6d2q\xf2\xe4I\xf6\xef\xdf\xcf\x96-[\xd8\xb5k\x17\xed\xed\xed\xb6v\xab/\xea\x80?\xa1\xe4x\x8c\xb4\xdeA\x17\x18\x89\x82#\x1a\xf8?\x94\x8a\x13\xbd\x8d}\x91\x0c_\xbaP\x8e]\xd6\xa2L\xa1\xec+\r\xdf\x19%G\xe3\xd7(C\xf7\x86\r\xae\xae\xaeDGG\x13\x17\x17GLL\x0cQQQ\x84\x87\x87\x13\x1c\x1cLpp0!!!\x04\x07\x07\xe3\xe3s\xb5I\xf4W\xa7\xbd\xbd\x9d\xa6\xa6&\x9a\x9a\x9ahll\xa4\xa9\xa9\x89\xba\xba:***\xa8\xaa\xaa\xa2\xaa\xaa\x8a\xca\xcaJ***(--\xa5\xbb\xdb\xf6\xd7\xeb\xd0\xd0P\x16,X\xc0\xc2\x85\x0bY\xb8p!c\xc7\x8e\xb5\xb5K\x12\xa0\xb3\xb3\x93\x9d;w\xb2q\xe3F6m\xdaDAA\x81\xad]\xba\x94\\\xe01\x94r\xda\x11\xc7H\x12\x1cA\xc0/Q*\x01...");
curl_easy_setopt(hnd, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)50279);
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, slist1);
curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/7.81.0");
curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_2TLS);
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 1L);
curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
/* Here is a list of options the curl code used that cannot get generated
as source easily. You may choose to either not use them or implement
them yourself.
CURLOPT_WRITEDATA set to a objectpointer
CURLOPT_INTERLEAVEDATA set to a objectpointer
CURLOPT_WRITEFUNCTION set to a functionpointer
CURLOPT_READDATA set to a objectpointer
CURLOPT_READFUNCTION set to a functionpointer
CURLOPT_SEEKDATA set to a objectpointer
CURLOPT_SEEKFUNCTION set to a functionpointer
CURLOPT_ERRORBUFFER set to a objectpointer
CURLOPT_STDERR set to a objectpointer
CURLOPT_DEBUGFUNCTION set to a functionpointer
CURLOPT_DEBUGDATA set to a objectpointer
CURLOPT_HEADERFUNCTION set to a functionpointer
CURLOPT_HEADERDATA set to a objectpointer
*/
ret = curl_easy_perform(hnd);
curl_easy_cleanup(hnd);
hnd = NULL;
curl_slist_free_all(slist1);
slist1 = NULL;
return (int)ret;
}
/**** End of sample code ****/
-- I recommend David Deutsch's <<The Beginning of Infinity>> Jian
-- Unsubscribe: https://lists.haxx.se/listinfo/curl-library Etiquette: https://curl.se/mail/etiquette.htmlReceived on 2022-10-04