Skip to content

Commit 70a3ca6

Browse files
authored
Merge pull request #4 from jtgeibel/use-http-types
Bump to latest conduit alpha and use `http` types
2 parents fdc477f + 2e2599f commit 70a3ca6

File tree

2 files changed

+51
-74
lines changed

2 files changed

+51
-74
lines changed

Cargo.toml

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,4 @@ repository = "https://github.com/conduit-rust/conduit-middleware"
99
license = "MIT"
1010

1111
[dependencies]
12-
conduit = "0.9.0-alpha.0"
13-
semver = "0.9"
12+
conduit = "0.9.0-alpha.1"

src/lib.rs

+50-72
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
#![warn(rust_2018_idioms)]
22
extern crate conduit;
33

4-
use std::error::Error;
4+
use conduit::{BoxError, Handler, RequestExt};
55

6-
use conduit::{Handler, Request, Response};
6+
pub type BeforeResult = Result<(), BoxError>;
7+
pub type AfterResult = conduit::HandlerResult;
78

89
pub trait Middleware: Send + Sync + 'static {
9-
fn before(&self, _: &mut dyn Request) -> Result<(), Box<dyn Error + Send>> {
10+
fn before(&self, _: &mut dyn RequestExt) -> BeforeResult {
1011
Ok(())
1112
}
1213

13-
fn after(
14-
&self,
15-
_: &mut dyn Request,
16-
res: Result<Response, Box<dyn Error + Send>>,
17-
) -> Result<Response, Box<dyn Error + Send>> {
14+
fn after(&self, _: &mut dyn RequestExt, res: AfterResult) -> AfterResult {
1815
res
1916
}
2017
}
@@ -49,7 +46,7 @@ impl MiddlewareBuilder {
4946
}
5047

5148
impl Handler for MiddlewareBuilder {
52-
fn call(&self, req: &mut dyn Request) -> Result<Response, Box<dyn Error + Send>> {
49+
fn call(&self, req: &mut dyn RequestExt) -> AfterResult {
5350
let mut error = None;
5451

5552
for (i, middleware) in self.middlewares.iter().enumerate() {
@@ -79,9 +76,9 @@ impl Handler for MiddlewareBuilder {
7976

8077
fn run_afters(
8178
middleware: &[Box<dyn Middleware>],
82-
req: &mut dyn Request,
83-
res: Result<Response, Box<dyn Error + Send>>,
84-
) -> Result<Response, Box<dyn Error + Send>> {
79+
req: &mut dyn RequestExt,
80+
res: AfterResult,
81+
) -> AfterResult {
8582
middleware
8683
.iter()
8784
.rev()
@@ -90,20 +87,17 @@ fn run_afters(
9087

9188
#[cfg(test)]
9289
mod tests {
93-
extern crate semver;
94-
95-
use {AroundMiddleware, Middleware, MiddlewareBuilder};
90+
use {AfterResult, AroundMiddleware, BeforeResult, Middleware, MiddlewareBuilder};
9691

9792
use std::any::Any;
98-
use std::collections::HashMap;
99-
use std::error::Error;
93+
use std::io;
10094
use std::io::prelude::*;
101-
use std::io::{self, Cursor};
10295
use std::net::SocketAddr;
10396

104-
use conduit;
105-
use conduit::{Extensions, Headers, Host, Method, Request, Response, Scheme};
106-
use conduit::{Handler, TypeMap};
97+
use conduit::{
98+
box_error, static_to_body, vec_to_body, Body, Extensions, Handler, HeaderMap, Host, Method,
99+
RequestExt, Response, Scheme, StatusCode, TypeMap, Version,
100+
};
107101

108102
struct RequestSentinel {
109103
path: String,
@@ -121,15 +115,12 @@ mod tests {
121115
}
122116
}
123117

124-
impl conduit::Request for RequestSentinel {
125-
fn http_version(&self) -> semver::Version {
126-
unimplemented!()
127-
}
128-
fn conduit_version(&self) -> semver::Version {
118+
impl conduit::RequestExt for RequestSentinel {
119+
fn http_version(&self) -> Version {
129120
unimplemented!()
130121
}
131-
fn method(&self) -> Method {
132-
self.method.clone()
122+
fn method(&self) -> &Method {
123+
&self.method
133124
}
134125
fn scheme(&self) -> Scheme {
135126
unimplemented!()
@@ -152,7 +143,7 @@ mod tests {
152143
fn content_length(&self) -> Option<u64> {
153144
unimplemented!()
154145
}
155-
fn headers<'a>(&'a self) -> &'a dyn Headers {
146+
fn headers(&self) -> &HeaderMap {
156147
unimplemented!()
157148
}
158149
fn body<'a>(&'a mut self) -> &'a mut dyn Read {
@@ -169,7 +160,7 @@ mod tests {
169160
struct MyMiddleware;
170161

171162
impl Middleware for MyMiddleware {
172-
fn before<'a>(&self, req: &'a mut dyn Request) -> Result<(), Box<dyn Error + Send>> {
163+
fn before<'a>(&self, req: &'a mut dyn RequestExt) -> BeforeResult {
173164
req.mut_extensions().insert("hello".to_string());
174165
Ok(())
175166
}
@@ -178,43 +169,32 @@ mod tests {
178169
struct ErrorRecovery;
179170

180171
impl Middleware for ErrorRecovery {
181-
fn after(
182-
&self,
183-
_: &mut dyn Request,
184-
res: Result<Response, Box<dyn Error + Send>>,
185-
) -> Result<Response, Box<dyn Error + Send>> {
172+
fn after(&self, _: &mut dyn RequestExt, res: AfterResult) -> AfterResult {
186173
res.or_else(|e| {
187-
let e = e.to_string();
188-
Ok(Response {
189-
status: (500, "Internal Server Error"),
190-
headers: HashMap::new(),
191-
body: Box::new(Cursor::new(e.into_bytes())),
192-
})
174+
let e = e.to_string().into_bytes();
175+
Response::builder()
176+
.status(StatusCode::INTERNAL_SERVER_ERROR)
177+
.body(vec_to_body(e))
178+
.map_err(box_error)
193179
})
194180
}
195181
}
196182

197183
struct ProducesError;
198184

199185
impl Middleware for ProducesError {
200-
fn before(&self, _: &mut dyn Request) -> Result<(), Box<dyn Error + Send>> {
186+
fn before(&self, _: &mut dyn RequestExt) -> BeforeResult {
201187
Err(Box::new(io::Error::new(io::ErrorKind::Other, "")))
202188
}
203189
}
204190

205191
struct NotReached;
206192

207193
impl Middleware for NotReached {
208-
fn after(
209-
&self,
210-
_: &mut dyn Request,
211-
_: Result<Response, Box<dyn Error + Send>>,
212-
) -> Result<Response, Box<dyn Error + Send>> {
213-
Ok(Response {
214-
status: (200, "OK"),
215-
headers: HashMap::new(),
216-
body: Box::new(Cursor::new(vec![])),
217-
})
194+
fn after(&self, _: &mut dyn RequestExt, _: AfterResult) -> AfterResult {
195+
Response::builder()
196+
.body(static_to_body(b""))
197+
.map_err(box_error)
218198
}
219199
}
220200

@@ -237,34 +217,32 @@ mod tests {
237217
}
238218

239219
impl Handler for MyAroundMiddleware {
240-
fn call(&self, req: &mut dyn Request) -> Result<Response, Box<dyn Error + Send>> {
220+
fn call(&self, req: &mut dyn RequestExt) -> AfterResult {
241221
req.mut_extensions().insert("hello".to_string());
242222
self.handler.as_ref().unwrap().call(req)
243223
}
244224
}
245225

246-
fn get_extension<'a, T: Any>(req: &'a dyn Request) -> &'a T {
226+
fn get_extension<'a, T: Any>(req: &'a dyn RequestExt) -> &'a T {
247227
req.extensions().find::<T>().unwrap()
248228
}
249229

250-
fn response(string: String) -> Response {
251-
Response {
252-
status: (200, "OK"),
253-
headers: HashMap::new(),
254-
body: Box::new(Cursor::new(string.into_bytes())),
255-
}
230+
fn response(string: String) -> Response<Body> {
231+
Response::builder()
232+
.body(vec_to_body(string.into_bytes()))
233+
.unwrap()
256234
}
257235

258-
fn handler(req: &mut dyn Request) -> io::Result<Response> {
236+
fn handler(req: &mut dyn RequestExt) -> io::Result<Response<Body>> {
259237
let hello = get_extension::<String>(req);
260238
Ok(response(hello.clone()))
261239
}
262240

263-
fn error_handler(_: &mut dyn Request) -> io::Result<Response> {
241+
fn error_handler(_: &mut dyn RequestExt) -> io::Result<Response<Body>> {
264242
Err(io::Error::new(io::ErrorKind::Other, "Error in handler"))
265243
}
266244

267-
fn middle_handler(req: &mut dyn Request) -> io::Result<Response> {
245+
fn middle_handler(req: &mut dyn RequestExt) -> io::Result<Response<Body>> {
268246
let hello = get_extension::<String>(req);
269247
let middle = get_extension::<String>(req);
270248

@@ -276,11 +254,11 @@ mod tests {
276254
let mut builder = MiddlewareBuilder::new(handler);
277255
builder.add(MyMiddleware);
278256

279-
let mut req = RequestSentinel::new(Method::Get, "/");
257+
let mut req = RequestSentinel::new(Method::GET, "/");
280258
let mut res = builder.call(&mut req).ok().expect("No response");
281259

282260
let mut s = Vec::new();
283-
res.body.write_body(&mut s).unwrap();
261+
res.body_mut().write_body(&mut s).unwrap();
284262
assert_eq!(s, b"hello");
285263
}
286264

@@ -292,23 +270,23 @@ mod tests {
292270
// the error bubbles up from ProducesError and shouldn't reach here
293271
builder.add(NotReached);
294272

295-
let mut req = RequestSentinel::new(Method::Get, "/");
273+
let mut req = RequestSentinel::new(Method::GET, "/");
296274
let res = builder.call(&mut req).ok().expect("Error not handled");
297275

298-
assert_eq!(res.status, (500, "Internal Server Error"));
276+
assert_eq!(res.status(), StatusCode::INTERNAL_SERVER_ERROR);
299277
}
300278

301279
#[test]
302280
fn test_error_recovery_in_handlers() {
303281
let mut builder = MiddlewareBuilder::new(error_handler);
304282
builder.add(ErrorRecovery);
305283

306-
let mut req = RequestSentinel::new(Method::Get, "/");
284+
let mut req = RequestSentinel::new(Method::GET, "/");
307285
let mut res = builder.call(&mut req).ok().expect("Error not handled");
308286

309-
assert_eq!(res.status, (500, "Internal Server Error"));
287+
assert_eq!(res.status(), StatusCode::INTERNAL_SERVER_ERROR);
310288
let mut s = Vec::new();
311-
res.body.write_body(&mut s).unwrap();
289+
res.body_mut().write_body(&mut s).unwrap();
312290
assert_eq!(s, b"Error in handler");
313291
}
314292

@@ -318,11 +296,11 @@ mod tests {
318296
builder.add(MyMiddleware);
319297
builder.around(MyAroundMiddleware::new());
320298

321-
let mut req = RequestSentinel::new(Method::Get, "/");
299+
let mut req = RequestSentinel::new(Method::GET, "/");
322300
let mut res = builder.call(&mut req).ok().expect("No response");
323301

324302
let mut s = Vec::new();
325-
res.body.write_body(&mut s).unwrap();
303+
res.body_mut().write_body(&mut s).unwrap();
326304
assert_eq!(s, b"hello hello");
327305
}
328306
}

0 commit comments

Comments
 (0)