Skip to content

Commit 7912496

Browse files
committed
update apis
1 parent 220a623 commit 7912496

File tree

7 files changed

+84
-89
lines changed

7 files changed

+84
-89
lines changed

index.d.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -257,27 +257,28 @@ export declare class TestServer {
257257
process(request: TestRequest): Promise<TestResponse>
258258
}
259259
export declare class TestRequest {
260-
constructor(props: { method?: string, uri: string, headers?: { [key: string]: string }, body?: any })
260+
constructor(props: { method?: string, uri: string, headers?: { [key: string]: string }, body?: any, cookies?: Cookie[] })
261261
get method(): string
262262
set method(method: string)
263263
get uri(): string
264264
set uri(uri: string)
265-
insertHeader(key: string, value: string): void
266-
appendHeader(key: string, value: string): void
265+
get headers(): Headers
266+
set headers(headers: Headers)
267+
insertHeader(key: string, value: string): this
268+
appendHeader(key: string, value: string): this
267269
get body(): Buffer
268270
set body(body: Buffer)
271+
get cookies(): Cookies
272+
set cookies(cookies: Cookies)
269273
}
270274
export declare class TestResponse {
271275
get status(): number
272276
get version(): string
273277
body(): Buffer
274278
bodyAsString(): string
275279
bodyAsJson(): any
276-
containsHeader(name: string): boolean
277-
headerValue(name: string): string | null
278-
headerValues(name: string): Array<string>
279-
headerKeys(): string[]
280-
headersLength(): number
280+
get headers(): Headers
281+
get cookies(): Cookies
281282
}
282283
export class TeoError extends Error {
283284
constructor(message: string, code?: number, errors?: { [key: string]: string } | null)

src/cookies/cookies.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use napi::{Env, JsFunction, JsUnknown, Result};
22
use teo::prelude::cookies::Cookies as OriginalCookies;
33
use super::cookie::Cookie;
44

5+
#[derive(Clone)]
56
#[napi]
67
pub struct Cookies {
78
original: OriginalCookies

src/headers/headers.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use teo::prelude::headers::Headers as OriginalHeaders;
22
use napi::Result;
33

4+
#[derive(Clone)]
45
#[napi]
56
pub struct Headers {
67
original: OriginalHeaders

src/object/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub fn js_any_to_teo_value(any: JsUnknown, env: Env) -> Result<Value> {
5050
let len = object.get_array_length()?;
5151
let mut result: Vec<Value> = vec![];
5252
for n in 0..len {
53-
let item: JsUnknown = object.get_element(n).unwrap();
53+
let item: JsUnknown = object.get_element(n)?;
5454
result.push(js_any_to_teo_value(item, env)?);
5555
}
5656
Value::Array(result)

src/test/test_request.rs

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
use std::str::FromStr;
22
use hyper::{header::{HeaderName, HeaderValue}, HeaderMap, Method};
3-
use napi::{bindgen_prelude::Buffer, Env, JsBuffer, JsFunction, JsObject, JsString, JsUnknown, Result, ValueType};
3+
use napi::{bindgen_prelude::{Buffer, FromNapiRef}, Env, JsBuffer, JsFunction, JsObject, JsString, JsUnknown, NapiRaw, Result, ValueType};
44
use http_body_util::Full;
55
use bytes::Bytes;
6+
use crate::{cookies::{Cookie, Cookies}, headers::headers::Headers};
67

78
#[napi]
89
pub struct TestRequest {
910
method: Method,
1011
uri: String,
11-
headers: HeaderMap,
12+
headers: Headers,
1213
body: Bytes,
14+
cookies: Cookies,
1315
}
1416

1517
#[napi]
1618
impl TestRequest {
17-
#[napi(constructor, ts_args_type = "props: { method?: string, uri: string, headers?: { [key: string]: string }, body?: any }")]
19+
#[napi(constructor, ts_args_type = "props: { method?: string, uri: string, headers?: { [key: string]: string }, body?: any, cookies?: Cookie[] }")]
1820
pub fn new(props: JsObject, env: Env) -> Result<Self> {
1921
let method: Option<String> = props.get_named_property("method")?;
2022
let method = match method {
@@ -42,6 +44,8 @@ impl TestRequest {
4244
});
4345
}
4446
}
47+
let headers = teo::prelude::headers::Headers::from(headers);
48+
let headers = Headers::from(headers);
4549
let body: Option<JsUnknown> = props.get_named_property("body")?;
4650
let body = match body {
4751
Some(body) => {
@@ -70,11 +74,23 @@ impl TestRequest {
7074
},
7175
None => Bytes::new(),
7276
};
77+
let mut cookies = vec![];
78+
let cookies_object: Option<JsObject> = props.get_named_property("cookies")?;
79+
if let Some(cookies_object) = cookies_object {
80+
let len = cookies_object.get_array_length()?;
81+
for n in 0..len {
82+
let item_object: JsUnknown = cookies_object.get_element(n)?;
83+
let cookie: &Cookie = unsafe { Cookie::from_napi_ref(env.raw(), item_object.raw())? };
84+
cookies.push(cookie);
85+
}
86+
}
87+
let cookies = Cookies::new(Some(cookies));
7388
Ok(Self {
7489
method,
7590
uri,
7691
headers,
7792
body,
93+
cookies,
7894
})
7995
}
8096

@@ -104,28 +120,26 @@ impl TestRequest {
104120
self.uri = uri;
105121
}
106122

123+
#[napi(getter)]
124+
pub fn headers(&self) -> Headers {
125+
self.headers.clone()
126+
}
127+
128+
#[napi(setter)]
129+
pub fn set_headers(&mut self, headers: &Headers) {
130+
self.headers = headers.clone();
131+
}
132+
107133
#[napi]
108-
pub fn insert_header(&mut self, key: String, value: String) -> Result<()> {
109-
self.headers.insert(match HeaderName::try_from(key) {
110-
Ok(value) => value,
111-
Err(_) => return Err(teo_result::Error::internal_server_error_message("cannot parse header name").into()),
112-
}, match HeaderValue::from_str(value.as_str()) {
113-
Ok(value) => value,
114-
Err(_) => return Err(teo_result::Error::internal_server_error_message("cannot parse header value").into()),
115-
});
116-
Ok(())
134+
pub fn insert_header(&mut self, key: String, value: String) -> Result<&Self> {
135+
self.headers.set(key, value)?;
136+
Ok(self)
117137
}
118138

119139
#[napi]
120-
pub fn append_header(&mut self, key: String, value: String) -> Result<()> {
121-
self.headers.append(match HeaderName::try_from(key) {
122-
Ok(value) => value,
123-
Err(_) => return Err(teo_result::Error::internal_server_error_message("cannot parse header name").into()),
124-
}, match HeaderValue::from_str(value.as_str()) {
125-
Ok(value) => value,
126-
Err(_) => return Err(teo_result::Error::internal_server_error_message("cannot parse header value").into()),
127-
});
128-
Ok(())
140+
pub fn append_header(&mut self, key: String, value: String) -> Result<&Self> {
141+
self.headers.append(key, value)?;
142+
Ok(self)
129143
}
130144

131145
#[napi(getter)]
@@ -139,13 +153,25 @@ impl TestRequest {
139153
self.body = Bytes::copy_from_slice(&body_vec);
140154
}
141155

156+
#[napi(getter)]
157+
pub fn cookies(&self) -> Cookies {
158+
self.cookies.clone()
159+
}
160+
161+
#[napi(setter)]
162+
pub fn set_cookies(&mut self, cookies: &Cookies) {
163+
self.cookies = cookies.clone();
164+
}
165+
142166
pub(crate) fn to_hyper_request(&self) -> hyper::Request<Full<Bytes>> {
143-
let mut request = hyper::Request::builder()
167+
let request = hyper::Request::builder()
144168
.method(self.method.clone())
145169
.uri(self.uri.clone());
146-
for (key, value) in self.headers.iter() {
147-
request = request.header(key.clone(), value.clone());
170+
let mut request = request.body(Full::new(self.body.clone())).unwrap();
171+
self.headers.original().extend_to(request.headers_mut());
172+
for cookie in self.cookies.original().iter() {
173+
request.headers_mut().append("Cookie", HeaderValue::try_from(cookie.encoded()).unwrap());
148174
}
149-
request.body(Full::new(self.body.clone())).unwrap()
175+
request
150176
}
151177
}

src/test/test_response.rs

Lines changed: 20 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,44 @@
11
use napi::{bindgen_prelude::Buffer, Env, JsFunction, JsGlobal, JsObject, JsUnknown, Result};
2+
use teo::server::test_response::TestResponse as OriginalTestResponse;
3+
use crate::{cookies::Cookies, headers::headers::Headers};
24

35
#[napi]
46
pub struct TestResponse {
5-
teo_test_response: teo::server::test_response::TestResponse,
7+
original: OriginalTestResponse,
8+
}
9+
10+
impl From<OriginalTestResponse> for TestResponse {
11+
fn from(original: OriginalTestResponse) -> Self {
12+
Self { original }
13+
}
614
}
715

816
#[napi]
917
impl TestResponse {
10-
pub(super) fn new(teo_test_response: teo::server::test_response::TestResponse) -> Self {
11-
Self {
12-
teo_test_response,
13-
}
14-
}
1518

1619
#[napi(getter)]
1720
pub fn status(&self) -> u16 {
18-
self.teo_test_response.status().as_u16()
21+
self.original.status().as_u16()
1922
}
2023

2124
#[napi(getter)]
2225
pub fn version(&self) -> String {
23-
format!("{:?}", self.teo_test_response.version())
26+
format!("{:?}", self.original.version())
2427
}
2528

2629
#[napi]
2730
pub fn body(&self) -> Buffer {
28-
Buffer::from(Vec::<u8>::from(self.teo_test_response.body().clone()))
31+
Buffer::from(Vec::<u8>::from(self.original.body().clone()))
2932
}
3033

3134
#[napi]
3235
pub fn body_as_string(&self) -> String {
33-
self.teo_test_response.body_as_string()
36+
self.original.body_as_string()
3437
}
3538

3639
#[napi(ts_return_type = "any")]
3740
pub fn body_as_json(&self, env: Env) -> Result<JsUnknown> {
38-
let string = self.teo_test_response.body_as_string();
41+
let string = self.original.body_as_string();
3942
let js_string = env.create_string(&string)?;
4043
let global: JsGlobal = env.get_global()?;
4144
let json: JsObject = global.get_named_property("JSON")?;
@@ -44,50 +47,13 @@ impl TestResponse {
4447
Ok(json_result)
4548
}
4649

47-
#[napi]
48-
pub fn contains_header(&self, name: String) -> bool {
49-
self.teo_test_response.headers().contains_key(name.as_str())
50-
}
51-
52-
#[napi]
53-
pub fn header_value(&self, name: String) -> Result<Option<&str>> {
54-
let header_value = self.teo_test_response.headers().get(name.as_str());
55-
match header_value {
56-
None => Ok(None),
57-
Some(header_value) => {
58-
let header_value = header_value.to_str().map_err(|_| {
59-
teo_result::Error::internal_server_error_message(format!("cannot read request header value: {}", name))
60-
})?;
61-
Ok(Some(header_value))
62-
}
63-
}
64-
}
65-
66-
#[napi]
67-
pub fn header_values(&self, name: String) -> Result<Vec<&str>> {
68-
let header_values = self.teo_test_response.headers().get_all(name.as_str());
69-
let mut result = Vec::new();
70-
for header_value in header_values {
71-
let header_value = header_value.to_str().map_err(|_| {
72-
teo_result::Error::internal_server_error_message(format!("cannot read request header value: {}", name))
73-
})?;
74-
result.push(header_value);
75-
}
76-
Ok(result)
77-
}
78-
79-
#[napi(js_name = "headerKeys", ts_return_type = "string[]")]
80-
pub fn header_keys(&self) -> Vec<&str> {
81-
let header_map = self.teo_test_response.headers();
82-
let mut result = vec![];
83-
header_map.keys().for_each(|k| {
84-
result.push(k.as_str());
85-
});
86-
result
50+
#[napi(getter)]
51+
pub fn headers(&self) -> Headers {
52+
Headers::from(self.original.headers().clone())
8753
}
8854

89-
#[napi]
90-
pub fn headers_length(&self) -> i64 {
91-
self.teo_test_response.headers().len() as i64
55+
#[napi(getter)]
56+
pub fn cookies(&self) -> Cookies {
57+
Cookies::from(self.original.cookies().clone())
9258
}
9359
}

src/test/test_server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,6 @@ impl TestServer {
3737
pub async fn process(&self, request: &TestRequest) -> Result<TestResponse> {
3838
let hyper_request = request.to_hyper_request();
3939
let response = self.server.process_test_request_with_hyper_request(hyper_request).await?;
40-
Ok(TestResponse::new(response))
40+
Ok(TestResponse::from(response))
4141
}
4242
}

0 commit comments

Comments
 (0)