1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-24 15:19:26 -05:00

fix: non ascii buffer response in http server (#12728)

This commit is contained in:
Luca Casonato 2021-11-10 16:48:46 +01:00 committed by GitHub
parent 0cb81951af
commit 6af916c3f4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 51 additions and 1 deletions

10
Cargo.lock generated
View file

@ -3263,6 +3263,15 @@ dependencies = [
"serde_derive",
]
[[package]]
name = "serde_bytes"
version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9"
dependencies = [
"serde",
]
[[package]]
name = "serde_derive"
version = "1.0.130"
@ -3315,6 +3324,7 @@ version = "0.17.0"
dependencies = [
"bencher",
"serde",
"serde_bytes",
"serde_json",
"v8",
]

View file

@ -999,3 +999,31 @@ unitTest(
await Promise.all([server(), client()]);
},
);
unitTest(
{ permissions: { net: true } },
async function httpServerRespondNonAsciiUint8Array() {
const promise = (async () => {
const listener = Deno.listen({ port: 4501 });
const conn = await listener.accept();
listener.close();
const httpConn = Deno.serveHttp(conn);
const e = await httpConn.nextRequest();
assert(e);
const { request, respondWith } = e;
assertEquals(request.body, null);
await respondWith(
new Response(new Uint8Array([128]), {}),
);
httpConn.close();
})();
const resp = await fetch("http://localhost:4501/");
console.log(resp.headers);
assertEquals(resp.status, 200);
const body = await resp.arrayBuffer();
assertEquals(new Uint8Array(body), new Uint8Array([128]));
await promise;
},
);

View file

@ -11,6 +11,7 @@ description = "Rust to V8 serialization and deserialization"
[dependencies]
serde = { version = "1.0.130", features = ["derive"] }
serde_bytes = "0.11"
v8 = "0.34.0"
[dev-dependencies]

View file

@ -30,8 +30,9 @@ impl<'de> serde::Deserialize<'de> for StringOrBuffer {
#[derive(serde::Deserialize)]
#[serde(untagged)]
enum StringOrBufferInner {
String(String),
#[serde(with = "serde_bytes")]
Buffer(Vec<u8>),
String(String),
}
impl StringOrBufferInner {

View file

@ -173,6 +173,16 @@ fn de_string_or_buffer() {
assert_eq!(sob.as_slice(), &[0x68, 0x65, 0x6C, 0x6C, 0x6F]);
});
dedo("new Uint8Array([97])", |scope, v| {
let sob: serde_v8::StringOrBuffer = serde_v8::from_v8(scope, v).unwrap();
assert_eq!(sob.as_slice(), &[97]);
});
dedo("new Uint8Array([128])", |scope, v| {
let sob: serde_v8::StringOrBuffer = serde_v8::from_v8(scope, v).unwrap();
assert_eq!(sob.as_slice(), &[128]);
});
dedo(
"(Uint8Array.from([0x68, 0x65, 0x6C, 0x6C, 0x6F]))",
|scope, v| {