annotate s3/s3_uploader.c @ 198:008ca7780c8a

S3 upload got it to work.
author MrJuneJune <me@mrjunejune.com>
date Sat, 14 Feb 2026 16:18:14 -0800
parents 83f16548ba41
children 6cdee35a7ba9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
196
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
1 #include "s3_uploader.h"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
2 #include "seobeo/seobeo.h"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
3
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
4 #include <stdio.h>
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
5 #include <stdlib.h>
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
6 #include <string.h>
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
7 #include <time.h>
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
8 #include <ctype.h>
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
9
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
10 #include <openssl/hmac.h>
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
11 #include <openssl/sha.h>
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
12
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
13 #define S3_ARENA_SIZE (10 * ONE_MEGA_BYTE)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
14 #define S3_RESULT_ARENA_SIZE (64 * 1024)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
15 #define S3_SERVICE_NAME "s3"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
16 #define S3_AWS4_REQUEST "aws4_request"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
17 #define S3_ALGORITHM "AWS4-HMAC-SHA256"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
18
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
19 // --- Internal Structures --- //
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
20
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
21 typedef struct {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
22 char date[9]; // YYYYMMDD
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
23 char datetime[17]; // YYYYMMDDTHHMMSSZ
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
24 } S3_Timestamp;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
25
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
26 // --- Forward Declarations --- //
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
27
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
28 static void s3__get_timestamp(S3_Timestamp *p_ts);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
29 static void s3__sha256_hex(const uint8 *data, size_t len, char *out);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
30 static void s3__hmac_sha256(const uint8 *key, size_t key_len,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
31 const uint8 *data, size_t data_len,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
32 uint8 *out);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
33 static void s3__hex_encode(const uint8 *data, size_t len, char *out);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
34 static char *s3__uri_encode(const char *str, Dowa_Arena *p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
35 static char *s3__build_canonical_request(const char *method,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
36 const char *uri,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
37 const char *query,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
38 const char *headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
39 const char *signed_headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
40 const char *payload_hash,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
41 Dowa_Arena *p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
42 static char *s3__build_string_to_sign(const char *datetime,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
43 const char *date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
44 const char *region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
45 const char *canonical_request,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
46 Dowa_Arena *p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
47 static void s3__calculate_signing_key(const char *secret_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
48 const char *date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
49 const char *region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
50 uint8 *out);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
51 static char *s3__build_authorization_header(const char *access_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
52 const char *date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
53 const char *region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
54 const char *signed_headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
55 const uint8 *signing_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
56 const char *string_to_sign,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
57 Dowa_Arena *p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
58 static uint8 *s3__load_file(const char *path, size_t *p_size);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
59
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
60 // --- Public API Implementation --- //
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
61
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
62 S3_Result S3_Upload_File(const S3_Config *p_config,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
63 const char *local_path,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
64 const char *s3_key)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
65 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
66 const char *content_type = S3_Guess_Content_Type(local_path);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
67 return S3_Upload_File_With_Content_Type(p_config, local_path, s3_key, content_type);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
68 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
69
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
70 S3_Result S3_Upload_File_With_Content_Type(const S3_Config *p_config,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
71 const char *local_path,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
72 const char *s3_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
73 const char *content_type)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
74 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
75 S3_Result result = {0};
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
76 result.p_arena = Dowa_Arena_Create(S3_RESULT_ARENA_SIZE);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
77
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
78 size_t file_size = 0;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
79 uint8 *file_data = s3__load_file(local_path, &file_size);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
80 if (!file_data)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
81 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
82 result.success = FALSE;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
83 result.status_code = 0;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
84 result.error_message = Dowa_String_Copy_Arena("Failed to read file", result.p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
85 return result;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
86 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
87
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
88 result = S3_Upload_Data(p_config, file_data, file_size, s3_key, content_type);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
89 free(file_data);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
90
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
91 return result;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
92 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
93
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
94 S3_Result S3_Upload_Data(const S3_Config *p_config,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
95 const uint8 *data,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
96 size_t data_length,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
97 const char *s3_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
98 const char *content_type)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
99 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
100 S3_Result result = {0};
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
101 result.p_arena = Dowa_Arena_Create(S3_RESULT_ARENA_SIZE);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
102
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
103 if (!p_config || !data || !s3_key)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
104 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
105 result.success = FALSE;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
106 result.error_message = Dowa_String_Copy_Arena("Invalid parameters", result.p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
107 return result;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
108 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
109
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
110 Dowa_Arena *p_arena = Dowa_Arena_Create(S3_ARENA_SIZE);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
111
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
112 // Get timestamp
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
113 S3_Timestamp ts;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
114 s3__get_timestamp(&ts);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
115
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
116 // Calculate payload hash
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
117 char payload_hash[65];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
118 s3__sha256_hex(data, data_length, payload_hash);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
119
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
120 // Build host
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
121 char *host;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
122 if (p_config->endpoint)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
123 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
124 host = Dowa_String_Copy_Arena((char *)p_config->endpoint, p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
125 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
126 else if (p_config->use_path_style)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
127 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
128 size_t host_len = strlen("s3.") + strlen(p_config->region) + strlen(".amazonaws.com") + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
129 host = Dowa_Arena_Allocate(p_arena, host_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
130 snprintf(host, host_len, "s3.%s.amazonaws.com", p_config->region);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
131 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
132 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
133 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
134 size_t host_len = strlen(p_config->bucket) + strlen(".s3.") + strlen(p_config->region) + strlen(".amazonaws.com") + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
135 host = Dowa_Arena_Allocate(p_arena, host_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
136 snprintf(host, host_len, "%s.s3.%s.amazonaws.com", p_config->bucket, p_config->region);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
137 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
138
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
139 // Build URI path
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
140 char *uri_path;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
141 char *encoded_key = s3__uri_encode(s3_key, p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
142 if (p_config->use_path_style)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
143 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
144 size_t uri_len = strlen("/") + strlen(p_config->bucket) + strlen("/") + strlen(encoded_key) + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
145 uri_path = Dowa_Arena_Allocate(p_arena, uri_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
146 snprintf(uri_path, uri_len, "/%s/%s", p_config->bucket, encoded_key);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
147 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
148 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
149 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
150 size_t uri_len = strlen("/") + strlen(encoded_key) + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
151 uri_path = Dowa_Arena_Allocate(p_arena, uri_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
152 snprintf(uri_path, uri_len, "/%s", encoded_key);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
153 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
154
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
155 // Build canonical headers (must be sorted alphabetically)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
156 char content_length_str[32];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
157 snprintf(content_length_str, sizeof(content_length_str), "%zu", data_length);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
158
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
159 size_t headers_len = 512 + strlen(host) + strlen(content_type) + strlen(content_length_str);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
160 char *canonical_headers = Dowa_Arena_Allocate(p_arena, headers_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
161 snprintf(canonical_headers, headers_len,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
162 "content-length:%s\n"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
163 "content-type:%s\n"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
164 "host:%s\n"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
165 "x-amz-content-sha256:%s\n"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
166 "x-amz-date:%s\n",
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
167 content_length_str,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
168 content_type,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
169 host,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
170 payload_hash,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
171 ts.datetime);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
172
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
173 const char *signed_headers = "content-length;content-type;host;x-amz-content-sha256;x-amz-date";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
174
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
175 // Build canonical request
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
176 char *canonical_request = s3__build_canonical_request("PUT",
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
177 uri_path,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
178 "", // No query string
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
179 canonical_headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
180 signed_headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
181 payload_hash,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
182 p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
183
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
184 // Build string to sign
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
185 char *string_to_sign = s3__build_string_to_sign(ts.datetime,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
186 ts.date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
187 p_config->region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
188 canonical_request,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
189 p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
190
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
191 // Calculate signing key
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
192 uint8 signing_key[32];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
193 s3__calculate_signing_key(p_config->secret_access_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
194 ts.date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
195 p_config->region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
196 signing_key);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
197
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
198 // Build authorization header
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
199 char *auth_header = s3__build_authorization_header(p_config->access_key_id,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
200 ts.date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
201 p_config->region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
202 signed_headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
203 signing_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
204 string_to_sign,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
205 p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
206
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
207 // Build URL
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
208 size_t url_len = strlen("https://") + strlen(host) + strlen(uri_path) + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
209 char *url = Dowa_Arena_Allocate(p_arena, url_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
210 snprintf(url, url_len, "https://%s%s", host, uri_path);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
211
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
212 // Execute request using seobeo
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
213 Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create(url);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
214 Seobeo_Client_Request_Set_Method(p_req, "PUT");
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
215 Seobeo_Client_Request_Set_Body(p_req, (const char *)data, data_length);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
216 Seobeo_Client_Request_Add_Header_Map(p_req, "Content-Type", content_type);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
217 Seobeo_Client_Request_Add_Header_Map(p_req, "x-amz-date", ts.datetime);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
218 Seobeo_Client_Request_Add_Header_Map(p_req, "x-amz-content-sha256", payload_hash);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
219 Seobeo_Client_Request_Add_Header_Map(p_req, "Authorization", auth_header);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
220
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
221 Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
222
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
223 if (p_resp)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
224 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
225 result.status_code = p_resp->status_code;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
226 if (p_resp->status_code >= 200 && p_resp->status_code < 300)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
227 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
228 result.success = TRUE;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
229
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
230 // Extract ETag from response headers
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
231 if (p_resp->headers)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
232 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
233 char *etag = Dowa_HashMap_Get(p_resp->headers, "etag");
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
234 if (!etag) etag = Dowa_HashMap_Get(p_resp->headers, "ETag");
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
235 if (etag)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
236 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
237 result.etag = Dowa_String_Copy_Arena(etag, result.p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
238 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
239 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
240 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
241 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
242 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
243 result.success = FALSE;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
244 if (p_resp->body && p_resp->body_length > 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
245 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
246 result.error_message = Dowa_String_Copy_Arena(p_resp->body, result.p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
247 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
248 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
249 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
250 result.error_message = Dowa_String_Copy_Arena("Upload failed", result.p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
251 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
252 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
253 Seobeo_Client_Response_Destroy(p_resp);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
254 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
255 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
256 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
257 result.success = FALSE;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
258 result.error_message = Dowa_String_Copy_Arena("Failed to execute request", result.p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
259 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
260
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
261 Seobeo_Client_Request_Destroy(p_req);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
262 Dowa_Arena_Free(p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
263
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
264 return result;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
265 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
266
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
267 void S3_Result_Destroy(S3_Result *p_result)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
268 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
269 if (p_result && p_result->p_arena)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
270 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
271 Dowa_Arena_Free(p_result->p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
272 p_result->p_arena = NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
273 p_result->error_message = NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
274 p_result->etag = NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
275 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
276 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
277
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
278 // --- Presigned URL Implementation --- //
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
279
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
280 static char *s3__uri_encode_strict(const char *str, Dowa_Arena *p_arena)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
281 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
282 // Stricter encoding for query string values (no forward slash allowed)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
283 if (!str) return NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
284
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
285 size_t len = strlen(str);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
286 size_t max_len = len * 3 + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
287 char *out = Dowa_Arena_Allocate(p_arena, max_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
288 char *p = out;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
289
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
290 for (size_t i = 0; i < len; i++)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
291 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
292 char c = str[i];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
293 if ((c >= 'A' && c <= 'Z') ||
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
294 (c >= 'a' && c <= 'z') ||
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
295 (c >= '0' && c <= '9') ||
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
296 c == '-' || c == '_' || c == '.' || c == '~')
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
297 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
298 *p++ = c;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
299 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
300 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
301 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
302 sprintf(p, "%%%02X", (unsigned char)c);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
303 p += 3;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
304 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
305 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
306 *p = '\0';
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
307 return out;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
308 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
309
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
310 static S3_Presigned_URL s3__presign_url(const S3_Config *p_config,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
311 const char *s3_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
312 const char *method,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
313 const char *content_type,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
314 int32 expires_seconds)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
315 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
316 S3_Presigned_URL result = {0};
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
317 result.p_arena = Dowa_Arena_Create(S3_RESULT_ARENA_SIZE);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
318
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
319 if (!p_config || !s3_key)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
320 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
321 result.success = FALSE;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
322 result.error_message = Dowa_String_Copy_Arena("Invalid parameters", result.p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
323 return result;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
324 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
325
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
326 Dowa_Arena *p_arena = Dowa_Arena_Create(S3_ARENA_SIZE);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
327
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
328 // Get timestamp
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
329 S3_Timestamp ts;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
330 s3__get_timestamp(&ts);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
331
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
332 // Build host
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
333 char *host;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
334 if (p_config->endpoint)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
335 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
336 host = Dowa_String_Copy_Arena((char *)p_config->endpoint, p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
337 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
338 else if (p_config->use_path_style)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
339 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
340 size_t host_len = strlen("s3.") + strlen(p_config->region) + strlen(".amazonaws.com") + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
341 host = Dowa_Arena_Allocate(p_arena, host_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
342 snprintf(host, host_len, "s3.%s.amazonaws.com", p_config->region);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
343 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
344 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
345 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
346 size_t host_len = strlen(p_config->bucket) + strlen(".s3.") + strlen(p_config->region) + strlen(".amazonaws.com") + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
347 host = Dowa_Arena_Allocate(p_arena, host_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
348 snprintf(host, host_len, "%s.s3.%s.amazonaws.com", p_config->bucket, p_config->region);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
349 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
350
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
351 // Build URI path
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
352 char *uri_path;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
353 char *encoded_key = s3__uri_encode(s3_key, p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
354 if (p_config->use_path_style)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
355 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
356 size_t uri_len = strlen("/") + strlen(p_config->bucket) + strlen("/") + strlen(encoded_key) + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
357 uri_path = Dowa_Arena_Allocate(p_arena, uri_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
358 snprintf(uri_path, uri_len, "/%s/%s", p_config->bucket, encoded_key);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
359 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
360 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
361 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
362 size_t uri_len = strlen("/") + strlen(encoded_key) + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
363 uri_path = Dowa_Arena_Allocate(p_arena, uri_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
364 snprintf(uri_path, uri_len, "/%s", encoded_key);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
365 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
366
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
367 // Build credential scope
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
368 size_t scope_len = strlen(p_config->access_key_id) + strlen(ts.date) + strlen(p_config->region) +
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
369 strlen(S3_SERVICE_NAME) + strlen(S3_AWS4_REQUEST) + 10;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
370 char *credential = Dowa_Arena_Allocate(p_arena, scope_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
371 snprintf(credential, scope_len, "%s/%s/%s/%s/%s",
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
372 p_config->access_key_id, ts.date, p_config->region, S3_SERVICE_NAME, S3_AWS4_REQUEST);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
373
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
374 char *encoded_credential = s3__uri_encode_strict(credential, p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
375
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
376 // Build signed headers (host is required, content-type for PUT)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
377 const char *signed_headers;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
378 if (content_type && strcmp(method, "PUT") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
379 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
380 signed_headers = "content-type;host";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
381 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
382 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
383 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
384 signed_headers = "host";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
385 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
386
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
387 // Build canonical query string (must be sorted alphabetically)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
388 char expires_str[16];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
389 snprintf(expires_str, sizeof(expires_str), "%d", expires_seconds);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
390
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
391 size_t query_len = 1024 + strlen(encoded_credential);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
392 char *canonical_query = Dowa_Arena_Allocate(p_arena, query_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
393
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
394 if (content_type && strcmp(method, "PUT") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
395 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
396 char *encoded_content_type = s3__uri_encode_strict(content_type, p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
397 snprintf(canonical_query, query_len,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
398 "X-Amz-Algorithm=%s"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
399 "&X-Amz-Credential=%s"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
400 "&X-Amz-Date=%s"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
401 "&X-Amz-Expires=%s"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
402 "&X-Amz-SignedHeaders=%s"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
403 "&x-amz-content-type=%s",
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
404 S3_ALGORITHM,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
405 encoded_credential,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
406 ts.datetime,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
407 expires_str,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
408 signed_headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
409 encoded_content_type);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
410 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
411 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
412 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
413 snprintf(canonical_query, query_len,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
414 "X-Amz-Algorithm=%s"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
415 "&X-Amz-Credential=%s"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
416 "&X-Amz-Date=%s"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
417 "&X-Amz-Expires=%s"
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
418 "&X-Amz-SignedHeaders=%s",
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
419 S3_ALGORITHM,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
420 encoded_credential,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
421 ts.datetime,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
422 expires_str,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
423 signed_headers);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
424 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
425
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
426 // Build canonical headers
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
427 size_t headers_len = 256 + strlen(host) + (content_type ? strlen(content_type) : 0);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
428 char *canonical_headers = Dowa_Arena_Allocate(p_arena, headers_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
429
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
430 if (content_type && strcmp(method, "PUT") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
431 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
432 snprintf(canonical_headers, headers_len,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
433 "content-type:%s\nhost:%s\n",
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
434 content_type, host);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
435 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
436 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
437 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
438 snprintf(canonical_headers, headers_len, "host:%s\n", host);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
439 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
440
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
441 // For presigned URLs, payload is UNSIGNED-PAYLOAD
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
442 const char *payload_hash = "UNSIGNED-PAYLOAD";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
443
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
444 // Build canonical request
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
445 char *canonical_request = s3__build_canonical_request(method,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
446 uri_path,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
447 canonical_query,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
448 canonical_headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
449 signed_headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
450 payload_hash,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
451 p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
452
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
453 // Build string to sign
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
454 char *string_to_sign = s3__build_string_to_sign(ts.datetime,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
455 ts.date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
456 p_config->region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
457 canonical_request,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
458 p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
459
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
460 // Calculate signing key
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
461 uint8 signing_key[32];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
462 s3__calculate_signing_key(p_config->secret_access_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
463 ts.date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
464 p_config->region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
465 signing_key);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
466
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
467 // Calculate signature
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
468 uint8 signature[32];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
469 s3__hmac_sha256(signing_key, 32,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
470 (const uint8 *)string_to_sign, strlen(string_to_sign),
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
471 signature);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
472
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
473 char signature_hex[65];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
474 s3__hex_encode(signature, 32, signature_hex);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
475
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
476 // Build final presigned URL
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
477 size_t url_len = strlen("https://") + strlen(host) + strlen(uri_path) + 1 +
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
478 strlen(canonical_query) + strlen("&X-Amz-Signature=") + 64 + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
479 char *url = Dowa_Arena_Allocate(result.p_arena, url_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
480 snprintf(url, url_len, "https://%s%s?%s&X-Amz-Signature=%s",
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
481 host, uri_path, canonical_query, signature_hex);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
482
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
483 result.success = TRUE;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
484 result.url = url;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
485
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
486 Dowa_Arena_Free(p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
487 return result;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
488 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
489
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
490 S3_Presigned_URL S3_Presign_Put(const S3_Config *p_config,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
491 const char *s3_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
492 const char *content_type,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
493 int32 expires_seconds)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
494 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
495 return s3__presign_url(p_config, s3_key, "PUT", content_type, expires_seconds);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
496 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
497
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
498 S3_Presigned_URL S3_Presign_Get(const S3_Config *p_config,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
499 const char *s3_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
500 int32 expires_seconds)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
501 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
502 return s3__presign_url(p_config, s3_key, "GET", NULL, expires_seconds);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
503 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
504
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
505 void S3_Presigned_URL_Destroy(S3_Presigned_URL *p_url)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
506 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
507 if (p_url && p_url->p_arena)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
508 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
509 Dowa_Arena_Free(p_url->p_arena);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
510 p_url->p_arena = NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
511 p_url->url = NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
512 p_url->error_message = NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
513 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
514 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
515
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
516 const char *S3_Guess_Content_Type(const char *filename)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
517 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
518 if (!filename) return "application/octet-stream";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
519
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
520 const char *dot = strrchr(filename, '.');
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
521 if (!dot) return "application/octet-stream";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
522
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
523 dot++; // Skip the dot
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
524
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
525 // Common content types
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
526 if (strcasecmp(dot, "html") == 0 || strcasecmp(dot, "htm") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
527 return "text/html";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
528 if (strcasecmp(dot, "css") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
529 return "text/css";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
530 if (strcasecmp(dot, "js") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
531 return "application/javascript";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
532 if (strcasecmp(dot, "json") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
533 return "application/json";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
534 if (strcasecmp(dot, "xml") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
535 return "application/xml";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
536 if (strcasecmp(dot, "txt") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
537 return "text/plain";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
538 if (strcasecmp(dot, "csv") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
539 return "text/csv";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
540
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
541 // Images
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
542 if (strcasecmp(dot, "png") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
543 return "image/png";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
544 if (strcasecmp(dot, "jpg") == 0 || strcasecmp(dot, "jpeg") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
545 return "image/jpeg";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
546 if (strcasecmp(dot, "gif") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
547 return "image/gif";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
548 if (strcasecmp(dot, "svg") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
549 return "image/svg+xml";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
550 if (strcasecmp(dot, "webp") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
551 return "image/webp";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
552 if (strcasecmp(dot, "ico") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
553 return "image/x-icon";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
554
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
555 // Audio/Video
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
556 if (strcasecmp(dot, "mp3") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
557 return "audio/mpeg";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
558 if (strcasecmp(dot, "mp4") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
559 return "video/mp4";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
560 if (strcasecmp(dot, "webm") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
561 return "video/webm";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
562 if (strcasecmp(dot, "ogg") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
563 return "audio/ogg";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
564 if (strcasecmp(dot, "wav") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
565 return "audio/wav";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
566
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
567 // Documents
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
568 if (strcasecmp(dot, "pdf") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
569 return "application/pdf";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
570 if (strcasecmp(dot, "zip") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
571 return "application/zip";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
572 if (strcasecmp(dot, "gz") == 0 || strcasecmp(dot, "gzip") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
573 return "application/gzip";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
574 if (strcasecmp(dot, "tar") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
575 return "application/x-tar";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
576
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
577 // Fonts
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
578 if (strcasecmp(dot, "woff") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
579 return "font/woff";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
580 if (strcasecmp(dot, "woff2") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
581 return "font/woff2";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
582 if (strcasecmp(dot, "ttf") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
583 return "font/ttf";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
584 if (strcasecmp(dot, "otf") == 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
585 return "font/otf";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
586
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
587 return "application/octet-stream";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
588 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
589
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
590 // --- Internal Implementation --- //
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
591
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
592 static void s3__get_timestamp(S3_Timestamp *p_ts)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
593 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
594 time_t now = time(NULL);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
595 struct tm *utc = gmtime(&now);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
596
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
597 strftime(p_ts->date, sizeof(p_ts->date), "%Y%m%d", utc);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
598 strftime(p_ts->datetime, sizeof(p_ts->datetime), "%Y%m%dT%H%M%SZ", utc);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
599 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
600
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
601 static void s3__hex_encode(const uint8 *data, size_t len, char *out)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
602 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
603 static const char hex[] = "0123456789abcdef";
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
604 for (size_t i = 0; i < len; i++)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
605 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
606 out[i * 2] = hex[(data[i] >> 4) & 0x0F];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
607 out[i * 2 + 1] = hex[data[i] & 0x0F];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
608 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
609 out[len * 2] = '\0';
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
610 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
611
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
612 static void s3__sha256_hex(const uint8 *data, size_t len, char *out)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
613 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
614 uint8 hash[SHA256_DIGEST_LENGTH];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
615 SHA256(data, len, hash);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
616 s3__hex_encode(hash, SHA256_DIGEST_LENGTH, out);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
617 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
618
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
619 static void s3__hmac_sha256(const uint8 *key, size_t key_len,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
620 const uint8 *data, size_t data_len,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
621 uint8 *out)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
622 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
623 unsigned int out_len = 0;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
624 HMAC(EVP_sha256(), key, (int)key_len, data, data_len, out, &out_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
625 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
626
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
627 static char *s3__uri_encode(const char *str, Dowa_Arena *p_arena)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
628 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
629 if (!str) return NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
630
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
631 size_t len = strlen(str);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
632 // Worst case: every char becomes %XX (3 chars)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
633 size_t max_len = len * 3 + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
634 char *out = Dowa_Arena_Allocate(p_arena, max_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
635 char *p = out;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
636
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
637 for (size_t i = 0; i < len; i++)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
638 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
639 char c = str[i];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
640 // Unreserved characters per RFC 3986
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
641 if ((c >= 'A' && c <= 'Z') ||
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
642 (c >= 'a' && c <= 'z') ||
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
643 (c >= '0' && c <= '9') ||
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
644 c == '-' || c == '_' || c == '.' || c == '~' || c == '/')
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
645 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
646 *p++ = c;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
647 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
648 else
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
649 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
650 sprintf(p, "%%%02X", (unsigned char)c);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
651 p += 3;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
652 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
653 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
654 *p = '\0';
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
655 return out;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
656 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
657
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
658 static char *s3__build_canonical_request(const char *method,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
659 const char *uri,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
660 const char *query,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
661 const char *headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
662 const char *signed_headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
663 const char *payload_hash,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
664 Dowa_Arena *p_arena)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
665 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
666 size_t len = strlen(method) + strlen(uri) + strlen(query) +
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
667 strlen(headers) + strlen(signed_headers) + strlen(payload_hash) + 10;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
668 char *out = Dowa_Arena_Allocate(p_arena, len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
669 snprintf(out, len, "%s\n%s\n%s\n%s\n%s\n%s",
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
670 method, uri, query, headers, signed_headers, payload_hash);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
671 return out;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
672 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
673
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
674 static char *s3__build_string_to_sign(const char *datetime,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
675 const char *date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
676 const char *region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
677 const char *canonical_request,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
678 Dowa_Arena *p_arena)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
679 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
680 // Hash the canonical request
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
681 char canonical_hash[65];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
682 s3__sha256_hex((const uint8 *)canonical_request, strlen(canonical_request), canonical_hash);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
683
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
684 // Build credential scope
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
685 size_t scope_len = strlen(date) + strlen(region) + strlen(S3_SERVICE_NAME) + strlen(S3_AWS4_REQUEST) + 4;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
686 char *scope = Dowa_Arena_Allocate(p_arena, scope_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
687 snprintf(scope, scope_len, "%s/%s/%s/%s", date, region, S3_SERVICE_NAME, S3_AWS4_REQUEST);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
688
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
689 // Build string to sign
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
690 size_t len = strlen(S3_ALGORITHM) + strlen(datetime) + strlen(scope) + strlen(canonical_hash) + 10;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
691 char *out = Dowa_Arena_Allocate(p_arena, len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
692 snprintf(out, len, "%s\n%s\n%s\n%s", S3_ALGORITHM, datetime, scope, canonical_hash);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
693
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
694 return out;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
695 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
696
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
697 static void s3__calculate_signing_key(const char *secret_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
698 const char *date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
699 const char *region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
700 uint8 *out)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
701 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
702 // AWS4 + SecretAccessKey
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
703 size_t key_len = 4 + strlen(secret_key) + 1;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
704 char *k_secret = malloc(key_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
705 snprintf(k_secret, key_len, "AWS4%s", secret_key);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
706
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
707 uint8 k_date[32];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
708 uint8 k_region[32];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
709 uint8 k_service[32];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
710
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
711 s3__hmac_sha256((const uint8 *)k_secret, strlen(k_secret),
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
712 (const uint8 *)date, strlen(date), k_date);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
713
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
714 s3__hmac_sha256(k_date, 32,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
715 (const uint8 *)region, strlen(region), k_region);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
716
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
717 s3__hmac_sha256(k_region, 32,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
718 (const uint8 *)S3_SERVICE_NAME, strlen(S3_SERVICE_NAME), k_service);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
719
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
720 s3__hmac_sha256(k_service, 32,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
721 (const uint8 *)S3_AWS4_REQUEST, strlen(S3_AWS4_REQUEST), out);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
722
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
723 free(k_secret);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
724 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
725
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
726 static char *s3__build_authorization_header(const char *access_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
727 const char *date,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
728 const char *region,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
729 const char *signed_headers,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
730 const uint8 *signing_key,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
731 const char *string_to_sign,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
732 Dowa_Arena *p_arena)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
733 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
734 // Calculate signature
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
735 uint8 signature[32];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
736 s3__hmac_sha256(signing_key, 32,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
737 (const uint8 *)string_to_sign, strlen(string_to_sign),
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
738 signature);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
739
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
740 char signature_hex[65];
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
741 s3__hex_encode(signature, 32, signature_hex);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
742
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
743 // Build credential
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
744 size_t cred_len = strlen(access_key) + strlen(date) + strlen(region) +
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
745 strlen(S3_SERVICE_NAME) + strlen(S3_AWS4_REQUEST) + 10;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
746 char *credential = Dowa_Arena_Allocate(p_arena, cred_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
747 snprintf(credential, cred_len, "%s/%s/%s/%s/%s",
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
748 access_key, date, region, S3_SERVICE_NAME, S3_AWS4_REQUEST);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
749
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
750 // Build full authorization header
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
751 size_t auth_len = strlen(S3_ALGORITHM) + strlen(credential) +
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
752 strlen(signed_headers) + strlen(signature_hex) + 64;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
753 char *auth = Dowa_Arena_Allocate(p_arena, auth_len);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
754 snprintf(auth, auth_len,
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
755 "%s Credential=%s, SignedHeaders=%s, Signature=%s",
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
756 S3_ALGORITHM, credential, signed_headers, signature_hex);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
757
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
758 return auth;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
759 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
760
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
761 static uint8 *s3__load_file(const char *path, size_t *p_size)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
762 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
763 FILE *f = fopen(path, "rb");
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
764 if (!f)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
765 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
766 *p_size = 0;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
767 return NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
768 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
769
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
770 fseek(f, 0, SEEK_END);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
771 long size = ftell(f);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
772 fseek(f, 0, SEEK_SET);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
773
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
774 if (size <= 0)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
775 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
776 fclose(f);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
777 *p_size = 0;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
778 return NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
779 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
780
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
781 uint8 *data = malloc((size_t)size);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
782 if (!data)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
783 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
784 fclose(f);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
785 *p_size = 0;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
786 return NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
787 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
788
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
789 size_t read = fread(data, 1, (size_t)size, f);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
790 fclose(f);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
791
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
792 if (read != (size_t)size)
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
793 {
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
794 free(data);
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
795 *p_size = 0;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
796 return NULL;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
797 }
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
798
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
799 *p_size = (size_t)size;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
800 return data;
83f16548ba41 [AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
801 }