Mercurial
annotate s3/s3_uploader.c @ 279:b3b547563ec7
Add Google connector service and agent wiki
Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code.
Co-authored-by: Copilot <[email protected]>
Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 17 Aug 2026 22:22:36 -0700 |
| parents | 5ec271d612ae |
| 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 |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
77 size_t file_size = 0; |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
78 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
|
79 if (!file_data) |
|
83f16548ba41
[AI] Adding s3 bucket uploader code using Seobeo.
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
80 { |
|
255
5ec271d612ae
[dowa] Enforce arena ownership
MrJuneJune <me@mrjunejune.com>
parents:
206
diff
changeset
|
81 result.p_arena = Dowa_Arena_Create(S3_RESULT_ARENA_SIZE); |
|
196
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); |
|
255
5ec271d612ae
[dowa] Enforce arena ownership
MrJuneJune <me@mrjunejune.com>
parents:
206
diff
changeset
|
89 Dowa_Free(file_data); |
|
196
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 |
|
255
5ec271d612ae
[dowa] Enforce arena ownership
MrJuneJune <me@mrjunejune.com>
parents:
206
diff
changeset
|
709 Dowa_Free(k_secret); |
|
196
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 { |
|
255
5ec271d612ae
[dowa] Enforce arena ownership
MrJuneJune <me@mrjunejune.com>
parents:
206
diff
changeset
|
780 Dowa_Free(data); |
|
196
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 } |