It doesn't work
This commit is contained in:
commit
6b39cbfd4f
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/target
|
||||
Cargo.lock
|
12
Cargo.toml
Normal file
12
Cargo.toml
Normal file
|
@ -0,0 +1,12 @@
|
|||
[package]
|
||||
name = "tor-hs-clearweb-mirror"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
arti-client = "0.11.0"
|
||||
eyre = "0.6.8"
|
||||
tokio = { version = "1.34.0", features = ["full"] }
|
||||
tor-rtcompat = "0.9.5"
|
99
src/http_lib.rs
Normal file
99
src/http_lib.rs
Normal file
|
@ -0,0 +1,99 @@
|
|||
use arti_client::TorClient;
|
||||
use eyre::Result;
|
||||
use tokio::io::{AsyncWriteExt, AsyncReadExt};
|
||||
|
||||
trait Serialize {
|
||||
fn serialize(&self) -> Vec<u8>;
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct HTTPRequest {
|
||||
pub method: HTTPMethod,
|
||||
pub location: String,
|
||||
pub version: String,
|
||||
pub headers: Vec<HTTPHeader>,
|
||||
pub body: Option<Vec<u8>>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub enum HTTPMethod {
|
||||
Get,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct HTTPHeader {
|
||||
pub key: String,
|
||||
pub value: String,
|
||||
}
|
||||
|
||||
impl Serialize for HTTPRequest {
|
||||
fn serialize(&self) -> Vec<u8> {
|
||||
let mut result = vec![];
|
||||
|
||||
let mut method_vec_u8 = self.method.serialize();
|
||||
let mut location_vec_u8 = self.location.as_bytes().to_vec();
|
||||
let mut version_vec_u8 = self.version.as_bytes().to_vec();
|
||||
let mut headers = self
|
||||
.headers
|
||||
.iter()
|
||||
.map(|x| x.serialize())
|
||||
.collect::<Vec<_>>()
|
||||
.concat();
|
||||
|
||||
result.append(&mut method_vec_u8);
|
||||
result.push(b' ');
|
||||
result.append(&mut location_vec_u8);
|
||||
result.push(b' ');
|
||||
result.append(&mut version_vec_u8);
|
||||
result.append(&mut headers);
|
||||
result.push(b'\n');
|
||||
result.push(b'\n');
|
||||
|
||||
if let Some(body) = &self.body {
|
||||
let mut body = body.clone();
|
||||
result.append(&mut body)
|
||||
}
|
||||
|
||||
let _ = dbg!(String::from_utf8(result.clone()));
|
||||
result
|
||||
}
|
||||
}
|
||||
|
||||
impl Serialize for HTTPMethod {
|
||||
fn serialize(&self) -> Vec<u8> {
|
||||
use HTTPMethod as M;
|
||||
match self {
|
||||
M::Get => b"GET"
|
||||
}.to_vec()
|
||||
}
|
||||
}
|
||||
|
||||
impl Serialize for HTTPHeader {
|
||||
fn serialize(&self) -> Vec<u8> {
|
||||
format!("\n{}: {}", self.key, self.value).into_bytes()
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn get_website(
|
||||
address: &str,
|
||||
port: u16,
|
||||
request: HTTPRequest,
|
||||
tor_client: TorClient<tor_rtcompat::PreferredRuntime>,
|
||||
) -> Result<Vec<u8>> {
|
||||
let mut client_stream = tor_client.connect((address, port)).await?;
|
||||
client_stream.write_all(&request.serialize()).await?;
|
||||
println!("Sent request for {} to {address}", request.location);
|
||||
let mut response_status: Vec<u8> = Vec::new();
|
||||
|
||||
loop {
|
||||
let response = client_stream.read_u8().await?;
|
||||
response_status.push(dbg!(response));
|
||||
if response == b'\n' {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let _ = dbg!(String::from_utf8(response_status));
|
||||
|
||||
todo!();
|
||||
}
|
26
src/main.rs
Normal file
26
src/main.rs
Normal file
|
@ -0,0 +1,26 @@
|
|||
use arti_client::{TorClient, TorClientConfig};
|
||||
use eyre::Result;
|
||||
|
||||
mod http_lib;
|
||||
use http_lib::*;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
let config = TorClientConfig::default();
|
||||
let tor_client = TorClient::create_bootstrapped(config).await?;
|
||||
println!("Tor Client Created!");
|
||||
let test_request = HTTPRequest {
|
||||
method: HTTPMethod::Get,
|
||||
location: "/".to_string(),
|
||||
version: "HTTP/1.1".to_string(),
|
||||
headers: vec![HTTPHeader {
|
||||
key: "Host".to_string(),
|
||||
value: "example.com".to_string(),
|
||||
}],
|
||||
body: None,
|
||||
};
|
||||
|
||||
dbg!(get_website("example.com", 80, test_request, tor_client).await?);
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in a new issue