1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
use rocket::Outcome; use rocket::Outcome::*; use rocket::request::{self, Request, FromRequest}; use rocket::http::Status; use rocket::Data; use rocket::data::{self, FromData}; use std::io::Read; pub struct Signature { pub key: String, } impl<'a, 'r> FromRequest<'a, 'r> for Signature { type Error = (); fn from_request(request: &'a Request<'r>) -> request::Outcome<Signature, ()> { let keys: Vec<_> = request.headers().get("X-Line-Signature").collect(); if keys.len() != 1 { return Outcome::Failure((Status::BadRequest, ())); } Outcome::Success( Signature { key: keys[0].to_string() } ) } } #[derive(Debug)] pub struct Body { pub data: String } impl Body { pub fn get_data(&self) -> String { self.data.clone() } } impl FromData for Body { type Error = String; fn from_data(_: &Request, data: Data) -> data::Outcome<Self, String> { let mut string = String::new(); if let Err(e) = data.open().read_to_string(&mut string) { return Failure((Status::InternalServerError, format!("{:?}", e))); } Success(Body{ data: string }) } }