Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix region errors uncovered by rust-lang/rust#27641 #260

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/favicon_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ pub struct FaviconHandler {
}

impl Middleware for FaviconHandler {
fn invoke<'a, 'b>(&'a self, req: &mut Request<'b, 'a, 'b>, res: Response<'a, net::Fresh>)
fn invoke<'a, 'server>(&'a self, req: &mut Request<'a, 'server>, res: Response<'a, net::Fresh>)
-> MiddlewareResult<'a> {
if FaviconHandler::is_favicon_request(req) {
self.handle_request(req, res)
Expand Down Expand Up @@ -78,7 +78,7 @@ impl FaviconHandler {
}
}

pub fn send_favicon<'a, 'b>(&self, req: &Request, mut res: Response<'a>) -> MiddlewareResult<'a> {
pub fn send_favicon<'a, 'server>(&self, req: &Request, mut res: Response<'a>) -> MiddlewareResult<'a> {
debug!("{:?} {:?}", req.origin.method, self.icon_path.display());
res.set(MediaType::Ico);
res.send(&*self.icon)
Expand Down
4 changes: 2 additions & 2 deletions src/json_body_parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use std::io::{Read, ErrorKind};
// Plugin boilerplate
struct JsonBodyParser;
impl Key for JsonBodyParser { type Value = String; }
impl<'a, 'b, 'k> Plugin<Request<'a, 'b, 'k>> for JsonBodyParser {
impl<'mw, 'conn> Plugin<Request<'mw, 'conn>> for JsonBodyParser {
type Error = io::Error;

fn eval(req: &mut Request) -> Result<String, io::Error> {
Expand All @@ -22,7 +22,7 @@ pub trait JsonBody {
fn json_as<T: Decodable>(&mut self) -> Result<T, io::Error>;
}

impl<'a, 'b, 'k> JsonBody for Request<'a, 'b, 'k> {
impl<'mw, 'conn> JsonBody for Request<'mw, 'conn> {
fn json_as<T: Decodable>(&mut self) -> Result<T, io::Error> {
self.get_ref::<JsonBodyParser>().and_then(|parsed|
json::decode::<T>(&*parsed).map_err(|err|
Expand Down
10 changes: 5 additions & 5 deletions src/macros/middleware.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,18 @@ macro_rules! _middleware_inner {
use $crate::{MiddlewareResult,Responder, Response, Request};

#[inline(always)]
fn restrict<'a, R: Responder>(r: R, res: Response<'a>)
-> MiddlewareResult<'a> {
fn restrict<'mw, R: Responder>(r: R, res: Response<'mw>)
-> MiddlewareResult<'mw> {
res.send(r)
}

// Inference fails due to thinking it's a (&Request, Response) with
// different mutability requirements
#[inline(always)]
fn restrict_closure<F>(f: F) -> F
where F: for<'r, 'b, 'a>
Fn(&'r mut Request<'b, 'a, 'b>, Response<'a>)
-> MiddlewareResult<'a> + Send + Sync { f }
where F: for<'r, 'mw, 'conn>
Fn(&'r mut Request<'mw, 'conn>, Response<'mw>)
-> MiddlewareResult<'mw> + Send + Sync { f }

restrict_closure(move |as_pat!($req), $res_binding| {
restrict(as_block!({$($b)+}), $res)
Expand Down
14 changes: 7 additions & 7 deletions src/middleware.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ use hyper::net;

pub use self::Action::{Continue, Halt};

pub type MiddlewareResult<'a> = Result<Action<Response<'a, net::Fresh>,
Response<'a, net::Streaming>>,
NickelError<'a>>;
pub type MiddlewareResult<'mw> = Result<Action<Response<'mw, net::Fresh>,
Response<'mw, net::Streaming>>,
NickelError<'mw>>;

pub enum Action<T=(), U=()> {
Continue(T),
Expand All @@ -17,13 +17,13 @@ pub enum Action<T=(), U=()> {
// the usage of + Send is weird here because what we really want is + Static
// but that's not possible as of today. We have to use + Send for now.
pub trait Middleware: Send + 'static + Sync {
fn invoke<'a, 'b>(&'a self, _req: &mut Request<'b, 'a, 'b>, res: Response<'a, net::Fresh>) -> MiddlewareResult<'a> {
fn invoke<'mw, 'conn>(&'mw self, _req: &mut Request<'mw, 'conn>, res: Response<'mw, net::Fresh>) -> MiddlewareResult<'mw> {
Ok(Continue(res))
}
}

impl<T> Middleware for T where T: for<'r, 'b, 'a> Fn(&'r mut Request<'b, 'a, 'b>, Response<'a>) -> MiddlewareResult<'a> + Send + Sync + 'static {
fn invoke<'a, 'b>(&'a self, req: &mut Request<'b, 'a, 'b>, res: Response<'a>) -> MiddlewareResult<'a> {
impl<T> Middleware for T where T: for<'r, 'mw, 'conn> Fn(&'r mut Request<'mw, 'conn>, Response<'mw>) -> MiddlewareResult<'mw> + Send + Sync + 'static {
fn invoke<'mw, 'conn>(&'mw self, req: &mut Request<'mw, 'conn>, res: Response<'mw>) -> MiddlewareResult<'mw> {
(*self)(req, res)
}
}
Expand Down Expand Up @@ -52,7 +52,7 @@ impl MiddlewareStack {
self.error_handlers.push(Box::new(handler));
}

pub fn invoke<'a, 'b>(&'a self, mut req: Request<'a, 'a, 'b>, mut res: Response<'a>) {
pub fn invoke<'mw, 'conn>(&'mw self, mut req: Request<'mw, 'conn>, mut res: Response<'mw>) {
for handler in self.handlers.iter() {
match handler.invoke(&mut req, res) {
Ok(Halt(res)) => {
Expand Down
4 changes: 2 additions & 2 deletions src/query_string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ impl Query {
struct QueryStringParser;
impl Key for QueryStringParser { type Value = Query; }

impl<'a, 'b, 'k> Plugin<Request<'a, 'b, 'k>> for QueryStringParser {
impl<'mw, 'conn> Plugin<Request<'mw, 'conn>> for QueryStringParser {
type Error = ();

fn eval(req: &mut Request) -> Result<Query, ()> {
Expand All @@ -46,7 +46,7 @@ pub trait QueryString {
fn query(&mut self) -> &Query;
}

impl<'a, 'b, 'k> QueryString for Request<'a, 'b, 'k> {
impl<'mw, 'conn> QueryString for Request<'mw, 'conn> {
fn query(&mut self) -> &Query {
self.get_ref::<QueryStringParser>()
.ok()
Expand Down
22 changes: 14 additions & 8 deletions src/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,24 @@ use typemap::TypeMap;
use hyper::server::Request as HyperRequest;
use hyper::uri::RequestUri::AbsolutePath;

///A container for all the request data
pub struct Request<'a, 'b: 'k, 'k: 'a> {
/// A container for all the request data.
///
/// The lifetime `'mw` represents the lifetime of various bits of
/// middleware state within nickel. It can vary and get shorter.
///
/// The lifetime `'server` represents the lifetime of data internal to
/// the server. It is fixed and longer than `'mw`.
pub struct Request<'mw, 'server: 'mw> {
///the original `hyper::server::Request`
pub origin: HyperRequest<'a, 'k>,
pub origin: HyperRequest<'mw, 'server>,
///a `HashMap<String, String>` holding all params with names and values
pub route_result: Option<RouteResult<'b>>,
pub route_result: Option<RouteResult<'mw>>,

map: TypeMap
}

impl<'a, 'b, 'k> Request<'a, 'b, 'k> {
pub fn from_internal(req: HyperRequest<'a, 'k>) -> Request<'a, 'b, 'k> {
impl<'mw, 'server> Request<'mw, 'server> {
pub fn from_internal(req: HyperRequest<'mw, 'server>) -> Request<'mw, 'server> {
Request {
origin: req,
route_result: None,
Expand All @@ -35,7 +41,7 @@ impl<'a, 'b, 'k> Request<'a, 'b, 'k> {
}
}

impl<'a, 'b, 'k> Extensible for Request<'a, 'b, 'k> {
impl<'mw, 'server> Extensible for Request<'mw, 'server> {
fn extensions(&self) -> &TypeMap {
&self.map
}
Expand All @@ -45,4 +51,4 @@ impl<'a, 'b, 'k> Extensible for Request<'a, 'b, 'k> {
}
}

impl<'a, 'b, 'k> Pluggable for Request<'a, 'b, 'k> {}
impl<'mw, 'server> Pluggable for Request<'mw, 'server> {}
12 changes: 6 additions & 6 deletions src/router/router.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ pub struct Route {
/// It contains the matched `route` and also a `params` property holding
/// a HashMap with the keys being the variable names and the value being the
/// evaluated string
pub struct RouteResult<'a> {
pub route: &'a Route,
pub struct RouteResult<'mw> {
pub route: &'mw Route,
params: Vec<(String, String)>
}

impl<'a> RouteResult<'a> {
impl<'mw> RouteResult<'mw> {
pub fn param(&self, key: &str) -> Option<&str> {
for &(ref k, ref v) in &self.params {
if k == &key {
Expand Down Expand Up @@ -56,7 +56,7 @@ impl Router {
}
}

pub fn match_route<'a>(&'a self, method: &Method, path: &str) -> Option<RouteResult<'a>> {
pub fn match_route<'mw>(&'mw self, method: &Method, path: &str) -> Option<RouteResult<'mw>> {
self.routes
.iter()
.find(|item| item.method == *method && item.matcher.is_match(path))
Expand Down Expand Up @@ -95,8 +95,8 @@ impl HttpRouter for Router {
}

impl Middleware for Router {
fn invoke<'a, 'b>(&'a self, req: &mut Request<'b, 'a, 'b>, mut res: Response<'a>)
-> MiddlewareResult<'a> {
fn invoke<'mw, 'conn>(&'mw self, req: &mut Request<'mw, 'conn>, mut res: Response<'mw>)
-> MiddlewareResult<'mw> {
debug!("Router::invoke for '{:?}'", req.origin.uri);

// Strip off the querystring when matching a route
Expand Down
2 changes: 1 addition & 1 deletion src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ struct ArcServer(Arc<Server>);

impl Handler for ArcServer {
fn handle<'a, 'k>(&'a self, req: Request<'a, 'k>, res: Response<'a>) {
let req: Request<'a, 'k> = req;
let nickel_req = request::Request::from_internal(req);
let nickel_res = response::Response::from_internal(res, &self.0.templates);

self.0.middleware_stack.invoke(nickel_req, nickel_res);
}
}
Expand Down