diff options
| author | Teddy Wing | 2020-06-23 03:39:52 +0200 | 
|---|---|---|
| committer | Teddy Wing | 2020-06-23 03:39:52 +0200 | 
| commit | ede3004cf563e4d46c0e8afa5fd1e18732de6c69 (patch) | |
| tree | 9022deef9946430d4d9e4149db21efaed940d5ad | |
| parent | 31c78b8655ed464c0575742b0f3f6c5daa179f97 (diff) | |
| download | fastcgi-conduit-ede3004cf563e4d46c0e8afa5fd1e18732de6c69.tar.bz2 | |
From<fastcgi::Request>: Convert HTTP headers
The HTTP headers from `fastcgi` come with keys in the following format:
"HTTP_USER_AGENT", "HTTP_ACCEPT_LANGUAGE".
Since most headers use an uppercase first letter of a word with hyphen
word separators, make the conversion by:
1. Removing the `HTTP_` prefix
2. Changing `_` to `-`
3. Making the first letter of each word uppercase using the Inflector
   crate
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/lib.rs | 28 | 
2 files changed, 27 insertions, 2 deletions
| @@ -6,3 +6,4 @@ edition = "2018"  [dependencies]  fastcgi = "1.0.0"  http = "0.2.1" +Inflector = "0.11.4" @@ -5,6 +5,7 @@ use std::io::Write;  use http::{Request, Response};  use http::request; +use inflector::cases::traincase::to_train_case;  pub fn run<F, T>(handler: F) @@ -49,10 +50,33 @@ impl From<fastcgi::Request> for http::request::Builder {              request.param("REQUEST_URI").unwrap_or("".to_owned()),          ); -        return http::request::Builder::new() +        let mut http_request = http::request::Builder::new()              .method(&*method) -            .uri(&uri) +            .uri(&uri); + +        let headers = headers_from_params(request.params()); +        for (k, v) in headers { +            http_request = http_request.header(&k, &v); +        } + +        http_request          // HTTP_* params become headers      }  } + +fn headers_from_params(params: fastcgi::Params) -> Vec<(String, String)> { +    return params +        .filter(|(key, _)| key.starts_with("HTTP_")) +        .map(|(key, value)| { +            let mut key = key.get(5..).unwrap_or("").to_owned(); +            key = key.replace("_", "-"); +            key = to_train_case(&key); + +            // Change _ to - +            // Uppercase each word + +            (key, value) +        }) +        .collect() +} | 
