aboutsummaryrefslogtreecommitdiffstats
path: root/rust/fatcat-api/src/server/auth.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/fatcat-api/src/server/auth.rs')
-rw-r--r--rust/fatcat-api/src/server/auth.rs93
1 files changed, 93 insertions, 0 deletions
diff --git a/rust/fatcat-api/src/server/auth.rs b/rust/fatcat-api/src/server/auth.rs
new file mode 100644
index 00000000..48dfd7d6
--- /dev/null
+++ b/rust/fatcat-api/src/server/auth.rs
@@ -0,0 +1,93 @@
+use Api;
+use hyper;
+use hyper::{Error, Request, Response, StatusCode};
+use server::url::form_urlencoded;
+use std::io;
+use swagger::auth::{AuthData, Authorization, Scopes};
+
+pub struct NewService<T>
+where
+ T: hyper::server::NewService<
+ Request = (Request, Option<AuthData>),
+ Response = Response,
+ Error = Error,
+ >,
+{
+ inner: T,
+}
+
+impl<T> NewService<T>
+where
+ T: hyper::server::NewService<
+ Request = (Request, Option<AuthData>),
+ Response = Response,
+ Error = Error,
+ >
+ + 'static,
+{
+ pub fn new(inner: T) -> NewService<T> {
+ NewService { inner }
+ }
+}
+
+impl<T> hyper::server::NewService for NewService<T>
+where
+ T: hyper::server::NewService<
+ Request = (Request, Option<AuthData>),
+ Response = Response,
+ Error = Error,
+ >
+ + 'static,
+{
+ type Request = Request;
+ type Response = Response;
+ type Error = Error;
+ type Instance = Service<T::Instance>;
+
+ fn new_service(&self) -> Result<Self::Instance, io::Error> {
+ self.inner.new_service().map(|s| Service::new(s))
+ }
+}
+
+/// Middleware to extract authentication data from request
+pub struct Service<T>
+where
+ T: hyper::server::Service<
+ Request = (Request, Option<AuthData>),
+ Response = Response,
+ Error = Error,
+ >,
+{
+ inner: T,
+}
+
+impl<T> Service<T>
+where
+ T: hyper::server::Service<
+ Request = (Request, Option<AuthData>),
+ Response = Response,
+ Error = Error,
+ >,
+{
+ pub fn new(inner: T) -> Service<T> {
+ Service { inner }
+ }
+}
+
+impl<T> hyper::server::Service for Service<T>
+where
+ T: hyper::server::Service<
+ Request = (Request, Option<AuthData>),
+ Response = Response,
+ Error = Error,
+ >,
+{
+ type Request = Request;
+ type Response = Response;
+ type Error = Error;
+ type Future = T::Future;
+
+ fn call(&self, req: Self::Request) -> Self::Future {
+ return self.inner.call((req, None));
+ }
+}