Skip to content

Commit 6674ef1

Browse files
committed
Fix bugs in HTTPWasmClient
1 parent 88628b1 commit 6674ef1

File tree

1 file changed

+71
-31
lines changed

1 file changed

+71
-31
lines changed

lib/src/http_wasm.cc

Lines changed: 71 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class HTTPWasmClient : public HTTPClient {
3737
memcpy(z[i], h.first.c_str(), h.first.size());
3838
i++;
3939
z[i] = (char *)malloc(h.second.size() * 4 + 1);
40-
memset(z[i], 0, h.first.size() * 4 + 1);
40+
memset(z[i], 0, h.second.size() * 4 + 1);
4141
memcpy(z[i], h.second.c_str(), h.second.size());
4242
i++;
4343
}
@@ -51,17 +51,27 @@ class HTTPWasmClient : public HTTPClient {
5151
return 0;
5252
}
5353
const xhr = new XMLHttpRequest();
54+
if (false && url.startsWith("http://")) {
55+
url = "https://" + url.substr(7);
56+
}
5457
xhr.open(UTF8ToString($3), url, false);
5558
xhr.responseType = "arraybuffer";
5659

5760
var i = 0;
5861
var len = $1;
59-
while (i < len) {
60-
var ptr1 = HEAP32[($2 + (i * 4)) >> 2];
61-
var ptr2 = HEAP32[($2 + ((i + 1) * 4)) >> 2];
62+
while (i < len*2) {
63+
var ptr1 = HEAP32[($2)/4 + i ];
64+
var ptr2 = HEAP32[($2)/4 + i + 1];
6265

6366
try {
64-
xhr.setRequestHeader(encodeURI(UTF8ToString(ptr1)), encodeURI(UTF8ToString(ptr2)));
67+
var z = encodeURI(UTF8ToString(ptr1));
68+
if (z === "Host") z = "X-Host-Override";
69+
if (z === "Authorization") {
70+
xhr.setRequestHeader(z, UTF8ToString(ptr2));
71+
} else {
72+
73+
xhr.setRequestHeader(z, encodeURI(UTF8ToString(ptr2)));
74+
}
6575
} catch (error) {
6676
console.warn("Error while performing XMLHttpRequest.setRequestHeader()", error);
6777
}
@@ -134,12 +144,12 @@ class HTTPWasmClient : public HTTPClient {
134144
info.content_handler((const unsigned char *)exe + 4, LEN);
135145
}
136146

137-
free(exe);
147+
free(exe);
138148
}
139149

140150
return res;
141151
}
142-
unique_ptr<HTTPResponse> Post(PostRequestInfo &info) override {
152+
unique_ptr<HTTPResponse> Head(HeadRequestInfo &info) override {
143153
unique_ptr<HTTPResponse> res;
144154

145155
string path = host_port + info.url;
@@ -159,7 +169,7 @@ class HTTPWasmClient : public HTTPClient {
159169
memcpy(z[i], h.first.c_str(), h.first.size());
160170
i++;
161171
z[i] = (char *)malloc(h.second.size() * 4 + 1);
162-
memset(z[i], 0, h.first.size() * 4 + 1);
172+
memset(z[i], 0, h.second.size() * 4 + 1);
163173
memcpy(z[i], h.second.c_str(), h.second.size());
164174
i++;
165175
}
@@ -173,29 +183,39 @@ class HTTPWasmClient : public HTTPClient {
173183
return 0;
174184
}
175185
const xhr = new XMLHttpRequest();
186+
if (false && url.startsWith("http://")) {
187+
url = "https://" + url.substr(7);
188+
}
176189
xhr.open(UTF8ToString($3), url, false);
177190
xhr.responseType = "arraybuffer";
178191

179192
var i = 0;
180193
var len = $1;
181-
while (i < len) {
182-
var ptr1 = HEAP32[($2 + (i * 4)) >> 2];
183-
var ptr2 = HEAP32[($2 + ((i + 1) * 4)) >> 2];
194+
while (i < len*2) {
195+
var ptr1 = HEAP32[($2)/4 + i ];
196+
var ptr2 = HEAP32[($2)/4 + i + 1];
184197

185198
try {
186-
xhr.setRequestHeader(encodeURI(UTF8ToString(ptr1)), encodeURI(UTF8ToString(ptr2)));
199+
var z = encodeURI(UTF8ToString(ptr1));
200+
if (z === "Host") z = "X-Host-Override";
201+
if (z === "Authorization") {
202+
xhr.setRequestHeader(z, UTF8ToString(ptr2));
203+
} else {
204+
205+
xhr.setRequestHeader(z, encodeURI(UTF8ToString(ptr2)));
206+
}
187207
} catch (error) {
188208
console.warn("Error while performing XMLHttpRequest.setRequestHeader()", error);
189209
}
190210
i += 2;
191211
}
192212

193213
try {
194-
xhr.send(UTF8ToString($4));
214+
xhr.send(null);
195215
} catch {
196216
return 0;
197217
}
198-
if (xhr.status != 200) return 0;
218+
if (xhr.status >= 400) return 0;
199219
var uInt8Array = xhr.response;
200220

201221
var len = uInt8Array.byteLength;
@@ -222,7 +242,8 @@ class HTTPWasmClient : public HTTPClient {
222242
Module.HEAPU8.set(LEN123, fileOnWasmHeap);
223243
return fileOnWasmHeap;
224244
},
225-
path.c_str(), n, z, "POST", info.buffer_in);
245+
path.c_str(), n, z, "HEAD");
246+
// clang-format on
226247

227248
i = 0;
228249
for (auto h : info.headers) {
@@ -236,8 +257,8 @@ class HTTPWasmClient : public HTTPClient {
236257
if (!exe) {
237258
res = make_uniq<HTTPResponse>(HTTPStatusCode::NotFound_404);
238259
res->reason =
239-
"Unknown error, something went quack in Wasm land! Please consult the console and or the docs at "
240-
"https://duckdb.org/community_extensions/extensions/webmacro";
260+
"Unknown error, something went wrong in Wasm land! Please consult the console and consider reporting a "
261+
"bug";
241262
} else {
242263
res = duckdb::make_uniq<HTTPResponse>(HTTPStatusCode::OK_200);
243264
uint64_t LEN = 0;
@@ -250,15 +271,18 @@ class HTTPWasmClient : public HTTPClient {
250271
LEN *= 256;
251272
LEN += ((uint8_t *)exe)[0];
252273
res->body = string(exe + 4, LEN);
253-
free(exe);
274+
/*
275+
if (info.content_handler) {
276+
info.content_handler((const unsigned char *)exe + 4, LEN);
277+
}
278+
*/
279+
280+
free(exe);
254281
}
255-
// clang-format on
256282

257283
return res;
258284
}
259-
unique_ptr<HTTPResponse> Put(PutRequestInfo &info) override { return nullptr; }
260-
261-
unique_ptr<HTTPResponse> Head(HeadRequestInfo &info) override {
285+
unique_ptr<HTTPResponse> Post(PostRequestInfo &info) override {
262286
unique_ptr<HTTPResponse> res;
263287

264288
string path = host_port + info.url;
@@ -278,7 +302,7 @@ class HTTPWasmClient : public HTTPClient {
278302
memcpy(z[i], h.first.c_str(), h.first.size());
279303
i++;
280304
z[i] = (char *)malloc(h.second.size() * 4 + 1);
281-
memset(z[i], 0, h.first.size() * 4 + 1);
305+
memset(z[i], 0, h.second.size() * 4 + 1);
282306
memcpy(z[i], h.second.c_str(), h.second.size());
283307
i++;
284308
}
@@ -292,29 +316,39 @@ class HTTPWasmClient : public HTTPClient {
292316
return 0;
293317
}
294318
const xhr = new XMLHttpRequest();
319+
if (false && url.startsWith("http://")) {
320+
url = "https://" + url.substr(7);
321+
}
295322
xhr.open(UTF8ToString($3), url, false);
296323
xhr.responseType = "arraybuffer";
297324

298325
var i = 0;
299326
var len = $1;
300-
while (i < len) {
301-
var ptr1 = HEAP32[($2 + (i * 4)) >> 2];
302-
var ptr2 = HEAP32[($2 + ((i + 1) * 4)) >> 2];
327+
while (i < len*2) {
328+
var ptr1 = HEAP32[($2)/4 + i ];
329+
var ptr2 = HEAP32[($2)/4 + i + 1];
303330

304331
try {
305-
xhr.setRequestHeader(encodeURI(UTF8ToString(ptr1)), encodeURI(UTF8ToString(ptr2)));
332+
var z = encodeURI(UTF8ToString(ptr1));
333+
if (z === "Host") z = "X-Host-Override";
334+
if (z === "Authorization") {
335+
xhr.setRequestHeader(z, UTF8ToString(ptr2));
336+
} else {
337+
338+
xhr.setRequestHeader(z, encodeURI(UTF8ToString(ptr2)));
339+
}
306340
} catch (error) {
307341
console.warn("Error while performing XMLHttpRequest.setRequestHeader()", error);
308342
}
309343
i += 2;
310344
}
311345

312346
try {
313-
xhr.send(null);
347+
xhr.send(UTF8ToString($4));
314348
} catch {
315349
return 0;
316350
}
317-
if (xhr.status != 200) return 0;
351+
if (xhr.status >= 400) return 0;
318352
var uInt8Array = xhr.response;
319353

320354
var len = uInt8Array.byteLength;
@@ -341,7 +375,7 @@ class HTTPWasmClient : public HTTPClient {
341375
Module.HEAPU8.set(LEN123, fileOnWasmHeap);
342376
return fileOnWasmHeap;
343377
},
344-
path.c_str(), n, z, "HEAD");
378+
path.c_str(), n, z, "POST", info.buffer_in);
345379
// clang-format on
346380

347381
i = 0;
@@ -370,11 +404,17 @@ class HTTPWasmClient : public HTTPClient {
370404
LEN *= 256;
371405
LEN += ((uint8_t *)exe)[0];
372406
res->body = string(exe + 4, LEN);
373-
free(exe);
407+
/*
408+
if (info.content_handler) {
409+
info.content_handler((const unsigned char *)exe + 4, LEN);
410+
}
411+
*/
412+
free(exe);
374413
}
375414

376415
return res;
377416
}
417+
unique_ptr<HTTPResponse> Put(PutRequestInfo &info) override { return nullptr; }
378418
unique_ptr<HTTPResponse> Delete(DeleteRequestInfo &info) override { return nullptr; }
379419

380420
private:

0 commit comments

Comments
 (0)