#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
#include <stdlib.h>
#include "util.c" // 加密算法
static const char *access_id = "***"; /**设置用户 Access ID */
static const char *access_key = "******"; /** 设置用户的 Access Key */
static const char *endpoint = "oss-cn-***.aliyuncs.com"; //设置 hostname
/* Auxiliary function that waits on the socket. */
static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
{
// ...
}
static char* getDateForHeader()
{
// ...
}
int main(void)
{
CURL *curl;
CURLcode res;
const char *bucket = "***";
/* Minimalistic http request */
char *times = getDateForHeader();
unsigned char message[100] = {0};
sprintf(message, "GET\n\n\n%s\n/%s/", times, bucket);
puts("the message to be encrptied:");
puts("----------------------------");
puts(message);
puts("----------------------------\n\n");
/* Encrytion */
unsigned char hmac[20] = {0};
HMAC_SHA1(hmac, (unsigned char *)access_key, strlen(access_key),
(unsigned char *)message, strlen(message));
char b64[((20 + 1) * 4) / 3] = {0};
int b64Len = base64Encode(hmac, 20, b64);
b64[b64Len] = '\0';
/* generate request */
char request[200] = {0};
sprintf(request, "GET / HTTP/1.1\r\nDate: %s\r\nHost: %s.%s\r\nAuthorization: OSS %s:%s\r\n\r\n",
times, bucket, endpoint, access_id, b64);
curl_socket_t sockfd; /* socket */
long sockextr;
size_t iolen;
curl_off_t nread;
curl = curl_easy_init();
if(curl) {
char hostname[100] = "http://www.";
strcat(hostname, endpoint);
curl_easy_setopt(curl, CURLOPT_URL, hostname);
/* Do not do the transfer - only connect to host */
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
res = curl_easy_perform(curl);
if(CURLE_OK != res)
{
printf("Error: %s\n", strerror(res));
free((void*)times);
return 1;
}
/* Extract the socket from the curl handle - we'll need it for waiting.
* Note that this API takes a pointer to a 'long' while we use
* curl_socket_t for sockets otherwise.
*/
res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockextr);
if(CURLE_OK != res)
{
printf("Error: %s\n", curl_easy_strerror(res));
free((void*)times);
return 1;
}
sockfd = sockextr;
/* wait for the socket to become ready for sending */
if(!wait_on_socket(sockfd, 0, 60000L))
{
printf("Error: timeout.\n");
free((void*)times);
return 1;
}
/* Send the request. Real applications should check the iolen
* to see if all the request has been sent */
res = curl_easy_send(curl, request, strlen(request), &iolen);
puts("This is what I send to OSS:\n===============================\n\n");
puts(request);
puts("===============================");
if(CURLE_OK != res)
{
printf("Error: %s\n", curl_easy_strerror(res));
free((void*)times);
return 1;
}
/* read the response */
for(;;)
{
char buf[8192];
wait_on_socket(sockfd, 1, 60000L);
res = curl_easy_recv(curl, buf, 1024, &iolen);
if(CURLE_OK != res)
break;
nread = (curl_off_t)iolen;
printf("Received %" CURL_FORMAT_CURL_OFF_T " bytes.\n", nread);
buf[iolen] = '\0';
puts("\n\n");
puts(buf);
}
/* always cleanup */
curl_easy_cleanup(curl);
}
free((void*)times);
return 0;
}
OSS-cURL-GetBucket
最新推荐文章于 2023-06-29 14:45:18 发布