1
1
#include " builtins/headers.h"
2
2
#include " builtins/request-response.h"
3
- #include " c-at-e-world/c_at_e_world.h"
4
3
#include " core/sequence.hpp"
4
+ #include " host_interface/host_api.h"
5
5
#include " js-compute-builtins.h"
6
6
7
7
#include " js/Conversions.h"
@@ -243,28 +243,19 @@ bool append_header_value_to_map(JSContext *cx, JS::HandleObject self,
243
243
244
244
bool get_header_names_from_handle (JSContext *cx, uint32_t handle, Headers::Mode mode,
245
245
JS::HandleObject backing_map) {
246
- JS::RootedString name (cx);
247
- JS::RootedValue name_val (cx);
248
- char *buf = static_cast <char *>(JS_malloc (cx, HOSTCALL_BUFFER_LEN));
249
-
250
- bool ok;
251
- fastly_list_string_t ret;
252
- fastly_error_t err;
253
- if (mode == Headers::Mode::ProxyToRequest) {
254
- ok = fastly_http_req_header_names_get (handle, &ret, &err);
255
- } else {
256
- ok = fastly_http_resp_header_names_get (handle, &ret, &err);
257
- }
258
246
259
- if (!ok) {
260
- HANDLE_ERROR (cx, err);
261
- JS_free (cx, buf);
247
+ auto names = mode == Headers::Mode::ProxyToRequest ? HttpReq{handle}.get_header_names ()
248
+ : HttpResp{handle}.get_header_names ();
249
+ if (auto *err = names.to_err ()) {
250
+ HANDLE_ERROR (cx, *err);
262
251
return false ;
263
252
}
264
253
265
- for (size_t i = 0 ; i < ret.len ; i++) {
266
- name = JS_NewStringCopyN (cx, ret.ptr [i].ptr , ret.ptr [i].len );
267
- JS_free (cx, ret.ptr [i].ptr );
254
+ JS::RootedString name (cx);
255
+ JS::RootedValue name_val (cx);
256
+ for (auto &str : names.unwrap ()) {
257
+ // TODO: can `name` take ownership of the buffer here instead?
258
+ name = JS_NewStringCopyN (cx, str.ptr .get (), str.len );
268
259
if (!name) {
269
260
return false ;
270
261
}
@@ -273,8 +264,6 @@ bool get_header_names_from_handle(JSContext *cx, uint32_t handle, Headers::Mode
273
264
JS::MapSet (cx, backing_map, name_val, JS::NullHandleValue);
274
265
}
275
266
276
- JS_free (cx, buf);
277
- JS_free (cx, ret.ptr );
278
267
return true ;
279
268
}
280
269
@@ -284,41 +273,37 @@ bool retrieve_value_for_header_from_handle(JSContext *cx, JS::HandleObject self,
284
273
MOZ_ASSERT (mode != Headers::Mode::Standalone);
285
274
uint32_t handle = get_handle (self);
286
275
287
- c_at_e_world_string_t str;
288
276
JS::RootedString name_str (cx, name.toString ());
289
- JS::UniqueChars name_chars = encode (cx, name_str, &str.len );
290
- str.ptr = name_chars.get ();
291
-
292
- fastly_option_list_string_t ret;
277
+ size_t len;
278
+ JS::UniqueChars name_chars = ::encode (cx, name_str, &len);
279
+ std::string_view hdr{name_chars.get (), len};
293
280
294
- bool ok;
295
- fastly_error_t err;
296
- if (mode == Headers::Mode::ProxyToRequest) {
297
- ok = fastly_http_req_header_values_get (handle, &str, &ret, &err);
298
- } else {
299
- ok = fastly_http_resp_header_values_get (handle, &str, &ret, &err);
300
- }
281
+ auto ret = mode == Headers::Mode::ProxyToRequest ? HttpReq{handle}.get_header_values (hdr)
282
+ : HttpResp{handle}.get_header_values (hdr);
301
283
302
- if (!ok ) {
303
- HANDLE_ERROR (cx, err);
284
+ if (auto *err = ret. to_err () ) {
285
+ HANDLE_ERROR (cx, * err);
304
286
return false ;
305
287
}
306
288
307
- if (!ret.is_some )
289
+ auto &values = ret.unwrap ();
290
+ if (!values.has_value ()) {
308
291
return true ;
292
+ }
309
293
310
294
JS::RootedString val_str (cx);
311
- for (size_t i = 0 ; i < ret.val .len ; i++) {
312
- val_str = JS_NewStringCopyUTF8N (cx, JS::UTF8Chars (ret.val .ptr [i].ptr , ret.val .ptr [i].len ));
313
- JS_free (cx, ret.val .ptr [i].ptr );
314
- if (!val_str)
295
+ for (auto &str : values.value ()) {
296
+ val_str = JS_NewStringCopyUTF8N (cx, JS::UTF8Chars (str.ptr .get (), str.len ));
297
+ if (!val_str) {
315
298
return false ;
299
+ }
300
+
316
301
value.setString (val_str);
317
- if (!append_header_value_to_map (cx, self, name, value))
302
+ if (!append_header_value_to_map (cx, self, name, value)) {
318
303
return false ;
304
+ }
319
305
}
320
306
321
- JS_free (cx, ret.val .ptr );
322
307
return true ;
323
308
}
324
309
@@ -467,27 +452,25 @@ bool Headers::append_header_value(JSContext *cx, JS::HandleObject self, JS::Hand
467
452
468
453
auto mode = get_mode (self);
469
454
if (mode != Headers::Mode::Standalone) {
470
- auto *op = mode == Headers::Mode::ProxyToRequest ? fastly_http_req_header_append
471
- : fastly_http_resp_header_append ;
472
- std::string_view name (name_chars .get (), name_len );
455
+ auto handle = get_handle (self);
456
+ std::string_view name{name_chars. get (), name_len} ;
457
+ std::string_view value (value_chars .get (), value_len );
473
458
if (name == " set-cookie" ) {
474
- std::string_view value (value_chars.get (), value_len);
475
- auto values = splitCookiesString (value);
476
- for (auto value : values) {
477
- c_at_e_world_string_t name = {name_chars.get (), name_len};
478
- c_at_e_world_string_t val = {const_cast <char *>(value.data ()), value.length ()};
479
- fastly_error_t err;
480
- if (!op (get_handle (self), &name, &val, &err)) {
481
- HANDLE_ERROR (cx, err);
459
+ for (auto value : splitCookiesString (value)) {
460
+ auto res = mode == Headers::Mode::ProxyToRequest
461
+ ? HttpReq{handle}.append_header (name, value)
462
+ : HttpResp{handle}.append_header (name, value);
463
+ if (auto *err = res.to_err ()) {
464
+ HANDLE_ERROR (cx, *err);
482
465
return false ;
483
466
}
484
467
}
485
468
} else {
486
- c_at_e_world_string_t name = {name_chars. get (), name_len};
487
- c_at_e_world_string_t val = {value_chars. get (), value_len};
488
- fastly_error_t err ;
489
- if (! op ( get_handle (self), &name, &val, &err )) {
490
- HANDLE_ERROR (cx, err);
469
+ auto res = mode == Headers::Mode::ProxyToRequest
470
+ ? HttpReq{handle}. append_header (name, value)
471
+ : HttpResp{handle}. append_header (name, value) ;
472
+ if (auto *err = res. to_err ( )) {
473
+ HANDLE_ERROR (cx, * err);
491
474
return false ;
492
475
}
493
476
}
@@ -591,13 +574,13 @@ bool Headers::set(JSContext *cx, unsigned argc, JS::Value *vp) {
591
574
592
575
auto mode = get_mode (self);
593
576
if (mode != Mode::Standalone) {
594
- auto *op = mode == Mode::ProxyToRequest ? fastly_http_req_header_insert
595
- : fastly_http_resp_header_insert ;
596
- c_at_e_world_string_t name = {name_chars .get (), name_len };
597
- c_at_e_world_string_t val = {value_chars. get (), value_len};
598
- fastly_error_t err ;
599
- if (! op ( get_handle (self), &name, &val, &err )) {
600
- HANDLE_ERROR (cx, err);
577
+ auto handle = get_handle (self);
578
+ std::string_view name{name_chars. get (), name_len} ;
579
+ std::string_view val{value_chars .get (), value_len };
580
+ auto res = mode == Mode::ProxyToRequest ? HttpReq{handle}. insert_header (name, val)
581
+ : HttpResp{handle}. insert_header (name, val) ;
582
+ if (auto *err = res. to_err ( )) {
583
+ HANDLE_ERROR (cx, * err);
601
584
return false ;
602
585
}
603
586
}
@@ -681,12 +664,12 @@ bool Headers::delete_(JSContext *cx, unsigned argc, JS::Value *vp) {
681
664
682
665
auto mode = get_mode (self);
683
666
if (mode != Headers::Mode::Standalone) {
684
- auto *op = mode == Mode::ProxyToRequest ? fastly_http_req_header_remove
685
- : fastly_http_resp_header_remove ;
686
- c_at_e_world_string_t name = {name_chars. get (), name_len};
687
- fastly_error_t err ;
688
- if (! op ( get_handle (self), &name, & err)) {
689
- HANDLE_ERROR (cx, err);
667
+ auto handle = get_handle (self);
668
+ std::string_view name{name_chars. get (), name_len} ;
669
+ auto res = mode == Mode::ProxyToRequest ? HttpReq{handle}. remove_header (name)
670
+ : HttpResp{handle}. remove_header (name) ;
671
+ if (auto * err = res. to_err ( )) {
672
+ HANDLE_ERROR (cx, * err);
690
673
return false ;
691
674
}
692
675
}
0 commit comments