bitconch_jsonrpc_http_server/
utils.rs1use hyper::{self, header};
2
3use server_utils::{cors, hosts};
4
5fn 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
10pub 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
18pub 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
33pub 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}