on master help sign in
Request and response headers have case-insensitive match
commit4b1e3635df91748e01fa569efdc8432d720d5e1f authorMichael Snoyman <michael@snoyman.com> dateSun 4 Apr 2010, 11:10 (17 years ago) parent1b2f9de
2 files changed+50−13
Network/Wai.hs+49−12 wai.cabal+1−1
Network/Wai.hs+49−12
@@ -46,12 +46,15 @@ module Network.Wai
4646 , httpVersionToBS
4747 -- ** Request header names
4848 , RequestHeader (..)
49+ , requestHeader
4950 , requestHeaderFromBS
5051 , requestHeaderToBS
52+ , requestHeaderToLower
5153 -- ** Response header names
5254 , ResponseHeader (..)
5355 , responseHeaderFromBS
5456 , responseHeaderToBS
57+ , responseHeaderToLower
5558 -- ** Response status code
5659 , Status (..)
5760 , statusCode
@@ -69,6 +72,7 @@ module Network.Wai
6972
7073import qualified Data.ByteString as B
7174import qualified Data.ByteString.Char8 as B8
75+import Data.Char (toLower)
7276
7377-- $show_read
7478--
@@ -165,8 +169,8 @@ httpVersionToBS (HttpVersion bs) = bs
165169-- The naming rules are simple: removing any hyphens from the actual name, and
166170-- if there is a naming conflict with a 'ResponseHeader', prefix with Req.
167171--
168−-- Equality determined by conversion via 'requestHeaderToBS'. Remember, headers
169−-- are case sensitive.
172+-- Equality determined by conversion via 'requestHeaderToLower'. Request
173+-- headers are *not* case sensitive (a change from version 0.0 of WAI).
170174data RequestHeader =
171175 Accept
172176 | AcceptCharset
@@ -178,11 +182,17 @@ data RequestHeader =
178182 | ReqContentType
179183 | Host
180184 | Referer
181− | RequestHeader B.ByteString
185+ | RequestHeader B.ByteString B.ByteString
182186 deriving (Show, Read)
183187
188+lowerBS :: B.ByteString -> B.ByteString
189+lowerBS = B8.map toLower
190+
191+requestHeader :: B.ByteString -> RequestHeader
192+requestHeader x = RequestHeader x $ lowerBS x
193+
184194instance Eq RequestHeader where
185− x == y = requestHeaderToBS x == requestHeaderToBS y
195+ x == y = requestHeaderToLower x == requestHeaderToLower y
186196
187197requestHeaderFromBS :: B.ByteString -> RequestHeader
188198requestHeaderFromBS bs = case B8.unpack bs of
@@ -196,7 +206,7 @@ requestHeaderFromBS bs = case B8.unpack bs of
196206 "Content-Type" -> ReqContentType
197207 "Host" -> Host
198208 "Referer" -> Referer
199− _ -> RequestHeader bs
209+ _ -> requestHeader bs
200210
201211requestHeaderToBS :: RequestHeader -> B.ByteString
202212requestHeaderToBS Accept = B8.pack "Accept"
@@ -209,8 +219,20 @@ requestHeaderToBS ReqContentLength = B8.pack "Content-Length"
209219requestHeaderToBS ReqContentType = B8.pack "Content-Type"
210220requestHeaderToBS Host = B8.pack "Host"
211221requestHeaderToBS Referer = B8.pack "Referer"
212−requestHeaderToBS (RequestHeader bs) = bs
213−
222+requestHeaderToBS (RequestHeader bs _) = bs
223+
224+requestHeaderToLower :: RequestHeader -> B.ByteString
225+requestHeaderToLower Accept = B8.pack "accept"
226+requestHeaderToLower AcceptCharset = B8.pack "accept-charset"
227+requestHeaderToLower AcceptEncoding = B8.pack "accept-encoding"
228+requestHeaderToLower AcceptLanguage = B8.pack "accept-language"
229+requestHeaderToLower Authorization = B8.pack "authorization"
230+requestHeaderToLower Cookie = B8.pack "cookie"
231+requestHeaderToLower ReqContentLength = B8.pack "content-Length"
232+requestHeaderToLower ReqContentType = B8.pack "content-Type"
233+requestHeaderToLower Host = B8.pack "host"
234+requestHeaderToLower Referer = B8.pack "referer"
235+requestHeaderToLower (RequestHeader _ bs) = bs
214236
215237-- | Headers sent from the server to the client. Clearly, this is not a
216238-- complete list of all possible headers, but rather a selection of common
@@ -219,8 +241,8 @@ requestHeaderToBS (RequestHeader bs) = bs
219241--
220242-- if there is a naming conflict with a 'ResponseHeader', prefix with Req.
221243--
222−-- Equality determined by conversion via 'responseHeaderToBS'. Remember,
223−-- headers are case sensitive.
244+-- Equality determined by conversion via 'responseHeaderToLower'. Response
245+-- headers are *not* case sensitive (a change from version 0.0 of WAI).
224246data ResponseHeader =
225247 ContentEncoding
226248 | ContentLanguage
@@ -231,12 +253,15 @@ data ResponseHeader =
231253 | Location
232254 | Server
233255 | SetCookie
234− | ResponseHeader B.ByteString
256+ | ResponseHeader B.ByteString B.ByteString
235257 deriving (Show)
236258
237259instance Eq ResponseHeader where
238260 x == y = responseHeaderToBS x == responseHeaderToBS y
239261
262+responseHeader :: B.ByteString -> ResponseHeader
263+responseHeader x = ResponseHeader x $ lowerBS x
264+
240265responseHeaderFromBS :: B.ByteString -> ResponseHeader
241266responseHeaderFromBS bs = case B8.unpack bs of
242267 "Content-Encoding" -> ContentEncoding
@@ -248,7 +273,7 @@ responseHeaderFromBS bs = case B8.unpack bs of
248273 "Location" -> Location
249274 "Server" -> Server
250275 "Set-Cookie" -> SetCookie
251− _ -> ResponseHeader bs
276+ _ -> responseHeader bs
252277
253278responseHeaderToBS :: ResponseHeader -> B.ByteString
254279responseHeaderToBS ContentEncoding = B8.pack "Content-Encoding"
@@ -260,7 +285,19 @@ responseHeaderToBS Expires = B8.pack "Expires"
260285responseHeaderToBS Location = B8.pack "Location"
261286responseHeaderToBS Server = B8.pack "Server"
262287responseHeaderToBS SetCookie = B8.pack "Set-Cookie"
263−responseHeaderToBS (ResponseHeader bs) = bs
288+responseHeaderToBS (ResponseHeader bs _) = bs
289+
290+responseHeaderToLower :: ResponseHeader -> B.ByteString
291+responseHeaderToLower ContentEncoding = B8.pack "content-encoding"
292+responseHeaderToLower ContentLanguage = B8.pack "content-language"
293+responseHeaderToLower ContentLength = B8.pack "content-length"
294+responseHeaderToLower ContentDisposition = B8.pack "content-disposition"
295+responseHeaderToLower ContentType = B8.pack "content-type"
296+responseHeaderToLower Expires = B8.pack "expires"
297+responseHeaderToLower Location = B8.pack "location"
298+responseHeaderToLower Server = B8.pack "server"
299+responseHeaderToLower SetCookie = B8.pack "set-cookie"
300+responseHeaderToLower (ResponseHeader _ bs) = bs
264301
265302-- | This attempts to provide the most common HTTP status codes, not all of
266303-- them. Use the Status constructor when you want to create a status code not
wai.cabal+1−1
@@ -1,5 +1,5 @@
11Name: wai
2−Version: 0.0.1
2+Version: 0.2.0
33Synopsis: Web Application Interface.
44Description: Provides a common protocol for communication between web aplications and web servers.
55License: BSD3