1
- use std:: fs;
2
- use std:: io:: prelude:: * ;
3
- use std:: net:: TcpListener ;
4
- use std:: net:: TcpStream ;
1
+ use std:: {
2
+ fs,
3
+ io:: { prelude:: * , BufReader } ,
4
+ net:: { TcpListener , TcpStream } ,
5
+ } ;
5
6
6
7
fn main ( ) {
7
8
let listener = TcpListener :: bind ( "127.0.0.1:7878" ) . unwrap ( ) ;
@@ -14,32 +15,31 @@ fn main() {
14
15
}
15
16
16
17
fn handle_connection ( mut stream : TcpStream ) {
17
- let mut buffer = [ 0 ; 1024 ] ;
18
- stream . read ( & mut buffer ) . unwrap ( ) ;
18
+ let buf_reader = BufReader :: new ( & mut stream ) ;
19
+ let request_line = buf_reader . lines ( ) . next ( ) . unwrap ( ) . unwrap ( ) ;
19
20
20
- let get = b"GET / HTTP/1.1\r \n " ;
21
-
22
- if buffer. starts_with ( get) {
21
+ if request_line == "GET / HTTP/1.1" {
22
+ let status_line = "HTTP/1.1 200 OK" ;
23
23
let contents = fs:: read_to_string ( "hello.html" ) . unwrap ( ) ;
24
+ let length = contents. len ( ) ;
24
25
25
26
let response = format ! (
26
- "HTTP/1.1 200 OK\r \n Content-Length: {}\r \n \r \n {}" ,
27
- contents. len( ) ,
28
- contents
27
+ "{status_line}\r \n Content-Length: {length}\r \n \r \n {contents}"
29
28
) ;
30
29
31
- stream. write ( response. as_bytes ( ) ) . unwrap ( ) ;
32
- stream. flush ( ) . unwrap ( ) ;
30
+ stream. write_all ( response. as_bytes ( ) ) . unwrap ( ) ;
33
31
// ANCHOR: here
34
32
// --snip--
35
33
} else {
36
- let status_line = "HTTP/1.1 404 NOT FOUND\r \n \r \n " ;
34
+ let status_line = "HTTP/1.1 404 NOT FOUND" ;
37
35
let contents = fs:: read_to_string ( "404.html" ) . unwrap ( ) ;
36
+ let length = contents. len ( ) ;
38
37
39
- let response = format ! ( "{}{}" , status_line, contents) ;
38
+ let response = format ! (
39
+ "{status_line}\r \n Content-Length: {length}\r \n \r \n {contents}"
40
+ ) ;
40
41
41
- stream. write ( response. as_bytes ( ) ) . unwrap ( ) ;
42
- stream. flush ( ) . unwrap ( ) ;
42
+ stream. write_all ( response. as_bytes ( ) ) . unwrap ( ) ;
43
43
}
44
44
// ANCHOR_END: here
45
45
}
0 commit comments