summaryrefslogtreecommitdiff
path: root/extensions/http/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/http/lib.rs')
-rw-r--r--extensions/http/lib.rs37
1 files changed, 33 insertions, 4 deletions
diff --git a/extensions/http/lib.rs b/extensions/http/lib.rs
index a8d92ab46..a20e74c03 100644
--- a/extensions/http/lib.rs
+++ b/extensions/http/lib.rs
@@ -217,12 +217,41 @@ async fn op_http_request_next(
let req = request_resource.request;
let method = req.method().to_string();
+ // We treat cookies specially, because we don't want them to get them
+ // mangled by the `Headers` object in JS. What we do is take all cookie
+ // headers and concat them into a single cookie header, seperated by
+ // semicolons.
+ let mut total_cookie_length = 0;
+ let mut cookies = vec![];
+
let mut headers = Vec::with_capacity(req.headers().len());
for (name, value) in req.headers().iter() {
- let name: &[u8] = name.as_ref();
- let value = value.as_bytes();
- headers
- .push((ByteString(name.to_owned()), ByteString(value.to_owned())));
+ if name == hyper::header::COOKIE {
+ let bytes = value.as_bytes();
+ total_cookie_length += bytes.len();
+ cookies.push(bytes);
+ } else {
+ let name: &[u8] = name.as_ref();
+ let value = value.as_bytes();
+ headers
+ .push((ByteString(name.to_owned()), ByteString(value.to_owned())));
+ }
+ }
+
+ if !cookies.is_empty() {
+ let cookie_count = cookies.len();
+ total_cookie_length += (cookie_count * 2) - 2;
+ let mut bytes = Vec::with_capacity(total_cookie_length);
+ for (i, cookie) in cookies.into_iter().enumerate() {
+ bytes.extend(cookie);
+ if i != cookie_count - 1 {
+ bytes.extend("; ".as_bytes());
+ }
+ }
+ headers.push((
+ ByteString("cookie".as_bytes().to_owned()),
+ ByteString(bytes),
+ ));
}
let url = {