bitconch_jsonrpc_http_server/
utils.rs

1use hyper::{self, header};
2
3use server_utils::{cors, hosts};
4
5/// Extracts string value of a single header in request.
6fn read_header<'a>(req: &'a hyper::Request<hyper::Body>, header_name: &str) -> Option<&'a str> {
7	req.headers().get(header_name).and_then(|v| v.to_str().ok())
8}
9
10/// Returns `true` if Host header in request matches a list of allowed hosts.
11pub fn is_host_allowed(
12	request: &hyper::Request<hyper::Body>,
13	allowed_hosts: &Option<Vec<hosts::Host>>,
14) -> bool {
15	hosts::is_host_valid(read_header(request, "host"), allowed_hosts)
16}
17
18/// Returns a CORS AllowOrigin header that should be returned with that request.
19pub fn cors_allow_origin(
20	request: &hyper::Request<hyper::Body>,
21	cors_domains: &Option<Vec<cors::AccessControlAllowOrigin>>
22) -> cors::AllowCors<header::HeaderValue> {
23	cors::get_cors_allow_origin(read_header(request, "origin"), read_header(request, "host"), cors_domains).map(|origin| {
24		use self::cors::AccessControlAllowOrigin::*;
25		match origin {
26			Value(ref val) => header::HeaderValue::from_str(val).unwrap_or(header::HeaderValue::from_static("null")),
27			Null => header::HeaderValue::from_static("null"),
28			Any => header::HeaderValue::from_static("*"),
29		}
30	})
31}
32
33/// Returns the CORS AllowHeaders header that should be returned with that request.
34pub fn cors_allow_headers(
35	request: &hyper::Request<hyper::Body>,
36	cors_allow_headers: &cors::AccessControlAllowHeaders
37) -> cors::AllowCors<Vec<header::HeaderValue>> {
38	let headers = request.headers().keys()
39		.map(|name| name.as_str());
40	let requested_headers = request.headers()
41		.get_all("access-control-request-headers")
42		.iter()
43		.filter_map(|val| val.to_str().ok())
44		.flat_map(|val| val.split(", "))
45		.flat_map(|val| val.split(","));
46
47	cors::get_cors_allow_headers(
48		headers,
49		requested_headers,
50		cors_allow_headers.into(),
51		|name| header::HeaderValue::from_str(name)
52			.unwrap_or_else(|_| header::HeaderValue::from_static("unknown"))
53	)
54}