diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java index 4296074ddd1..96397b796f4 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java @@ -578,6 +578,25 @@ public class HaskellServantCodegen extends DefaultCodegen implements CodegenConf returnType = "(" + returnType + ")"; } + List headers = new ArrayList<>(); + for (CodegenResponse r : op.responses) { + headers.addAll(r.headers); + } + if (!headers.isEmpty()) { + List headerContents = new ArrayList<>(); + for (CodegenProperty h : headers) { + // Because headers is a Map multiple Set-Cookie headers are currently not possible. If someone + // uses the workaround with null bytes, remove them and add add each header to the list: + // https://github.com/OAI/OpenAPI-Specification/issues/1237#issuecomment-906603675 + String headerName = h.baseName.replaceAll("\0", ""); + String headerType = h.dataType; + headerContents.add("Header \"" + headerName + "\" " + headerType); + } + String headerContent = String.join(", ", headerContents); + + returnType = "(Headers '[" + headerContent + "] " + returnType + ")"; + } + String code = "200"; for (CodegenResponse r : op.responses) { if (r.code.matches("2[0-9][0-9]")) { diff --git a/samples/server/petstore/haskell-servant/lib/OpenAPIPetstore/API.hs b/samples/server/petstore/haskell-servant/lib/OpenAPIPetstore/API.hs index 5a0b734dbac..88e7aaa8764 100644 --- a/samples/server/petstore/haskell-servant/lib/OpenAPIPetstore/API.hs +++ b/samples/server/petstore/haskell-servant/lib/OpenAPIPetstore/API.hs @@ -163,7 +163,7 @@ type OpenAPIPetstoreAPI :<|> "user" :> "createWithList" :> ReqBody '[JSON] [User] :> Verb 'POST 200 '[JSON] NoContent -- 'createUsersWithListInput' route :<|> "user" :> Capture "username" Text :> Verb 'DELETE 200 '[JSON] NoContent -- 'deleteUser' route :<|> "user" :> Capture "username" Text :> Verb 'GET 200 '[JSON] User -- 'getUserByName' route - :<|> "user" :> "login" :> QueryParam "username" Text :> QueryParam "password" Text :> Verb 'GET 200 '[JSON] Text -- 'loginUser' route + :<|> "user" :> "login" :> QueryParam "username" Text :> QueryParam "password" Text :> Verb 'GET 200 '[JSON] (Headers '[Header "X-Rate-Limit" Int, Header "X-Expires-After" UTCTime] Text) -- 'loginUser' route :<|> "user" :> "logout" :> Verb 'GET 200 '[JSON] NoContent -- 'logoutUser' route :<|> "user" :> Capture "username" Text :> ReqBody '[JSON] User :> Verb 'PUT 200 '[JSON] NoContent -- 'updateUser' route :<|> Raw @@ -203,7 +203,7 @@ data OpenAPIPetstoreBackend a m = OpenAPIPetstoreBackend , createUsersWithListInput :: [User] -> m NoContent{- ^ -} , deleteUser :: Text -> m NoContent{- ^ This can only be done by the logged in user. -} , getUserByName :: Text -> m User{- ^ -} - , loginUser :: Maybe Text -> Maybe Text -> m Text{- ^ -} + , loginUser :: Maybe Text -> Maybe Text -> m (Headers '[Header "X-Rate-Limit" Int, Header "X-Expires-After" UTCTime] Text){- ^ -} , logoutUser :: m NoContent{- ^ -} , updateUser :: Text -> User -> m NoContent{- ^ This can only be done by the logged in user. -} }