Skip to content

Commit f32e838

Browse files
committed
Include response headers in the API type
1 parent a3fbb82 commit f32e838

File tree

2 files changed

+21
-2
lines changed
  • modules/openapi-generator/src/main/java/org/openapitools/codegen/languages
  • samples/server/petstore/haskell-servant/lib/OpenAPIPetstore

2 files changed

+21
-2
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,25 @@ public CodegenOperation fromOperation(String resourcePath, String httpMethod, Op
577577
returnType = "(" + returnType + ")";
578578
}
579579

580+
List<CodegenProperty> headers = new ArrayList<>();
581+
for (CodegenResponse r : op.responses) {
582+
headers.addAll(r.headers);
583+
}
584+
if (!headers.isEmpty()) {
585+
List<String> headerContents = new ArrayList<>();
586+
for (CodegenProperty h : headers) {
587+
// Because headers is a Map multiple Set-Cookie headers are currently not possible. If someone
588+
// uses the workaround with null bytes, remove them and add add each header to the list:
589+
// https://github.com/OAI/OpenAPI-Specification/issues/1237#issuecomment-906603675
590+
String headerName = h.baseName.replaceAll("\0", "");
591+
String headerType = h.dataType;
592+
headerContents.add("Header \"" + headerName + "\" " + headerType);
593+
}
594+
String headerContent = String.join(", ", headerContents);
595+
596+
returnType = "(Headers '[" + headerContent + "] " + returnType + ")";
597+
}
598+
580599
String code = "200";
581600
for (CodegenResponse r : op.responses) {
582601
if (r.code.matches("2[0-9][0-9]")) {

samples/server/petstore/haskell-servant/lib/OpenAPIPetstore/API.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ type OpenAPIPetstoreAPI
163163
:<|> "user" :> "createWithList" :> ReqBody '[JSON] [User] :> Verb 'POST 200 '[JSON] NoContent -- 'createUsersWithListInput' route
164164
:<|> "user" :> Capture "username" Text :> Verb 'DELETE 200 '[JSON] NoContent -- 'deleteUser' route
165165
:<|> "user" :> Capture "username" Text :> Verb 'GET 200 '[JSON] User -- 'getUserByName' route
166-
:<|> "user" :> "login" :> QueryParam "username" Text :> QueryParam "password" Text :> Verb 'GET 200 '[JSON] Text -- 'loginUser' route
166+
:<|> "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
167167
:<|> "user" :> "logout" :> Verb 'GET 200 '[JSON] NoContent -- 'logoutUser' route
168168
:<|> "user" :> Capture "username" Text :> ReqBody '[JSON] User :> Verb 'PUT 200 '[JSON] NoContent -- 'updateUser' route
169169
:<|> Raw
@@ -203,7 +203,7 @@ data OpenAPIPetstoreBackend a m = OpenAPIPetstoreBackend
203203
, createUsersWithListInput :: [User] -> m NoContent{- ^ -}
204204
, deleteUser :: Text -> m NoContent{- ^ This can only be done by the logged in user. -}
205205
, getUserByName :: Text -> m User{- ^ -}
206-
, loginUser :: Maybe Text -> Maybe Text -> m Text{- ^ -}
206+
, loginUser :: Maybe Text -> Maybe Text -> m (Headers '[Header "X-Rate-Limit" Int, Header "X-Expires-After" UTCTime] Text){- ^ -}
207207
, logoutUser :: m NoContent{- ^ -}
208208
, updateUser :: Text -> User -> m NoContent{- ^ This can only be done by the logged in user. -}
209209
}

0 commit comments

Comments
 (0)