1
1
module Hyper.Node.FileServer (fileServer) where
2
2
3
3
import Prelude
4
- import Node.Buffer as Buffer
5
- import Node.Path as Path
4
+
6
5
import Control.IxMonad (ibind, (:>>=))
7
6
import Control.Monad.Aff.Class (liftAff, class MonadAff)
8
7
import Control.Monad.Eff.Class (liftEff)
8
+ import Data.Array (last)
9
+ import Data.Map (Map, fromFoldable, lookup)
10
+ import Data.Maybe (maybe)
11
+ import Data.String (Pattern(..), split)
9
12
import Data.Tuple (Tuple(Tuple))
10
13
import Hyper.Conn (Conn)
11
14
import Hyper.Middleware (Middleware, lift')
@@ -14,10 +17,101 @@ import Hyper.Request (class Request, getRequestData)
14
17
import Hyper.Response (class ResponseWritable, class Response, ResponseEnded, StatusLineOpen, end, headers, send, toResponse, writeStatus)
15
18
import Hyper.Status (statusOK)
16
19
import Node.Buffer (BUFFER, Buffer)
20
+ import Node.Buffer as Buffer
17
21
import Node.FS (FS)
18
22
import Node.FS.Aff (readFile, stat, exists)
19
23
import Node.FS.Stats (isDirectory, isFile)
20
24
import Node.Path (FilePath)
25
+ import Node.Path as Path
26
+
27
+
28
+ htaccess :: Map String String
29
+ htaccess = fromFoldable $
30
+ [ Tuple "aab" "application/x-authorware-bin"
31
+ , Tuple "aam" "application/x-authorware-map"
32
+ , Tuple "aas" "application/x-authorware-seg"
33
+ , Tuple "asc" "text/plain"
34
+ , Tuple "asf" "video/x-ms-asf"
35
+ , Tuple "asp" "text/html"
36
+ , Tuple "asx" "video/x-ms-asf"
37
+ , Tuple "avi" "application/octet-stream"
38
+ , Tuple "awk" "text/plain"
39
+ , Tuple "bash" "text/plain"
40
+ , Tuple "bsh" "text/plain"
41
+ , Tuple "bz2" "application/octet-stream"
42
+ , Tuple "c" "text/plain"
43
+ , Tuple "cgi" "text/plain"
44
+ , Tuple "chm" "application/octet-stream"
45
+ , Tuple "class" "application/x-java-applet"
46
+ , Tuple "csh" "text/plain"
47
+ , Tuple "css" "text/css"
48
+ , Tuple "csv" "application/vnd.ms-excel"
49
+ , Tuple "dcr" "application/x-director"
50
+ , Tuple "dir" "application/x-director"
51
+ , Tuple "dmg" "application/octet-stream"
52
+ , Tuple "dxr" "application/x-director"
53
+ , Tuple "exe" "application/octet-stream"
54
+ , Tuple "fgd" "application/x-director"
55
+ , Tuple "fh" "image/x-freehand"
56
+ , Tuple "fh4" "image/x-freehand"
57
+ , Tuple "fh5" "image/x-freehand"
58
+ , Tuple "fh7" "image/x-freehand"
59
+ , Tuple "fhc" "image/x-freehand"
60
+ , Tuple "flv" "video/x-flv"
61
+ , Tuple "gawk" "text/plain"
62
+ , Tuple "gtar" "application/x-gtar"
63
+ , Tuple "gz" "application/x-gzip"
64
+ , Tuple "h" "text/plain"
65
+ , Tuple "ico" "image/vnd.microsoft.icon"
66
+ , Tuple "in" "text/plain"
67
+ , Tuple "ini" "text/plain"
68
+ , Tuple "m3u" "audio/x-mpegurl"
69
+ , Tuple "md5" "text/plain"
70
+ , Tuple "mov" "application/octet-stream"
71
+ , Tuple "mov" "video/quicktime"
72
+ , Tuple "mp4" "application/octet-stream"
73
+ , Tuple "mpg" "application/octet-stream"
74
+ , Tuple "msi" "application/octet-stream"
75
+ , Tuple "nawk" "text/plain"
76
+ , Tuple "pdb" "application/x-pilot"
77
+ , Tuple "pdf" "application/pdf"
78
+ , Tuple "phps" "application/x-httpd-php-source"
79
+ , Tuple "pl" "text/plain"
80
+ , Tuple "prc" "application/x-pilot"
81
+ , Tuple "py" "text/plain"
82
+ , Tuple "qt" "video/quicktime"
83
+ , Tuple "ra" "audio/vnd.rn-realaudio"
84
+ , Tuple "ram" "audio/vnd.rn-realaudio"
85
+ , Tuple "rar" "application/x-rar-compressed"
86
+ , Tuple "rm" "application/vnd.rn-realmedia"
87
+ , Tuple "rpm" "audio/x-pn-realaudio-plugin"
88
+ , Tuple "rv" "video/vnd.rn-realvideo"
89
+ , Tuple "sh" "text/plain"
90
+ , Tuple "sha" "text/plain"
91
+ , Tuple "sha1" "text/plain"
92
+ , Tuple "shtml" "text/html"
93
+ , Tuple "svg" "image/svg+xml"
94
+ , Tuple "svgz" "image/svg+xml"
95
+ , Tuple "swf" "application/x-shockwave-flash"
96
+ , Tuple "tgz" "application/octet-stream"
97
+ , Tuple "torrent" "application/x-bittorrent"
98
+ , Tuple "var" "text/plain"
99
+ , Tuple "wav" "audio/x-wav"
100
+ , Tuple "wax" "audio/x-ms-wax"
101
+ , Tuple "wm" "video/x-ms-wm"
102
+ , Tuple "wma" "audio/x-ms-wma"
103
+ , Tuple "wmd" "application/x-ms-wmd"
104
+ , Tuple "wmv" "video/x-ms-wmv"
105
+ , Tuple "wmx" "video/x-ms-wmx"
106
+ , Tuple "wmz" "application/x-ms-wmz"
107
+ , Tuple "wvx" "video/x-ms-wvx"
108
+ , Tuple "xbm" "image/x-xbitmap"
109
+ , Tuple "xhtml" "application/xhtml+xml"
110
+ , Tuple "xls" "application/octet-stream"
111
+ , Tuple "xml" "text/xml"
112
+ , Tuple "xrdf" "application/xrds+xml"
113
+ , Tuple "zip" "application/zip"
114
+ ]
21
115
22
116
serveFile
23
117
:: forall m e req res c b
@@ -32,10 +126,13 @@ serveFile
32
126
(Conn req (res ResponseEnded) c)
33
127
Unit
34
128
serveFile path = do
129
+ let
130
+ ext = last $ split (Pattern ".") path
131
+ contentType = maybe "*/*" id (ext >>= flip lookup htaccess)
35
132
buf <- lift' (liftAff (readFile path))
36
133
contentLength <- liftEff (Buffer.size buf)
37
134
_ <- writeStatus statusOK
38
- _ <- headers [ Tuple "Content-Type" "*/* ; charset=utf-8"
135
+ _ <- headers [ Tuple "Content-Type" (contentType <> " ; charset=utf-8")
39
136
, Tuple "Content-Length" (show contentLength)
40
137
]
41
138
response <- toResponse buf
0 commit comments