mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
fix(fetch): encode and decode headers as byte strings (#11070)
This commit is contained in:
parent
22e7b0f585
commit
015f252066
3 changed files with 17 additions and 24 deletions
|
@ -23,6 +23,7 @@ pub use serde;
|
||||||
pub use serde_json;
|
pub use serde_json;
|
||||||
pub use serde_v8;
|
pub use serde_v8;
|
||||||
pub use serde_v8::Buffer as ZeroCopyBuf;
|
pub use serde_v8::Buffer as ZeroCopyBuf;
|
||||||
|
pub use serde_v8::ByteString;
|
||||||
pub use url;
|
pub use url;
|
||||||
|
|
||||||
pub use crate::async_cancel::CancelFuture;
|
pub use crate::async_cancel::CancelFuture;
|
||||||
|
|
|
@ -13,6 +13,7 @@ use deno_core::op_async;
|
||||||
use deno_core::op_sync;
|
use deno_core::op_sync;
|
||||||
use deno_core::url::Url;
|
use deno_core::url::Url;
|
||||||
use deno_core::AsyncRefCell;
|
use deno_core::AsyncRefCell;
|
||||||
|
use deno_core::ByteString;
|
||||||
use deno_core::CancelFuture;
|
use deno_core::CancelFuture;
|
||||||
use deno_core::CancelHandle;
|
use deno_core::CancelHandle;
|
||||||
use deno_core::CancelTryFuture;
|
use deno_core::CancelTryFuture;
|
||||||
|
@ -124,9 +125,9 @@ pub fn get_declaration() -> PathBuf {
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct FetchArgs {
|
pub struct FetchArgs {
|
||||||
method: String,
|
method: ByteString,
|
||||||
url: String,
|
url: String,
|
||||||
headers: Vec<(String, String)>,
|
headers: Vec<(ByteString, ByteString)>,
|
||||||
client_rid: Option<u32>,
|
client_rid: Option<u32>,
|
||||||
has_body: bool,
|
has_body: bool,
|
||||||
}
|
}
|
||||||
|
@ -158,7 +159,7 @@ where
|
||||||
client.clone()
|
client.clone()
|
||||||
};
|
};
|
||||||
|
|
||||||
let method = Method::from_bytes(args.method.as_bytes())?;
|
let method = Method::from_bytes(&args.method)?;
|
||||||
let url = Url::parse(&args.url)?;
|
let url = Url::parse(&args.url)?;
|
||||||
|
|
||||||
// Check scheme before asking for net permission
|
// Check scheme before asking for net permission
|
||||||
|
@ -196,8 +197,8 @@ where
|
||||||
};
|
};
|
||||||
|
|
||||||
for (key, value) in args.headers {
|
for (key, value) in args.headers {
|
||||||
let name = HeaderName::from_bytes(key.as_bytes()).unwrap();
|
let name = HeaderName::from_bytes(&key).unwrap();
|
||||||
let v = HeaderValue::from_str(&value).unwrap();
|
let v = HeaderValue::from_bytes(&value).unwrap();
|
||||||
if name != HOST {
|
if name != HOST {
|
||||||
request = request.header(name, v);
|
request = request.header(name, v);
|
||||||
}
|
}
|
||||||
|
@ -281,7 +282,7 @@ where
|
||||||
pub struct FetchResponse {
|
pub struct FetchResponse {
|
||||||
status: u16,
|
status: u16,
|
||||||
status_text: String,
|
status_text: String,
|
||||||
headers: Vec<(String, String)>,
|
headers: Vec<(ByteString, ByteString)>,
|
||||||
url: String,
|
url: String,
|
||||||
response_rid: ResourceId,
|
response_rid: ResourceId,
|
||||||
}
|
}
|
||||||
|
@ -312,20 +313,11 @@ pub async fn op_fetch_send(
|
||||||
let url = res.url().to_string();
|
let url = res.url().to_string();
|
||||||
let mut res_headers = Vec::new();
|
let mut res_headers = Vec::new();
|
||||||
for (key, val) in res.headers().iter() {
|
for (key, val) in res.headers().iter() {
|
||||||
let key_string = key.to_string();
|
let key_bytes: &[u8] = key.as_ref();
|
||||||
|
res_headers.push((
|
||||||
if val.as_bytes().is_ascii() {
|
ByteString(key_bytes.to_owned()),
|
||||||
res_headers.push((key_string, val.to_str().unwrap().to_owned()))
|
ByteString(val.as_bytes().to_owned()),
|
||||||
} else {
|
));
|
||||||
res_headers.push((
|
|
||||||
key_string,
|
|
||||||
val
|
|
||||||
.as_bytes()
|
|
||||||
.iter()
|
|
||||||
.map(|&c| c as char)
|
|
||||||
.collect::<String>(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let stream: BytesStream = Box::pin(res.bytes_stream().map(|r| {
|
let stream: BytesStream = Box::pin(res.bytes_stream().map(|r| {
|
||||||
|
@ -467,7 +459,7 @@ impl HttpClientResource {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub struct CreateHttpClientOptions {
|
pub struct CreateHttpClientOptions {
|
||||||
ca_file: Option<String>,
|
ca_file: Option<String>,
|
||||||
ca_data: Option<String>,
|
ca_data: Option<ByteString>,
|
||||||
proxy: Option<Proxy>,
|
proxy: Option<Proxy>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -522,10 +514,10 @@ where
|
||||||
|
|
||||||
fn get_cert_data(
|
fn get_cert_data(
|
||||||
ca_file: Option<&str>,
|
ca_file: Option<&str>,
|
||||||
ca_data: Option<&str>,
|
ca_data: Option<&[u8]>,
|
||||||
) -> Result<Option<Vec<u8>>, AnyError> {
|
) -> Result<Option<Vec<u8>>, AnyError> {
|
||||||
if let Some(ca_data) = ca_data {
|
if let Some(ca_data) = ca_data {
|
||||||
Ok(Some(ca_data.as_bytes().to_vec()))
|
Ok(Some(ca_data.to_vec()))
|
||||||
} else if let Some(ca_file) = ca_file {
|
} else if let Some(ca_file) = ca_file {
|
||||||
let mut buf = Vec::new();
|
let mut buf = Vec::new();
|
||||||
File::open(ca_file)?.read_to_end(&mut buf)?;
|
File::open(ca_file)?.read_to_end(&mut buf)?;
|
||||||
|
|
|
@ -714,7 +714,7 @@
|
||||||
"basic": {
|
"basic": {
|
||||||
"request-head.any.html": true,
|
"request-head.any.html": true,
|
||||||
"request-headers-case.any.html": false,
|
"request-headers-case.any.html": false,
|
||||||
"request-headers-nonascii.any.html": false,
|
"request-headers-nonascii.any.html": true,
|
||||||
"request-headers.any.html": [
|
"request-headers.any.html": [
|
||||||
"Fetch with PUT without body",
|
"Fetch with PUT without body",
|
||||||
"Fetch with PUT with body",
|
"Fetch with PUT with body",
|
||||||
|
|
Loading…
Add table
Reference in a new issue