@@ -36,10 +36,21 @@ impl Handler for Static {
36
36
}
37
37
38
38
let mime = self . types . mime_for_path ( & path) ;
39
- let file = try!( File :: open ( & path) . map_err ( |e| box e as Box < Show > ) ) ;
39
+ let mut file = match File :: open ( & path) {
40
+ Ok ( f) => f,
41
+ Err ( ..) => {
42
+ return Ok ( Response {
43
+ status : ( 404 , "Not Found" ) ,
44
+ headers : HashMap :: new ( ) ,
45
+ body : box NullReader ,
46
+ } )
47
+ }
48
+ } ;
49
+ let stat = try!( file. stat ( ) . map_err ( |e| box e as Box < Show > ) ) ;
40
50
41
51
let mut headers = HashMap :: new ( ) ;
42
- headers. insert ( "Content-Type" . to_str ( ) , vec ! ( mime. to_str( ) ) ) ;
52
+ headers. insert ( "Content-Type" . to_str ( ) , vec ! [ mime. to_str( ) ] ) ;
53
+ headers. insert ( "Content-Length" . to_str ( ) , vec ! [ stat. size. to_str( ) ] ) ;
43
54
44
55
Ok ( Response {
45
56
status : ( 200 , "OK" ) ,
@@ -69,9 +80,10 @@ mod tests {
69
80
let mut res = handler. call ( & mut req) . ok ( ) . expect ( "No response" ) ;
70
81
let body = res. body . read_to_str ( ) . ok ( ) . expect ( "No body" ) ;
71
82
assert_eq ! ( body. as_slice( ) , "[package]" ) ;
72
- assert_eq ! ( res. headers. find_equiv( & "Content-Type" )
73
- . expect( "No content-type" ) ,
74
- & vec!( "text/plain" . to_str( ) ) ) ;
83
+ assert_eq ! ( res. headers. find_equiv( & "Content-Type" ) ,
84
+ Some ( & vec!( "text/plain" . to_str( ) ) ) ) ;
85
+ assert_eq ! ( res. headers. find_equiv( & "Content-Length" ) ,
86
+ Some ( & vec![ "9" . to_str( ) ] ) ) ;
75
87
}
76
88
77
89
#[ test]
@@ -84,8 +96,20 @@ mod tests {
84
96
let handler = Static :: new ( root. clone ( ) ) ;
85
97
let mut req = test:: MockRequest :: new ( conduit:: Get , "/src/fixture.css" ) ;
86
98
let res = handler. call ( & mut req) . ok ( ) . expect ( "No response" ) ;
87
- assert_eq ! ( res. headers. find_equiv( & "Content-Type" )
88
- . expect( "No content-type" ) ,
89
- & vec!( "text/css" . to_str( ) ) ) ;
99
+ assert_eq ! ( res. headers. find_equiv( & "Content-Type" ) ,
100
+ Some ( & vec!( "text/css" . to_str( ) ) ) ) ;
101
+ assert_eq ! ( res. headers. find_equiv( & "Content-Length" ) ,
102
+ Some ( & vec![ "0" . to_str( ) ] ) ) ;
103
+ }
104
+
105
+ #[ test]
106
+ fn test_missing ( ) {
107
+ let td = TempDir :: new ( "conduit-static" ) . unwrap ( ) ;
108
+ let root = td. path ( ) ;
109
+
110
+ let handler = Static :: new ( root. clone ( ) ) ;
111
+ let mut req = test:: MockRequest :: new ( conduit:: Get , "/nope" ) ;
112
+ let res = handler. call ( & mut req) . ok ( ) . expect ( "No response" ) ;
113
+ assert_eq ! ( res. status. val0( ) , 404 ) ;
90
114
}
91
115
}
0 commit comments