Skip to content

Instantly share code, notes, and snippets.

@Mivik
Created March 8, 2024 09:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Mivik/94f368029ab5d8b4437b6a92c54c63ca to your computer and use it in GitHub Desktop.
Save Mivik/94f368029ab5d8b4437b6a92c54c63ca to your computer and use it in GitHub Desktop.
so78124765
[package]
name = "so78124765"
version = "0.1.0"
edition = "2021"
[dependencies]
reqwest = { version = "0.11.24", features = ["json"] }
serde_json = "1.0.114"
tokio = { version = "1.36.0", features = ["net", "io-util", "rt-multi-thread", "macros"] }
mod server;
use reqwest::Client;
use serde_json::json;
use server::Server;
use tokio::task::JoinSet;
#[tokio::main]
async fn main() {
if std::env::args().nth(1).as_deref() == Some("s") {
let server = Server::new("localhost:8080".to_owned());
server.run().await;
}
let client = Client::new();
let send_req = |client: Client| async move {
client
.post("http://127.0.0.1:8080/api/create/user")
.json(&json!({
"name": "John",
"age": 30
}))
.send()
.await?
.text()
.await
};
let mut set = JoinSet::new();
for _ in 0..256 {
set.spawn(send_req(client.clone()));
}
while let Some(x) = set.join_next().await {
println!("{x:?}")
}
}
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpListener;
pub struct Server {
address: String,
}
impl Server {
pub fn new(address: String) -> Self {
Server { address }
}
pub async fn run(self) {
let listener = TcpListener::bind(&self.address)
.await
.expect("Failed to bind");
println!("Server listening on {}", self.address);
loop {
let (mut stream, _) = match listener.accept().await {
Ok(connection) => connection,
Err(e) => {
eprintln!("Connection failed: {}", e);
continue;
}
};
tokio::spawn(async move {
let mut buffer = Vec::new();
let mut read_buffer = [0; 1024];
let mut headers_ended = false;
while let Ok(n) = stream.read(&mut read_buffer).await {
if n == 0 {
break;
}
buffer.extend_from_slice(&read_buffer[..n]);
// Check if we've encountered the end of the headers section
if buffer.windows(4).any(|window| window == b"\r\n\r\n") {
headers_ended = true;
break;
}
}
if !headers_ended {
eprintln!("Failed to read the complete headers.");
return;
}
// let request_str = String::from_utf8_lossy(&buffer);
// Split the request string into headers and body parts
// let mut parts = request_str.split("\r\n\r\n");
// let headers_part = parts.next().unwrap_or_default();
// let body_part = parts.next().unwrap_or_default();
// let request = Request::new(headers_part.to_string(), body_part.to_string());
// let response = router.handle(request).await;
let _ = stream.write(b"HTTP/1.1 200\r\n\r\nHello").await;
let _ = stream.flush().await;
let _ = stream.shutdown().await;
});
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment