diff --git a/crates/lune-std-net/src/client/mod.rs b/crates/lune-std-net/src/client/mod.rs index b0a6cf9..456b0c0 100644 --- a/crates/lune-std-net/src/client/mod.rs +++ b/crates/lune-std-net/src/client/mod.rs @@ -1,7 +1,7 @@ use hyper::{ body::{Bytes, Incoming}, client::conn::http1::handshake, - header::LOCATION, + header::{HeaderValue, ACCEPT, CONTENT_LENGTH, HOST, LOCATION, USER_AGENT}, Method, Request as HyperRequest, Response as HyperResponse, Uri, }; @@ -11,6 +11,7 @@ use url::Url; use crate::{ client::{http_stream::HttpStream, ws_stream::WsStream}, shared::{ + headers::create_user_agent_header, hyper::{HyperExecutor, HyperIo}, request::Request, response::Response, @@ -45,6 +46,31 @@ pub async fn send_request(mut request: Request, lua: Lua) -> LuaResult .to_string() .parse::() .expect("uri is valid"); + + // Some headers are required by most if not + // all servers, make sure those are present... + if !request.headers().contains_key(HOST.as_str()) { + if let Some(host) = url.host_str() { + let host = HeaderValue::from_str(host).into_lua_err()?; + request.inner.headers_mut().insert(HOST, host); + } + } + if !request.headers().contains_key(USER_AGENT.as_str()) { + let ua = create_user_agent_header(&lua)?; + let ua = HeaderValue::from_str(&ua).into_lua_err()?; + request.inner.headers_mut().insert(USER_AGENT, ua); + } + if !request.headers().contains_key(CONTENT_LENGTH.as_str()) && request.method() != Method::GET { + let len = request.inner.body().len().to_string(); + let len = HeaderValue::from_str(&len).into_lua_err()?; + request.inner.headers_mut().insert(CONTENT_LENGTH, len); + } + if !request.headers().contains_key(ACCEPT.as_str()) { + let accept = HeaderValue::from_static("*/*"); + request.inner.headers_mut().insert(ACCEPT, accept); + } + + // ... we can now safely continue and send the request loop { let stream = HttpStream::connect(url.clone()).await?; diff --git a/crates/lune-std-net/src/lib.rs b/crates/lune-std-net/src/lib.rs index b8b4532..a800e9b 100644 --- a/crates/lune-std-net/src/lib.rs +++ b/crates/lune-std-net/src/lib.rs @@ -1,6 +1,5 @@ #![allow(clippy::cargo_common_metadata)] -use hyper::header::{HeaderValue, USER_AGENT}; use lune_utils::TableBuilder; use mlua::prelude::*; @@ -12,10 +11,7 @@ pub(crate) mod url; use self::{ client::ws_stream::WsStream, server::{config::ServeConfig, handle::ServeHandle}, - shared::{ - headers::create_user_agent_header, request::Request, response::Response, - websocket::Websocket, - }, + shared::{request::Request, response::Response, websocket::Websocket}, }; const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); @@ -45,12 +41,7 @@ pub fn module(lua: Lua) -> LuaResult { .build_readonly() } -async fn net_request(lua: Lua, mut req: Request) -> LuaResult { - if !req.headers().contains_key(USER_AGENT.as_str()) { - let ua = create_user_agent_header(&lua)?; - let ua = HeaderValue::from_str(&ua).into_lua_err()?; - req.inner.headers_mut().insert(USER_AGENT, ua); - } +async fn net_request(lua: Lua, req: Request) -> LuaResult { self::client::send_request(req, lua).await }