jsonrpc_http_server/
utils.rs

1use hyper::{header, server};
2
3use server_utils::{cors, hosts};
4pub use server_utils::cors::CorsHeader;
5
6/// Extracts string value of a single header in request.
7fn read_header<'a>(req: &'a server::Request, header: &str) -> Option<&'a str> {
8	match req.headers().get_raw(header) {
9		Some(ref v) if v.len() == 1 => {
10			::std::str::from_utf8(&v[0]).ok()
11		},
12		_ => None
13	}
14}
15
16/// Returns `true` if Host header in request matches a list of allowed hosts.
17pub fn is_host_allowed(
18	request: &server::Request,
19	allowed_hosts: &Option<Vec<hosts::Host>>,
20) -> bool {
21	hosts::is_host_valid(read_header(request, "host"), allowed_hosts)
22}
23
24/// Returns a CORS header that should be returned with that request.
25pub fn cors_header(
26	request: &server::Request,
27	cors_domains: &Option<Vec<cors::AccessControlAllowOrigin>>
28) -> CorsHeader<header::AccessControlAllowOrigin> {
29	cors::get_cors_header(read_header(request, "origin"), read_header(request, "host"), cors_domains).map(|origin| {
30		use self::cors::AccessControlAllowOrigin::*;
31		match origin {
32			Value(val) => header::AccessControlAllowOrigin::Value((*val).to_owned()),
33			Null => header::AccessControlAllowOrigin::Null,
34			Any => header::AccessControlAllowOrigin::Any,
35		}
36	})
37}