0.7.3: Fully unbreak CGI implementation so that it works properly AND remove all compilation warnings.
This commit is contained in:
parent
68b7c1f34e
commit
fbbb97a98d
3 changed files with 17 additions and 18 deletions
|
@ -1 +1 @@
|
|||
9
|
||||
10
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "herb"
|
||||
version = "0.7.2"
|
||||
version = "0.7.3"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
|
|
31
src/main.rs
31
src/main.rs
|
@ -6,7 +6,7 @@ use std::fs::File;
|
|||
use std::string::{String};
|
||||
use std::process::Command;
|
||||
use packeteer::http1::*;
|
||||
use packeteer::{generate_kvheader, unwrap_url_into_segments, Url};
|
||||
use packeteer::{generate_kvheader, unwrap_url_into_segments};
|
||||
|
||||
struct Resource {
|
||||
contents: Vec<u8>,
|
||||
|
@ -64,31 +64,30 @@ fn process_cgi(filename: String) -> Option<Vec<u8>> {
|
|||
}
|
||||
|
||||
fn process_cgi_with_path(filename: String, segments: Vec<String>, location: i32) -> Option<Vec<u8>> {
|
||||
let query: String;
|
||||
let mut query: String = "".to_string();
|
||||
let script = filename;
|
||||
|
||||
if segments[segments.len()-1].contains("?") {
|
||||
let vars = segments[segments.len()-1].to_string().find("?").unwrap();
|
||||
query = segments[segments.len()-1][vars..].to_string();
|
||||
} else {
|
||||
query = "".to_string();
|
||||
}
|
||||
|
||||
let mut i = 0;
|
||||
let mut path = "".to_string();
|
||||
for seg in segments {
|
||||
if !(i <= location) {
|
||||
if !(i <= location) && !(seg.contains("?")) {
|
||||
if path == "".to_string() {
|
||||
path = format!("/{}", seg);
|
||||
} else {
|
||||
path = format!("{}/{}", path, seg);
|
||||
}
|
||||
}
|
||||
|
||||
if !(i <= location) && seg.contains("?") {
|
||||
let split: Vec<&str> = seg.as_str().split("?").collect();
|
||||
query = split[split.len()-1].to_string();
|
||||
path = format!("{}/{}", path, split[0].to_string());
|
||||
}
|
||||
i = i + 1;
|
||||
}
|
||||
|
||||
path = format!("{}/", path);
|
||||
|
||||
println!("{}", path);
|
||||
let output;
|
||||
if query != "".to_string() {
|
||||
output = Command::new(format!("./{}", script))
|
||||
|
@ -320,11 +319,11 @@ fn process_request(request: Vec<u8>) -> Resource {
|
|||
}
|
||||
let contents = process_cgi_with_path(cgipathraw, segclone, cgiscript);
|
||||
if contents.is_some() {
|
||||
let mut resource = Resource { contents: contents.unwrap(), status_code: 200, mime: "text/html".to_string(), iscgi: true };
|
||||
let resource = Resource { contents: contents.unwrap(), status_code: 200, mime: "text/html".to_string(), iscgi: true };
|
||||
return resource;
|
||||
} else {
|
||||
let newcontents = "<!DOCTYPE HTML><html><body><h1>502 Bad Gateway</h1><p>The server is unable to complete your request due to an error.</p></body></html>".to_string().into_bytes();
|
||||
let mut resource = Resource { contents: newcontents, status_code: 502, mime: "text/html".to_string(), iscgi: false };
|
||||
let resource = Resource { contents: newcontents, status_code: 502, mime: "text/html".to_string(), iscgi: false };
|
||||
return resource;
|
||||
}
|
||||
}
|
||||
|
@ -339,9 +338,9 @@ fn process_request(request: Vec<u8>) -> Resource {
|
|||
if dir == true {
|
||||
index += &path;
|
||||
index += "/index.html";
|
||||
output = index.as_str().clone();
|
||||
output = index.as_str();
|
||||
} else {
|
||||
output = path.as_str().clone();
|
||||
output = path.as_str();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -394,7 +393,7 @@ fn serve(mut stream: TcpStream) {
|
|||
}
|
||||
|
||||
if resource.iscgi {
|
||||
let mut header = "HTTP/1.1 200 OK\r\n".to_string().into_bytes();
|
||||
let header = "HTTP/1.1 200 OK\r\n".to_string().into_bytes();
|
||||
stream.write(header.as_slice()).unwrap();
|
||||
stream.write(&resource.contents).unwrap();
|
||||
stream.flush().unwrap();
|
||||
|
|
Loading…
Reference in a new issue