Как получить заголовок Авторизационный канал?
Я хотел бы получить заголовок Authorization Bearer для целей OAuth, но это выглядит немного запутанно, читая документы
use nickel::{Nickel, JsonBody, HttpRouter, Request, Response, MiddlewareResult, MediaType};
// Get the full Authorization header from the incoming request headers
let auth_header = match request.origin.headers.get::<Authorization<Bearer>>() {
Some(header) => header,
None => panic!("No authorization header found")
};
Это генерирует ошибку:
src / main.rs: 84: 56: 84:86 ошибка: черта
hyper::header::HeaderFormat
не реализован для типаhyper::header::common::authorization::Authorization<hyper::header::common::authorization::Bearer>
[E0277]
Глядя на реализацию, мне кажется, что это правильно:
https://github.com/hyperium/hyper/blob/master/src/header/common/authorization.rs
impl<S: Scheme + Any> HeaderFormat for Authorization<S> where <S as FromStr>::Err: 'static {
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
if let Some(scheme) = <S as Scheme>::scheme() {
try!(write!(f, "{} ", scheme))
};
self.0.fmt_scheme(f)
}
}
1 ответ
Глядя на документацию для Authorization
мы можем видеть, что это действительно реализует Header
:
impl<S: Scheme + Any> Header for Authorization<S>
where S::Err: 'static
Таким образом, вы были на правильном пути. Я предполагаю, что вы столкнулись с чем-то более коварным: несколько версий одного ящика.
В частности, версия никеля, которую я сегодня составил (0.7.3), зависит от гипер 0.6.16. Однако, если я добавлю hyper = "*"
на мой Cargo.toml, тогда я также получаю новейшую версию гипер - 0.7.0.
Какими бы не интуитивно понятными ни казались вещи из гипер 0,7 несовместимы с предметами из гипер 0,6. Это ничего особенного в гипер тоже; это верно для всех ящиков.
Если вы обновите свою зависимость для того, чтобы привязать ее к той же версии Hyper, которую хочет никель, тогда вам стоит пойти дальше.
Cargo.toml
# ...
[dependencies]
hyper = "0.6.16"
nickel = "*"
SRC /main.rs
extern crate nickel;
extern crate hyper;
use hyper::header::{Authorization, Bearer};
use nickel::{HttpRouter, Request};
fn foo(request: Request) {
// Get the full Authorization header from the incoming request headers
let auth_header = match request.origin.headers.get::<Authorization<Bearer>>() {
Some(header) => header,
None => panic!("No authorization header found")
};
}
fn main() {}