http_nu/
request.rs

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    // Convert headers to a record
45    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    // Convert query parameters to a record
55    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}