Initial commit. Code panics.
This commit is contained in:
commit
e81efdd6a9
10
.idea/.gitignore
vendored
Normal file
10
.idea/.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
|
# GitHub Copilot persisted chat sessions
|
||||||
|
/copilot/chatSessions
|
||||||
16
.idea/checkstyle-idea.xml
Normal file
16
.idea/checkstyle-idea.xml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CheckStyle-IDEA" serialisationVersion="2">
|
||||||
|
<checkstyleVersion>10.14.0</checkstyleVersion>
|
||||||
|
<scanScope>JavaOnly</scanScope>
|
||||||
|
<copyLibs>true</copyLibs>
|
||||||
|
<option name="thirdPartyClasspath" />
|
||||||
|
<option name="activeLocationIds" />
|
||||||
|
<option name="locations">
|
||||||
|
<list>
|
||||||
|
<ConfigurationLocation id="bundled-sun-checks" type="BUNDLED" scope="All" description="Sun Checks">(bundled)</ConfigurationLocation>
|
||||||
|
<ConfigurationLocation id="bundled-google-checks" type="BUNDLED" scope="All" description="Google Checks">(bundled)</ConfigurationLocation>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/udemy-course-server.iml" filepath="$PROJECT_DIR$/.idea/udemy-course-server.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
13
.idea/udemy-course-server.iml
Normal file
13
.idea/udemy-course-server.iml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/.idea/copilot/chatSessions" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
11
src/http/method.rs
Normal file
11
src/http/method.rs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
pub enum Method {
|
||||||
|
GET(String),
|
||||||
|
DELETE(u64),
|
||||||
|
POST,
|
||||||
|
PUT,
|
||||||
|
HEAD,
|
||||||
|
CONNECT,
|
||||||
|
OPTIONS,
|
||||||
|
TRACE,
|
||||||
|
PATCH,
|
||||||
|
}
|
||||||
5
src/http/mod.rs
Normal file
5
src/http/mod.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
pub use request::Request;
|
||||||
|
pub use method::Method;
|
||||||
|
|
||||||
|
pub mod request;
|
||||||
|
pub mod method;
|
||||||
32
src/http/request.rs
Normal file
32
src/http/request.rs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
use super::method::Method;
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
use std::io::Error;
|
||||||
|
use std::fmt::{Display, Debug};
|
||||||
|
|
||||||
|
pub struct Request {
|
||||||
|
path: String,
|
||||||
|
query_string: Option<String>,
|
||||||
|
method: Method,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Request {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<&[u8]> for Request {
|
||||||
|
type Error = String;
|
||||||
|
|
||||||
|
fn try_from(buffer: &[u8]) -> Result<Self, Self::Error> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum ParseError {
|
||||||
|
InvalidRequest,
|
||||||
|
InvalidEncoding,
|
||||||
|
InvalidProtocol
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Error for ParseError {
|
||||||
|
|
||||||
|
}
|
||||||
65
src/server.rs
Normal file
65
src/server.rs
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
use std::io::Read;
|
||||||
|
use std::net::TcpListener;
|
||||||
|
use std::process;
|
||||||
|
use std::ptr::read;
|
||||||
|
use super::Request;
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
use std::convert::TryInto;
|
||||||
|
|
||||||
|
/// A sample HTTP request looks like this:
|
||||||
|
/// ```
|
||||||
|
/// GET / HTTP/1.1\r\n
|
||||||
|
/// HEADERS \r\n
|
||||||
|
/// BODY
|
||||||
|
/// ```
|
||||||
|
pub struct Server {
|
||||||
|
address: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Server {
|
||||||
|
pub fn new(address: String) -> Self {
|
||||||
|
Self {
|
||||||
|
address,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run(self) {
|
||||||
|
let (ip, port) = self.address.split_at(self.address.find(":").unwrap());
|
||||||
|
let port = &port[1..];
|
||||||
|
|
||||||
|
let listener = match TcpListener::bind(&self.address) {
|
||||||
|
Ok(listener) => listener,
|
||||||
|
Err(e) => {
|
||||||
|
println!("Failed to bind to {} <- {}", self.address, e);
|
||||||
|
process::exit(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
println!("Listening on {} at port {}", ip, port);
|
||||||
|
|
||||||
|
loop {
|
||||||
|
match listener.accept() {
|
||||||
|
Ok((mut stream, _)) => {
|
||||||
|
let mut buffer = [0; 1024];
|
||||||
|
match stream.read(&mut buffer) {
|
||||||
|
Ok(read_bytes) => {
|
||||||
|
println!("Read {} bytes", read_bytes);
|
||||||
|
println!("Received a request: {}", String::from_utf8_lossy(&buffer));
|
||||||
|
match Request::try_from(&buffer[..]){
|
||||||
|
Ok(request) => {},
|
||||||
|
Err(e) => println!("Failed to parse a request: {e}")
|
||||||
|
};
|
||||||
|
let result: &Result<Request, _> = &buffer[..].try_into();
|
||||||
|
}
|
||||||
|
Err(error) => {
|
||||||
|
println!("Failed to read: {}", error);
|
||||||
|
process::exit(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
println!("Failed to establish a connection: {}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user