Mercurial
annotate s3/s3_uploader.c @ 207:58d9b64d8dca
Updated deployment script to include sqlite3
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sun, 15 Feb 2026 12:25:50 -0800 |
| parents | 240337164a80 |
| children |
| 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) |
|
206
240337164a80
[Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents:
201
diff
changeset
|
156 // Note: Content-Length is NOT signed for S3 PUT requests (it's sent but not in signature) |
|
240337164a80
[Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents:
201
diff
changeset
|
157 size_t headers_len = 512 + strlen(host) + strlen(content_type); |
|
196
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
158 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
|
159 snprintf(canonical_headers, headers_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
160 "content-type:%s\n" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
161 "host:%s\n" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
162 "x-amz-content-sha256:%s\n" |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
163 "x-amz-date:%s\n", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
164 content_type, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
165 host, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
166 payload_hash, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
167 ts.datetime); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
168 |
|
206
240337164a80
[Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents:
201
diff
changeset
|
169 const char *signed_headers = "content-type;host;x-amz-content-sha256;x-amz-date"; |
|
196
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
170 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
171 // Build canonical request |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
172 char *canonical_request = s3__build_canonical_request("PUT", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
173 uri_path, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
174 "", // No query string |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
175 canonical_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
176 signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
177 payload_hash, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
178 p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
179 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
180 // Build string to sign |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
181 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
|
182 ts.date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
183 p_config->region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
184 canonical_request, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
185 p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
186 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
187 // Calculate signing key |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
188 uint8 signing_key[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
189 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
|
190 ts.date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
191 p_config->region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
192 signing_key); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
193 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
194 // Build authorization header |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
195 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
|
196 ts.date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
197 p_config->region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
198 signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
199 signing_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
200 string_to_sign, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
201 p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
202 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
203 // Build URL |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
204 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
|
205 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
|
206 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
|
207 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
208 // Execute request using seobeo |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
209 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
|
210 Seobeo_Client_Request_Set_Method(p_req, "PUT"); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
211 Seobeo_Client_Request_Set_Body(p_req, (const char *)data, data_length); |
|
206
240337164a80
[Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents:
201
diff
changeset
|
212 Seobeo_Client_Request_Add_Header_Map(p_req, "Connection", "keep-alive"); |
|
196
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
213 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
|
214 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
|
215 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
|
216 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
|
217 |
|
206
240337164a80
[Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents:
201
diff
changeset
|
218 Seobeo_Log(SEOBEO_DEBUG, "[S3] Uploading %zu bytes to %s\n", data_length, url); |
|
240337164a80
[Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents:
201
diff
changeset
|
219 Seobeo_Log(SEOBEO_DEBUG, "[S3] Content-Type: %s\n", content_type); |
|
240337164a80
[Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents:
201
diff
changeset
|
220 Seobeo_Log(SEOBEO_DEBUG, "[S3] x-amz-date: %s\n", ts.datetime); |
|
240337164a80
[Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents:
201
diff
changeset
|
221 Seobeo_Log(SEOBEO_DEBUG, "[S3] x-amz-content-sha256: %s\n", payload_hash); |
|
240337164a80
[Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents:
201
diff
changeset
|
222 Seobeo_Log(SEOBEO_DEBUG, "[S3] Authorization: %.80s...\n", auth_header); |
|
240337164a80
[Seobeo] SSL should be used for large file as well lol.
MrJuneJune <me@mrjunejune.com>
parents:
201
diff
changeset
|
223 |
|
196
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
224 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
|
225 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
226 if (p_resp) |
|
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.status_code = p_resp->status_code; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
229 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
|
230 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
231 result.success = TRUE; |
|
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 // Extract ETag from response headers |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
234 if (p_resp->headers) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
235 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
236 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
|
237 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
|
238 if (etag) |
|
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 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
|
241 } |
|
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 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
244 else |
|
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.success = FALSE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
247 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
|
248 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
249 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
|
250 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
251 else |
|
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 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
|
254 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
255 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
256 Seobeo_Client_Response_Destroy(p_resp); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
257 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
258 else |
|
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 result.success = FALSE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
261 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
|
262 } |
|
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 Seobeo_Client_Request_Destroy(p_req); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
265 Dowa_Arena_Free(p_arena); |
|
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 return 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 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
270 void S3_Result_Destroy(S3_Result *p_result) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
271 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
272 if (p_result && p_result->p_arena) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
273 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
274 Dowa_Arena_Free(p_result->p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
275 p_result->p_arena = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
276 p_result->error_message = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
277 p_result->etag = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
278 } |
|
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 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
281 // --- Presigned URL Implementation --- // |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
282 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
283 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
|
284 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
285 // 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
|
286 if (!str) return NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
287 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
288 size_t len = strlen(str); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
289 size_t max_len = len * 3 + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
290 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
|
291 char *p = out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
292 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
293 for (size_t i = 0; i < len; i++) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
294 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
295 char c = str[i]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
296 if ((c >= 'A' && c <= 'Z') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
297 (c >= 'a' && c <= 'z') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
298 (c >= '0' && c <= '9') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
299 c == '-' || c == '_' || c == '.' || c == '~') |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
300 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
301 *p++ = c; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
302 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
303 else |
|
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 sprintf(p, "%%%02X", (unsigned char)c); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
306 p += 3; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
307 } |
|
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 *p = '\0'; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
310 return out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
311 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
312 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
313 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
|
314 const char *s3_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
315 const char *method, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
316 const char *content_type, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
317 int32 expires_seconds) |
|
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 S3_Presigned_URL result = {0}; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
320 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
|
321 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
322 if (!p_config || !s3_key) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
323 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
324 result.success = FALSE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
325 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
|
326 return result; |
|
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 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
329 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
|
330 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
331 // Get timestamp |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
332 S3_Timestamp ts; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
333 s3__get_timestamp(&ts); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
334 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
335 // Build host |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
336 char *host; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
337 if (p_config->endpoint) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
338 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
339 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
|
340 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
341 else if (p_config->use_path_style) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
342 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
343 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
|
344 host = Dowa_Arena_Allocate(p_arena, host_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
345 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
|
346 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
347 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
348 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
349 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
|
350 host = Dowa_Arena_Allocate(p_arena, host_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
351 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
|
352 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
353 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
354 // Build URI path |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
355 char *uri_path; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
356 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
|
357 if (p_config->use_path_style) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
358 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
359 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
|
360 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
|
361 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
|
362 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
363 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
364 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
365 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
|
366 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
|
367 snprintf(uri_path, uri_len, "/%s", encoded_key); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
368 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
369 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
370 // Build credential scope |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
371 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
|
372 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
|
373 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
|
374 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
|
375 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
|
376 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
377 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
|
378 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
379 // 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
|
380 const char *signed_headers; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
381 if (content_type && strcmp(method, "PUT") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
382 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
383 signed_headers = "content-type;host"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
384 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
385 else |
|
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 signed_headers = "host"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
388 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
389 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
390 // Build canonical query string (must be sorted alphabetically) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
391 char expires_str[16]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
392 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
|
393 |
| 201 | 394 // URL-encode signed headers (semicolon becomes %3B) |
| 395 char *encoded_signed_headers = s3__uri_encode_strict(signed_headers, p_arena); | |
| 396 | |
|
196
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
397 size_t query_len = 1024 + strlen(encoded_credential); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
398 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
|
399 |
| 201 | 400 snprintf(canonical_query, query_len, |
| 401 "X-Amz-Algorithm=%s" | |
| 402 "&X-Amz-Credential=%s" | |
| 403 "&X-Amz-Date=%s" | |
| 404 "&X-Amz-Expires=%s" | |
| 405 "&X-Amz-SignedHeaders=%s", | |
| 406 S3_ALGORITHM, | |
| 407 encoded_credential, | |
| 408 ts.datetime, | |
| 409 expires_str, | |
| 410 encoded_signed_headers); | |
|
196
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
411 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
412 // Build canonical headers |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
413 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
|
414 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
|
415 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
416 if (content_type && strcmp(method, "PUT") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
417 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
418 snprintf(canonical_headers, headers_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
419 "content-type:%s\nhost:%s\n", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
420 content_type, host); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
421 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
422 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
423 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
424 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
|
425 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
426 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
427 // For presigned URLs, payload is UNSIGNED-PAYLOAD |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
428 const char *payload_hash = "UNSIGNED-PAYLOAD"; |
|
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 // Build canonical request |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
431 char *canonical_request = s3__build_canonical_request(method, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
432 uri_path, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
433 canonical_query, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
434 canonical_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
435 signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
436 payload_hash, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
437 p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
438 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
439 // Build string to sign |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
440 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
|
441 ts.date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
442 p_config->region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
443 canonical_request, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
444 p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
445 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
446 // Calculate signing key |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
447 uint8 signing_key[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
448 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
|
449 ts.date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
450 p_config->region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
451 signing_key); |
|
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 // Calculate signature |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
454 uint8 signature[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
455 s3__hmac_sha256(signing_key, 32, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
456 (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
|
457 signature); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
458 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
459 char signature_hex[65]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
460 s3__hex_encode(signature, 32, signature_hex); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
461 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
462 // Build final presigned URL |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
463 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
|
464 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
|
465 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
|
466 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
|
467 host, uri_path, canonical_query, signature_hex); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
468 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
469 result.success = TRUE; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
470 result.url = url; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
471 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
472 Dowa_Arena_Free(p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
473 return result; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
474 } |
|
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 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
|
477 const char *s3_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
478 const char *content_type, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
479 int32 expires_seconds) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
480 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
481 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
|
482 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
483 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
484 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
|
485 const char *s3_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
486 int32 expires_seconds) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
487 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
488 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
|
489 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
490 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
491 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
|
492 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
493 if (p_url && p_url->p_arena) |
|
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 Dowa_Arena_Free(p_url->p_arena); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
496 p_url->p_arena = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
497 p_url->url = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
498 p_url->error_message = NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
499 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
500 } |
|
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 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
|
503 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
504 if (!filename) return "application/octet-stream"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
505 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
506 const char *dot = strrchr(filename, '.'); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
507 if (!dot) return "application/octet-stream"; |
|
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 dot++; // Skip the dot |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
510 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
511 // Common content types |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
512 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
|
513 return "text/html"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
514 if (strcasecmp(dot, "css") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
515 return "text/css"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
516 if (strcasecmp(dot, "js") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
517 return "application/javascript"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
518 if (strcasecmp(dot, "json") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
519 return "application/json"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
520 if (strcasecmp(dot, "xml") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
521 return "application/xml"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
522 if (strcasecmp(dot, "txt") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
523 return "text/plain"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
524 if (strcasecmp(dot, "csv") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
525 return "text/csv"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
526 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
527 // Images |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
528 if (strcasecmp(dot, "png") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
529 return "image/png"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
530 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
|
531 return "image/jpeg"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
532 if (strcasecmp(dot, "gif") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
533 return "image/gif"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
534 if (strcasecmp(dot, "svg") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
535 return "image/svg+xml"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
536 if (strcasecmp(dot, "webp") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
537 return "image/webp"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
538 if (strcasecmp(dot, "ico") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
539 return "image/x-icon"; |
|
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 // Audio/Video |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
542 if (strcasecmp(dot, "mp3") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
543 return "audio/mpeg"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
544 if (strcasecmp(dot, "mp4") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
545 return "video/mp4"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
546 if (strcasecmp(dot, "webm") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
547 return "video/webm"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
548 if (strcasecmp(dot, "ogg") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
549 return "audio/ogg"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
550 if (strcasecmp(dot, "wav") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
551 return "audio/wav"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
552 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
553 // Documents |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
554 if (strcasecmp(dot, "pdf") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
555 return "application/pdf"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
556 if (strcasecmp(dot, "zip") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
557 return "application/zip"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
558 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
|
559 return "application/gzip"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
560 if (strcasecmp(dot, "tar") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
561 return "application/x-tar"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
562 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
563 // Fonts |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
564 if (strcasecmp(dot, "woff") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
565 return "font/woff"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
566 if (strcasecmp(dot, "woff2") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
567 return "font/woff2"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
568 if (strcasecmp(dot, "ttf") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
569 return "font/ttf"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
570 if (strcasecmp(dot, "otf") == 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
571 return "font/otf"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
572 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
573 return "application/octet-stream"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
574 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
575 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
576 // --- Internal Implementation --- // |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
577 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
578 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
|
579 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
580 time_t now = time(NULL); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
581 struct tm *utc = gmtime(&now); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
582 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
583 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
|
584 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
|
585 } |
|
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 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
|
588 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
589 static const char hex[] = "0123456789abcdef"; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
590 for (size_t i = 0; i < len; i++) |
|
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 out[i * 2] = hex[(data[i] >> 4) & 0x0F]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
593 out[i * 2 + 1] = hex[data[i] & 0x0F]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
594 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
595 out[len * 2] = '\0'; |
|
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 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
598 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
|
599 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
600 uint8 hash[SHA256_DIGEST_LENGTH]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
601 SHA256(data, len, hash); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
602 s3__hex_encode(hash, SHA256_DIGEST_LENGTH, out); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
603 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
604 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
605 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
|
606 const uint8 *data, size_t data_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
607 uint8 *out) |
|
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 unsigned int out_len = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
610 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
|
611 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
612 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
613 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
|
614 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
615 if (!str) return NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
616 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
617 size_t len = strlen(str); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
618 // Worst case: every char becomes %XX (3 chars) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
619 size_t max_len = len * 3 + 1; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
620 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
|
621 char *p = 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 for (size_t i = 0; i < len; i++) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
624 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
625 char c = str[i]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
626 // Unreserved characters per RFC 3986 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
627 if ((c >= 'A' && c <= 'Z') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
628 (c >= 'a' && c <= 'z') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
629 (c >= '0' && c <= '9') || |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
630 c == '-' || c == '_' || c == '.' || c == '~' || c == '/') |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
631 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
632 *p++ = c; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
633 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
634 else |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
635 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
636 sprintf(p, "%%%02X", (unsigned char)c); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
637 p += 3; |
|
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 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
640 *p = '\0'; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
641 return out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
642 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
643 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
644 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
|
645 const char *uri, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
646 const char *query, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
647 const char *headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
648 const char *signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
649 const char *payload_hash, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
650 Dowa_Arena *p_arena) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
651 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
652 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
|
653 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
|
654 char *out = Dowa_Arena_Allocate(p_arena, len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
655 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
|
656 method, uri, query, headers, signed_headers, payload_hash); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
657 return out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
658 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
659 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
660 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
|
661 const char *date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
662 const char *region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
663 const char *canonical_request, |
|
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 // Hash the canonical request |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
667 char canonical_hash[65]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
668 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
|
669 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
670 // Build credential scope |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
671 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
|
672 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
|
673 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
|
674 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
675 // Build string to sign |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
676 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
|
677 char *out = Dowa_Arena_Allocate(p_arena, len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
678 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
|
679 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
680 return out; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
681 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
682 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
683 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
|
684 const char *date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
685 const char *region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
686 uint8 *out) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
687 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
688 // AWS4 + SecretAccessKey |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
689 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
|
690 char *k_secret = malloc(key_len); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
691 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
|
692 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
693 uint8 k_date[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
694 uint8 k_region[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
695 uint8 k_service[32]; |
|
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 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
|
698 (const uint8 *)date, strlen(date), k_date); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
699 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
700 s3__hmac_sha256(k_date, 32, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
701 (const uint8 *)region, strlen(region), k_region); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
702 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
703 s3__hmac_sha256(k_region, 32, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
704 (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
|
705 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
706 s3__hmac_sha256(k_service, 32, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
707 (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
|
708 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
709 free(k_secret); |
|
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 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
712 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
|
713 const char *date, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
714 const char *region, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
715 const char *signed_headers, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
716 const uint8 *signing_key, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
717 const char *string_to_sign, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
718 Dowa_Arena *p_arena) |
|
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 // Calculate signature |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
721 uint8 signature[32]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
722 s3__hmac_sha256(signing_key, 32, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
723 (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
|
724 signature); |
|
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 char signature_hex[65]; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
727 s3__hex_encode(signature, 32, signature_hex); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
728 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
729 // Build credential |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
730 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
|
731 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
|
732 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
|
733 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
|
734 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
|
735 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
736 // Build full authorization header |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
737 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
|
738 strlen(signed_headers) + strlen(signature_hex) + 64; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
739 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
|
740 snprintf(auth, auth_len, |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
741 "%s Credential=%s, SignedHeaders=%s, Signature=%s", |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
742 S3_ALGORITHM, credential, signed_headers, signature_hex); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
743 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
744 return auth; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
745 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
746 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
747 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
|
748 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
749 FILE *f = fopen(path, "rb"); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
750 if (!f) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
751 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
752 *p_size = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
753 return NULL; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
754 } |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
755 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
756 fseek(f, 0, SEEK_END); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
757 long size = ftell(f); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
758 fseek(f, 0, SEEK_SET); |
|
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 if (size <= 0) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
761 { |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
762 fclose(f); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
763 *p_size = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
764 return NULL; |
|
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 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
767 uint8 *data = malloc((size_t)size); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
768 if (!data) |
|
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 fclose(f); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
771 *p_size = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
772 return NULL; |
|
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 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
775 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
|
776 fclose(f); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
777 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
778 if (read != (size_t)size) |
|
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 free(data); |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
781 *p_size = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
782 return NULL; |
|
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 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
785 *p_size = (size_t)size; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
786 return data; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
787 } |