Skip to content

Commit fd2afe3

Browse files
authored
Even more improvements (#119)
* Exposing protocols. More core methods. * From implementation for MiddlewareAction.
1 parent b79ed4a commit fd2afe3

File tree

3 files changed

+69
-25
lines changed

3 files changed

+69
-25
lines changed

core/src/io.rs

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -164,25 +164,7 @@ impl<T: Metadata, S: Middleware<T>> MetaIoHandler<T, S> {
164164
let request = read_request(request);
165165
let result = match request {
166166
Err(error) => futures::finished(Some(Response::from(error, self.compatibility.default_version()))).boxed(),
167-
Ok(request) => self.middleware.on_request(request, meta, |request, meta| match request {
168-
Request::Single(call) => {
169-
self.handle_call(call, meta)
170-
.map(|output| output.map(Response::Single))
171-
.boxed()
172-
},
173-
Request::Batch(calls) => {
174-
let futures: Vec<_> = calls.into_iter().map(move |call| self.handle_call(call, meta.clone())).collect();
175-
futures::future::join_all(futures).map(|outs| {
176-
let outs: Vec<_> = outs.into_iter().filter_map(|v| v).collect();
177-
if outs.is_empty() {
178-
None
179-
} else {
180-
Some(Response::Batch(outs))
181-
}
182-
})
183-
.boxed()
184-
},
185-
}),
167+
Ok(request) => self.handle_rpc_request(request, meta),
186168
};
187169

188170
result.map(|response| {
@@ -192,6 +174,29 @@ impl<T: Metadata, S: Middleware<T>> MetaIoHandler<T, S> {
192174
}).boxed()
193175
}
194176

177+
/// Handle deserialized RPC request.
178+
pub fn handle_rpc_request(&self, request: Request, meta: T) -> FutureResponse {
179+
self.middleware.on_request(request, meta, |request, meta| match request {
180+
Request::Single(call) => {
181+
self.handle_call(call, meta)
182+
.map(|output| output.map(Response::Single))
183+
.boxed()
184+
},
185+
Request::Batch(calls) => {
186+
let futures: Vec<_> = calls.into_iter().map(move |call| self.handle_call(call, meta.clone())).collect();
187+
futures::future::join_all(futures).map(|outs| {
188+
let outs: Vec<_> = outs.into_iter().filter_map(|v| v).collect();
189+
if outs.is_empty() {
190+
None
191+
} else {
192+
Some(Response::Batch(outs))
193+
}
194+
})
195+
.boxed()
196+
},
197+
})
198+
}
199+
195200
/// Handle single call asynchronously.
196201
pub fn handle_call(&self, call: Call, meta: T) -> BoxFuture<Option<Output>, ()> {
197202
match call {
@@ -261,11 +266,21 @@ impl IoHandler {
261266
}
262267

263268
impl<M: Metadata> IoHandler<M> {
264-
/// Handle given request asynchronously.
269+
/// Handle given string request asynchronously.
265270
pub fn handle_request(&self, request: &str) -> BoxFuture<Option<String>, ()> {
266271
self.0.handle_request(request, M::default())
267272
}
268273

274+
/// Handle deserialized RPC request asynchronously.
275+
pub fn handle_rpc_request(&self, request: Request) -> FutureResponse {
276+
self.0.handle_rpc_request(request, M::default())
277+
}
278+
279+
/// Handle single Call asynchronously.
280+
pub fn handle_call(&self, call: Call) -> BoxFuture<Option<Output>, ()> {
281+
self.0.handle_call(call, M::default())
282+
}
283+
269284
/// Handle given request synchronously - will block until response is available.
270285
/// If you have any asynchronous methods in your RPC it is much wiser to use
271286
/// `handle_request` instead and deal with asynchronous requests in a non-blocking fashion.

ws/src/metadata.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::fmt;
2+
13
use core;
24
use ws;
35

@@ -10,10 +12,22 @@ pub struct RequestContext {
1012
pub session_id: session::SessionId,
1113
/// Request Origin
1214
pub origin: Option<Origin>,
15+
/// Requested protocols
16+
pub protocols: Vec<String>,
1317
/// Direct channel to send messages to a client.
1418
pub out: ws::Sender,
1519
}
1620

21+
impl fmt::Debug for RequestContext {
22+
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
23+
fmt.debug_struct("RequestContext")
24+
.field("session_id", &self.session_id)
25+
.field("origin", &self.origin)
26+
.field("protocols", &self.protocols)
27+
.finish()
28+
}
29+
}
30+
1731
/// Metadata extractor from session data.
1832
pub trait MetaExtractor<M: core::Metadata>: Send + Sync + 'static {
1933
/// Extract metadata for given session

ws/src/session.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ impl<F> RequestMiddleware for F where
3434
F: Fn(&ws::Request) -> Option<ws::Response> + Send + Sync + 'static,
3535
{
3636
fn process(&self, req: &ws::Request) -> MiddlewareAction {
37-
match (*self)(req) {
38-
Some(res) => MiddlewareAction::Respond { response: res, validate_origin: true, validate_hosts: true },
39-
None => MiddlewareAction::Proceed,
40-
}
37+
(*self)(req).into()
4138
}
4239
}
4340

@@ -76,6 +73,15 @@ impl MiddlewareAction {
7673
}
7774
}
7875

76+
impl From<Option<ws::Response>> for MiddlewareAction {
77+
fn from(opt: Option<ws::Response>) -> Self {
78+
match opt {
79+
Some(res) => MiddlewareAction::Respond { response: res, validate_origin: true, validate_hosts: true },
80+
None => MiddlewareAction::Proceed,
81+
}
82+
}
83+
}
84+
7985
pub struct Session<M: core::Metadata, S: core::Middleware<M>> {
8086
context: metadata::RequestContext,
8187
handler: Arc<core::MetaIoHandler<M, S>>,
@@ -150,10 +156,18 @@ impl<M: core::Metadata, S: core::Middleware<M>> ws::Handler for Session<M, S> {
150156
}
151157

152158
self.context.origin = origin.and_then(|origin| ::std::str::from_utf8(origin).ok()).map(Into::into);
159+
self.context.protocols = req.protocols().ok()
160+
.map(|protos| protos.into_iter().map(Into::into).collect())
161+
.unwrap_or_else(Vec::new);
153162
self.metadata = self.meta_extractor.extract(&self.context);
154163

155164
match action {
156-
MiddlewareAction::Proceed => ws::Response::from_request(req),
165+
MiddlewareAction::Proceed => ws::Response::from_request(req).map(|mut res| {
166+
if let Some(protocol) = self.context.protocols.get(0) {
167+
res.set_protocol(protocol);
168+
}
169+
res
170+
}),
157171
MiddlewareAction::Respond { response, .. } => Ok(response),
158172
}
159173
}
@@ -223,6 +237,7 @@ impl<M: core::Metadata, S: core::Middleware<M>> ws::Factory for Factory<M, S> {
223237
context: metadata::RequestContext {
224238
session_id: self.session_id,
225239
origin: None,
240+
protocols: Vec::new(),
226241
out: sender,
227242
},
228243
handler: self.handler.clone(),

0 commit comments

Comments
 (0)