summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock10
-rw-r--r--cli/tests/unit/http_test.ts28
-rw-r--r--serde_v8/Cargo.toml1
-rw-r--r--serde_v8/src/magic/string_or_buffer.rs3
-rw-r--r--serde_v8/tests/de.rs10
5 files changed, 51 insertions, 1 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 301b74d31..09052e2eb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3264,6 +3264,15 @@ dependencies = [
]
[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3315,6 +3324,7 @@ version = "0.17.0"
dependencies = [
"bencher",
"serde",
+ "serde_bytes",
"serde_json",
"v8",
]
diff --git a/cli/tests/unit/http_test.ts b/cli/tests/unit/http_test.ts
index d947282db..a6f80eb2c 100644
--- a/cli/tests/unit/http_test.ts
+++ b/cli/tests/unit/http_test.ts
@@ -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;
+ },
+);
diff --git a/serde_v8/Cargo.toml b/serde_v8/Cargo.toml
index c425bed22..1d4c7bd9e 100644
--- a/serde_v8/Cargo.toml
+++ b/serde_v8/Cargo.toml
@@ -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]
diff --git a/serde_v8/src/magic/string_or_buffer.rs b/serde_v8/src/magic/string_or_buffer.rs
index 4518fe082..edde2adcd 100644
--- a/serde_v8/src/magic/string_or_buffer.rs
+++ b/serde_v8/src/magic/string_or_buffer.rs
@@ -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 {
diff --git a/serde_v8/tests/de.rs b/serde_v8/tests/de.rs
index 366d6d2b5..fee532518 100644
--- a/serde_v8/tests/de.rs
+++ b/serde_v8/tests/de.rs
@@ -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| {