1use nu_protocol::{Record, Span, Value};
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
6pub struct Request {
7 pub proto: String,
8 #[serde(with = "http_serde::method")]
9 pub method: http::method::Method,
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub authority: Option<String>,
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub remote_ip: Option<std::net::IpAddr>,
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub remote_port: Option<u16>,
16 #[serde(with = "http_serde::header_map")]
17 pub headers: http::header::HeaderMap,
18 #[serde(with = "http_serde::uri")]
19 pub uri: http::Uri,
20 pub path: String,
21 pub query: HashMap<String, String>,
22}
23
24pub fn request_to_value(request: &Request, span: Span) -> Value {
25 let mut record = Record::new();
26
27 record.push("proto", Value::string(request.proto.clone(), span));
28 record.push("method", Value::string(request.method.to_string(), span));
29 record.push("uri", Value::string(request.uri.to_string(), span));
30 record.push("path", Value::string(request.path.clone(), span));
31
32 if let Some(authority) = &request.authority {
33 record.push("authority", Value::string(authority.clone(), span));
34 }
35
36 if let Some(remote_ip) = &request.remote_ip {
37 record.push("remote_ip", Value::string(remote_ip.to_string(), span));
38 }
39
40 if let Some(remote_port) = &request.remote_port {
41 record.push("remote_port", Value::int(*remote_port as i64, span));
42 }
43
44 let mut headers_record = Record::new();
46 for (key, value) in request.headers.iter() {
47 headers_record.push(
48 key.to_string(),
49 Value::string(value.to_str().unwrap_or_default().to_string(), span),
50 );
51 }
52 record.push("headers", Value::record(headers_record, span));
53
54 let mut query_record = Record::new();
56 for (key, value) in &request.query {
57 query_record.push(key.clone(), Value::string(value.clone(), span));
58 }
59 record.push("query", Value::record(query_record, span));
60
61 Value::record(record, span)
62}