Skip to content

Commit 1b7fceb

Browse files
authored
Merge pull request #442 from http-rs/self_service
Remove intermediate Service struct
2 parents 2003a99 + ca30358 commit 1b7fceb

File tree

8 files changed

+43
-66
lines changed

8 files changed

+43
-66
lines changed

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,10 @@ mod redirect;
179179
mod request;
180180
mod response;
181181
mod router;
182+
mod server;
182183
mod utils;
183184

184185
pub mod prelude;
185-
pub mod server;
186186

187187
pub use endpoint::Endpoint;
188188
pub use redirect::redirect;

src/middleware/cors.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ mod test {
288288
.allow_credentials(true),
289289
);
290290

291-
let mut server = make_server(app.into_http_service()).unwrap();
291+
let mut server = make_server(app).unwrap();
292292

293293
let mut req = http_types::Request::new(http_types::Method::Options, endpoint_url());
294294
req.insert_header(http_types::headers::ORIGIN, ALLOW_ORIGIN)
@@ -327,7 +327,7 @@ mod test {
327327
let mut app = app();
328328
app.middleware(Cors::new());
329329

330-
let mut server = make_server(app.into_http_service()).unwrap();
330+
let mut server = make_server(app).unwrap();
331331
let res = server.simulate(request()).unwrap();
332332

333333
assert_eq!(res.status(), 200);
@@ -349,7 +349,7 @@ mod test {
349349
.expose_headers(EXPOSE_HEADER.parse::<HeaderValue>().unwrap()),
350350
);
351351

352-
let mut server = make_server(app.into_http_service()).unwrap();
352+
let mut server = make_server(app).unwrap();
353353
let res = server.simulate(request()).unwrap();
354354

355355
assert_eq!(res.status(), 200);
@@ -364,7 +364,7 @@ mod test {
364364
let mut app = app();
365365
app.middleware(Cors::new().allow_credentials(true));
366366

367-
let mut server = make_server(app.into_http_service()).unwrap();
367+
let mut server = make_server(app).unwrap();
368368
let res = server.simulate(request()).unwrap();
369369

370370
assert_eq!(res.status(), 200);
@@ -381,7 +381,7 @@ mod test {
381381
let mut app = app();
382382
let origins = vec![ALLOW_ORIGIN, "foo.com", "bar.com"];
383383
app.middleware(Cors::new().allow_origin(origins.clone()));
384-
let mut server = make_server(app.into_http_service()).unwrap();
384+
let mut server = make_server(app).unwrap();
385385

386386
for origin in origins {
387387
let mut request = http_types::Request::new(http_types::Method::Get, endpoint_url());
@@ -406,7 +406,7 @@ mod test {
406406

407407
let request = http_types::Request::new(http_types::Method::Get, endpoint_url());
408408

409-
let mut server = make_server(app.into_http_service()).unwrap();
409+
let mut server = make_server(app).unwrap();
410410
let res = server.simulate(request).unwrap();
411411

412412
assert_eq!(res.status(), 200);
@@ -422,7 +422,7 @@ mod test {
422422
.insert_header(http_types::headers::ORIGIN, "unauthorize-origin.net")
423423
.unwrap();
424424

425-
let mut server = make_server(app.into_http_service()).unwrap();
425+
let mut server = make_server(app).unwrap();
426426
let res = server.simulate(request).unwrap();
427427

428428
assert_eq!(res.status(), 401);

src/server/mod.rs

Lines changed: 22 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,10 @@ use http_service::HttpService;
1010

1111
use std::pin::Pin;
1212

13+
use crate::middleware::{Middleware, Next};
14+
use crate::router::{Router, Selection};
1315
use crate::utils::BoxFuture;
14-
use crate::{
15-
middleware::{Middleware, Next},
16-
router::{Router, Selection},
17-
Endpoint, Request, Response,
18-
};
16+
use crate::{Endpoint, Request, Response};
1917

2018
mod route;
2119

@@ -136,9 +134,9 @@ pub use route::Route;
136134
///// ```
137135
#[allow(missing_debug_implementations)]
138136
pub struct Server<State> {
139-
router: Router<State>,
140-
middleware: Vec<Arc<dyn Middleware<State>>>,
141-
state: State,
137+
router: Arc<Router<State>>,
138+
state: Arc<State>,
139+
middleware: Arc<Vec<Arc<dyn Middleware<State>>>>,
142140
}
143141

144142
impl Server<()> {
@@ -201,11 +199,11 @@ impl<State: Send + Sync + 'static> Server<State> {
201199
/// ```
202200
pub fn with_state(state: State) -> Server<State> {
203201
Server {
204-
router: Router::new(),
205-
middleware: vec![Arc::new(
202+
router: Arc::new(Router::new()),
203+
middleware: Arc::new(vec![Arc::new(
206204
crate::middleware::cookies::CookiesMiddleware::new(),
207-
)],
208-
state,
205+
)]),
206+
state: Arc::new(state),
209207
}
210208
}
211209

@@ -256,7 +254,9 @@ impl<State: Send + Sync + 'static> Server<State> {
256254
/// match or not, which means that the order of adding resources has no
257255
/// effect.
258256
pub fn at<'a>(&'a mut self, path: &'a str) -> Route<'a, State> {
259-
Route::new(&mut self.router, path.to_owned())
257+
let router = Arc::get_mut(&mut self.router)
258+
.expect("Registering routes is not possible after the Server has started");
259+
Route::new(router, path.to_owned())
260260
}
261261

262262
/// Add middleware to an application.
@@ -270,49 +270,26 @@ impl<State: Send + Sync + 'static> Server<State> {
270270
/// Middleware can only be added at the "top level" of an application,
271271
/// and is processed in the order in which it is applied.
272272
pub fn middleware(&mut self, m: impl Middleware<State>) -> &mut Self {
273-
self.middleware.push(Arc::new(m));
273+
let middleware = Arc::get_mut(&mut self.middleware)
274+
.expect("Registering middleware is not possible after the Server has started");
275+
middleware.push(Arc::new(m));
274276
self
275277
}
276278

277-
/// Make this app into an `HttpService`.
278-
///
279-
/// This lower-level method lets you host a Tide application within an HTTP
280-
/// server of your choice, via the `http_service` interface crate.
281-
pub fn into_http_service(self) -> Service<State> {
282-
Service {
283-
router: Arc::new(self.router),
284-
state: Arc::new(self.state),
285-
middleware: Arc::new(self.middleware),
286-
}
287-
}
288-
289279
/// Asynchronously serve the app at the given address.
290280
#[cfg(feature = "h1-server")]
291281
pub async fn listen(self, addr: impl ToSocketAddrs) -> std::io::Result<()> {
292282
let listener = async_std::net::TcpListener::bind(addr).await?;
293283

294284
let addr = format!("http://{}", listener.local_addr()?);
295285
log::info!("Server is listening on: {}", addr);
296-
let http_service = self.into_http_service();
297-
298-
let mut server = http_service_h1::Server::new(addr, listener.incoming(), http_service);
286+
let mut server = http_service_h1::Server::new(addr, listener.incoming(), self);
299287

300288
server.run().await
301289
}
302290
}
303291

304-
/// An instantiated Tide server.
305-
///
306-
/// This type is useful only in conjunction with the [`HttpService`] trait,
307-
/// i.e. for hosting a Tide app within some custom HTTP server.
308-
#[allow(missing_debug_implementations)]
309-
pub struct Service<State> {
310-
router: Arc<Router<State>>,
311-
state: Arc<State>,
312-
middleware: Arc<Vec<Arc<dyn Middleware<State>>>>,
313-
}
314-
315-
impl<State> Clone for Service<State> {
292+
impl<State> Clone for Server<State> {
316293
fn clone(&self) -> Self {
317294
Self {
318295
router: self.router.clone(),
@@ -333,7 +310,7 @@ impl Future for ReadyFuture {
333310
}
334311
}
335312

336-
impl<State: Sync + Send + 'static> HttpService for Service<State> {
313+
impl<State: Sync + Send + 'static> HttpService for Server<State> {
337314
type Connection = ();
338315
type ConnectionFuture = ReadyFuture;
339316
type ConnectionError = io::Error;
@@ -373,7 +350,7 @@ impl<State: Sync + Send + 'static> HttpService for Service<State> {
373350
}
374351

375352
impl<State: Sync + Send + 'static, InnerState: Sync + Send + 'static> Endpoint<State>
376-
for Service<InnerState>
353+
for Server<InnerState>
377354
{
378355
fn call<'a>(&'a self, req: Request<State>) -> BoxFuture<'a, crate::Result<Response>> {
379356
let Request {
@@ -411,13 +388,13 @@ mod test {
411388
fn allow_nested_server_with_same_state() {
412389
let inner = tide::new();
413390
let mut outer = tide::new();
414-
outer.at("/foo").get(inner.into_http_service());
391+
outer.at("/foo").get(inner);
415392
}
416393

417394
#[test]
418395
fn allow_nested_server_with_different_state() {
419396
let inner = tide::with_state(1);
420397
let mut outer = tide::new();
421-
outer.at("/foo").get(inner.into_http_service());
398+
outer.at("/foo").get(inner);
422399
}
423400
}

src/server/route.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ impl<'a, State: 'static> Route<'a, State> {
8787
InnerState: Send + Sync + 'static,
8888
{
8989
self.prefix = true;
90-
self.all(service.into_http_service());
90+
self.all(service);
9191
self.prefix = false;
9292
self
9393
}

tests/cookies.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fn app() -> crate::Server<()> {
4343

4444
fn make_request(endpoint: &str) -> http_types::Response {
4545
let app = app();
46-
let mut server = make_server(app.into_http_service()).unwrap();
46+
let mut server = make_server(app).unwrap();
4747
let mut req = http_types::Request::new(
4848
http_types::Method::Get,
4949
format!("http://example.com{}", endpoint).parse().unwrap(),

tests/nested.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ async fn nested() {
1414
// Nest the inner app on /foo
1515
outer.at("/foo").nest(inner);
1616

17-
let mut server = make_server(outer.into_http_service()).unwrap();
17+
let mut server = make_server(outer).unwrap();
1818

1919
let req = Request::new(
2020
Method::Get,
@@ -60,7 +60,7 @@ async fn nested_middleware() {
6060

6161
app.at("/bar").get(echo_path);
6262

63-
let mut server = make_server(app.into_http_service()).unwrap();
63+
let mut server = make_server(app).unwrap();
6464

6565
let req = Request::new(
6666
Method::Get,
@@ -98,7 +98,7 @@ async fn nested_with_different_state() {
9898
outer.at("/").get(|_| async move { Ok("Hello, world!") });
9999
outer.at("/foo").nest(inner);
100100

101-
let mut server = make_server(outer.into_http_service()).unwrap();
101+
let mut server = make_server(outer).unwrap();
102102

103103
let req = Request::new(Method::Get, Url::parse("http://example.com/foo").unwrap());
104104
let res = server.simulate(req).unwrap();

tests/querystring.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use async_std::io::prelude::ReadExt;
1+
use async_std::prelude::*;
22
use futures::executor::block_on;
33
use http_service_mock::{make_server, TestBackend};
44
use http_types::StatusCode;
55
use serde::Deserialize;
6-
use tide::{server::Service, IntoResponse, Request, Response, Server};
6+
use tide::{IntoResponse, Request, Response, Server};
77

88
#[derive(Deserialize)]
99
struct Params {
@@ -32,11 +32,11 @@ async fn optional_handler(cx: Request<()>) -> tide::Result<Response> {
3232
}
3333
}
3434

35-
fn get_server() -> TestBackend<Service<()>> {
35+
fn get_server() -> TestBackend<Server<()>> {
3636
let mut app = Server::new();
3737
app.at("/").get(handler);
3838
app.at("/optional").get(optional_handler);
39-
make_server(app.into_http_service()).unwrap()
39+
make_server(app).unwrap()
4040
}
4141

4242
#[test]

tests/route_middleware.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ fn route_middleware() {
4444
.post(echo_path)
4545
.reset_middleware()
4646
.put(echo_path);
47-
let mut server = make_server(app.into_http_service()).unwrap();
47+
let mut server = make_server(app).unwrap();
4848

4949
let req = Request::new(Method::Get, "http://localhost/foo".parse().unwrap());
5050
let res = server.simulate(req).unwrap();
@@ -86,7 +86,7 @@ fn app_and_route_middleware() {
8686
app.at("/bar")
8787
.middleware(TestMiddleware::with_header_name("X-Bar", "bar"))
8888
.get(echo_path);
89-
let mut server = make_server(app.into_http_service()).unwrap();
89+
let mut server = make_server(app).unwrap();
9090

9191
let req = Request::new(Method::Get, "http://localhost/foo".parse().unwrap());
9292
let res = server.simulate(req).unwrap();
@@ -130,7 +130,7 @@ fn nested_app_with_route_middleware() {
130130
app.at("/bar")
131131
.middleware(TestMiddleware::with_header_name("X-Bar", "bar"))
132132
.nest(inner);
133-
let mut server = make_server(app.into_http_service()).unwrap();
133+
let mut server = make_server(app).unwrap();
134134

135135
let req = Request::new(Method::Get, "http://localhost/foo".parse().unwrap());
136136
let res = server.simulate(req).unwrap();
@@ -176,7 +176,7 @@ fn subroute_not_nested() {
176176
app.at("/parent/child") // /parent/child, not nested
177177
.middleware(TestMiddleware::with_header_name("X-Child", "child"))
178178
.get(echo_path);
179-
let mut server = make_server(app.into_http_service()).unwrap();
179+
let mut server = make_server(app).unwrap();
180180

181181
let req = Request::new(
182182
Method::Get,

0 commit comments

Comments
 (0)