Merge pull request #57 from begriffs/cors-info-body

Allow browsers to load table OPTIONS after preflight
This commit is contained in:
Joe Nelson
2014-10-07 15:08:54 -07:00
2 changed files with 54 additions and 30 deletions
+4 -3
View File
@@ -96,7 +96,7 @@ app conn anonymous req respond = do
responseLBS status200 [jsonContentType] <$> printTables ver conn responseLBS status200 [jsonContentType] <$> printTables ver conn
([table], "OPTIONS") -> ([table], "OPTIONS") ->
responseLBS status200 [jsonContentType] <$> responseLBS status200 [jsonContentType, allOrigins] <$>
printColumns ver (cs table) conn printColumns ver (cs table) conn
([table], "GET") -> ([table], "GET") ->
@@ -165,6 +165,7 @@ app conn anonymous req respond = do
ver = fromMaybe "1" $ requestedVersion hdrs ver = fromMaybe "1" $ requestedVersion hdrs
range = requestedRange hdrs range = requestedRange hdrs
cRange = requestedContentRange hdrs cRange = requestedContentRange hdrs
allOrigins = ("Access-Control-Allow-Origin", "*") :: Header
defaultCorsPolicy :: CorsResourcePolicy defaultCorsPolicy :: CorsResourcePolicy
defaultCorsPolicy = CorsResourcePolicy Nothing defaultCorsPolicy = CorsResourcePolicy Nothing
@@ -174,8 +175,8 @@ defaultCorsPolicy = CorsResourcePolicy Nothing
corsPolicy :: Request -> Maybe CorsResourcePolicy corsPolicy :: Request -> Maybe CorsResourcePolicy
corsPolicy req = case lookup "origin" headers of corsPolicy req = case lookup "origin" headers of
Just origin -> Just defaultCorsPolicy { Just origin -> Just defaultCorsPolicy {
corsOrigins = Just ([origin], True), corsOrigins = Just ([origin], True)
corsRequestHeaders = "Authentication":accHeaders , corsRequestHeaders = "Authentication":accHeaders
} }
Nothing -> Nothing Nothing -> Nothing
where where
+32 -9
View File
@@ -5,7 +5,8 @@ module Feature.CorsSpec where
-- {{{ Imports -- {{{ Imports
import Test.Hspec import Test.Hspec
import Test.Hspec.Wai import Test.Hspec.Wai
import Network.Wai.Test (SResponse(simpleHeaders)) import Network.Wai.Test (SResponse(simpleHeaders, simpleBody))
import qualified Data.ByteString.Lazy as BL
import SpecHelper import SpecHelper
@@ -14,15 +15,25 @@ import Network.HTTP.Types
spec :: Spec spec :: Spec
spec = around appWithFixture $ spec = around appWithFixture $
describe "CORS" $ describe "CORS" $ do
let preflightHeaders = [
("Accept", "*/*"),
("Origin", "http://example.com"),
("Access-Control-Request-Method", "POST"),
("Access-Control-Request-Headers", "Foo,Bar") ]
let normalCors = [
("Host", "localhost:3000"),
("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0"),
("Origin", "http://localhost:8000"),
("Accept", "text/plain, */*; q=0.01"),
("Accept-Language", "en-US,en;q=0.5"),
("Accept-Encoding", "gzip, deflate"),
("Referer", "http://localhost:8000/"),
("Connection", "keep-alive") ]
describe "preflight request" $ do
it "replies naively and permissively to preflight request" $ do it "replies naively and permissively to preflight request" $ do
r <- request methodOptions "/" r <- request methodOptions "/items" preflightHeaders ""
[
("Accept", "*/*")
, ("Origin", "http://example.com")
, ("Access-Control-Request-Method", "POST")
, ("Access-Control-Request-Headers", "Foo,Bar")
] ""
liftIO $ do liftIO $ do
let respHeaders = simpleHeaders r let respHeaders = simpleHeaders r
respHeaders `shouldSatisfy` matchHeader respHeaders `shouldSatisfy` matchHeader
@@ -40,3 +51,15 @@ spec = around appWithFixture $
respHeaders `shouldSatisfy` matchHeader respHeaders `shouldSatisfy` matchHeader
"Access-Control-Max-Age" "Access-Control-Max-Age"
"86400" "86400"
it "suppresses body in response" $ do
r <- request methodOptions "/" preflightHeaders ""
liftIO $ simpleBody r `shouldBe` ""
describe "postflight request" $
it "allows INFO body through even with CORS request headers present" $ do
r <- request methodOptions "/items" normalCors ""
liftIO $ do
simpleHeaders r `shouldSatisfy` matchHeader
"Access-Control-Allow-Origin" "\\*"
simpleBody r `shouldSatisfy` not . BL.null