From 52e6473446d3fa3ab03586ce66d45cb99493c0a1 Mon Sep 17 00:00:00 2001
From: Teddy Wing
Date: Sat, 4 Jul 2020 18:00:45 +0200
Subject: Generate docs v0.1.0
---
src/fastcgi_conduit/request.rs.html | 577 ++++++++++++++++++++++++++++++++++++
1 file changed, 577 insertions(+)
create mode 100644 src/fastcgi_conduit/request.rs.html
(limited to 'src/fastcgi_conduit/request.rs.html')
diff --git a/src/fastcgi_conduit/request.rs.html b/src/fastcgi_conduit/request.rs.html
new file mode 100644
index 0000000..6ca8ef6
--- /dev/null
+++ b/src/fastcgi_conduit/request.rs.html
@@ -0,0 +1,577 @@
+
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
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+use std::io;
+use std::io::Read;
+use std::net::SocketAddr;
+
+use inflector::cases::traincase::to_train_case;
+
+use snafu::{ResultExt, Snafu};
+
+
+
+#[derive(Debug, Snafu)]
+pub enum Error {
+
+ #[snafu(context(false))]
+ InvalidMethod { source: http::method::InvalidMethod },
+
+
+ #[snafu(context(false))]
+ InvalidHeaderName { source: conduit::header::InvalidHeaderName },
+
+
+ #[snafu(context(false))]
+ InvalidHeaderValue { source: conduit::header::InvalidHeaderValue },
+
+
+ #[snafu(context(false))]
+ InvalidRemoteAddr { source: RemoteAddrError },
+}
+
+
+pub type RequestResult<T, E = Error> = std::result::Result<T, E>;
+
+
+#[derive(Debug, Snafu)]
+pub enum RemoteAddrError {
+
+ #[snafu(display("Could not parse address {}: {}", address, source))]
+ AddrParseError {
+ address: String,
+ source: std::net::AddrParseError,
+ },
+
+
+ #[snafu(display("Could not parse port {}: {}", port, source))]
+ PortParseError {
+ port: String,
+ source: std::num::ParseIntError
+ },
+}
+
+
+
+
+
+
+
+pub struct FastCgiRequest<'a> {
+ request: &'a mut fastcgi::Request,
+ http_version: conduit::Version,
+ host: String,
+ method: conduit::Method,
+ headers: conduit::HeaderMap,
+ path: String,
+ query: Option<String>,
+ remote_addr: SocketAddr,
+ content_length: Option<u64>,
+ extensions: conduit::Extensions,
+}
+
+impl<'a> FastCgiRequest<'a> {
+
+ pub fn new(request: &'a mut fastcgi::Request) -> RequestResult<Self> {
+ let version = Self::version(request);
+ let host = Self::host(request);
+ let method = Self::method(request)?;
+ let headers = Self::headers(request.params())?;
+ let path = Self::path(request);
+ let query = Self::query(request);
+ let remote_addr = Self::remote_addr(request)?;
+ let content_length = Self::content_length(request);
+
+ Ok(Self {
+ request: request,
+ http_version: version,
+ host: host,
+ method: method,
+ headers: headers,
+ path: path,
+ query: query,
+ remote_addr: remote_addr,
+ content_length: content_length,
+ extensions: conduit::TypeMap::new(),
+ })
+ }
+
+
+ fn version(request: &fastcgi::Request) -> conduit::Version {
+ match request.param("SERVER_PROTOCOL").unwrap_or_default().as_str() {
+ "HTTP/0.9" => conduit::Version::HTTP_09,
+ "HTTP/1.0" => conduit::Version::HTTP_10,
+ "HTTP/1.1" => conduit::Version::HTTP_11,
+ "HTTP/2.0" => conduit::Version::HTTP_2,
+ "HTTP/3.0" => conduit::Version::HTTP_3,
+ _ => conduit::Version::default(),
+ }
+ }
+
+
+ fn scheme(&self) -> conduit::Scheme {
+ let scheme = self.request.param("REQUEST_SCHEME").unwrap_or_default();
+
+ if scheme == "https" {
+ conduit::Scheme::Https
+ } else {
+ conduit::Scheme::Http
+ }
+ }
+
+
+
+
+ fn host(request: &fastcgi::Request) -> String {
+ request.param("HTTP_HOST").unwrap_or_default()
+ }
+
+
+ fn method(
+ request: &fastcgi::Request
+ ) -> Result<conduit::Method, http::method::InvalidMethod> {
+ conduit::Method::from_bytes(
+ request.param("REQUEST_METHOD")
+ .unwrap_or_default()
+ .as_bytes()
+ )
+ }
+
+
+ fn headers(params: fastcgi::Params) -> RequestResult<conduit::HeaderMap> {
+ let mut map = conduit::HeaderMap::new();
+ let headers = Self::headers_from_params(params);
+
+ for (name, value) in headers
+ .iter()
+ .map(|(name, value)| (name.as_bytes(), value.as_bytes()))
+ {
+ map.append(
+ conduit::header::HeaderName::from_bytes(name)?,
+ conduit::header::HeaderValue::from_bytes(value)?,
+ );
+ }
+
+ Ok(map)
+ }
+
+
+
+ fn headers_from_params(params: fastcgi::Params) -> Vec<(String, String)> {
+ return params
+ .filter(|(key, _)| key.starts_with("HTTP_"))
+ .map(|(key, value)| {
+ let key = key.get(5..).unwrap_or_default();
+ let key = &key.replace("_", "-");
+ let key = &to_train_case(&key);
+
+ (key.to_owned(), value)
+ })
+ .collect()
+ }
+
+
+
+
+
+ fn path(request: &fastcgi::Request) -> String {
+ match request.param("SCRIPT_NAME") {
+ Some(p) => p,
+ None => "/".to_owned(),
+ }
+ }
+
+
+
+
+
+ fn query(request: &fastcgi::Request) -> Option<String> {
+ request.param("QUERY_STRING")
+ }
+
+
+ fn remote_addr(request: &fastcgi::Request) -> Result<SocketAddr, RemoteAddrError> {
+ let addr = request.param("REMOTE_ADDR").unwrap_or_default();
+ let port = request.param("REMOTE_PORT").unwrap_or_default();
+
+ Ok(
+ SocketAddr::new(
+ addr.parse().context(AddrParseError { address: addr })?,
+ port.parse().context(PortParseError { port })?,
+ )
+ )
+ }
+
+
+ fn content_length(request: &fastcgi::Request) -> Option<u64> {
+ request.param("CONTENT_LENGTH").and_then(|l| l.parse().ok())
+ }
+}
+
+impl<'a> Read for FastCgiRequest<'a> {
+
+
+
+ fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+ self.request.stdin().read(buf)
+ }
+}
+
+impl<'a> conduit::RequestExt for FastCgiRequest<'a> {
+ fn http_version(&self) -> conduit::Version {
+ self.http_version
+ }
+
+ fn method(&self) -> &conduit::Method {
+ &self.method
+ }
+
+ fn scheme(&self) -> conduit::Scheme {
+ self.scheme()
+ }
+
+ fn host(&self) -> conduit::Host<'_> {
+ conduit::Host::Name(&self.host)
+ }
+
+ fn virtual_root(&self) -> std::option::Option<&str> {
+ None
+ }
+
+ fn path(&self) -> &str {
+ &self.path
+ }
+
+ fn query_string(&self) -> std::option::Option<&str> {
+ self.query.as_ref()
+ .map(|p| p.as_str())
+ }
+
+ fn remote_addr(&self) -> std::net::SocketAddr {
+ self.remote_addr
+ }
+
+ fn content_length(&self) -> std::option::Option<u64> {
+ self.content_length
+ }
+
+ fn headers(&self) -> &conduit::HeaderMap {
+ &self.headers
+ }
+
+ fn body(&mut self) -> &mut (dyn std::io::Read) {
+ self
+ }
+
+ fn extensions(&self) -> &conduit::Extensions {
+ &self.extensions
+ }
+
+ fn mut_extensions(&mut self) -> &mut conduit::Extensions {
+ &mut self.extensions
+ }
+}
+
+