Skip to content

Commit d3e676c

Browse files
segooneskedesu
authored andcommitted
feat chaotic: implement response headers
commit_hash:79d7878aada47d240d0b69b0c938e2d910f69dc0
1 parent 36f7409 commit d3e676c

File tree

6 files changed

+58
-2
lines changed

6 files changed

+58
-2
lines changed

.mapping.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
"chaotic-openapi/integration_tests/clients/external-refs/two.yaml":"taxi/uservices/userver/chaotic-openapi/integration_tests/clients/external-refs/two.yaml",
108108
"chaotic-openapi/integration_tests/clients/multiple-content-types/openapi.yaml":"taxi/uservices/userver/chaotic-openapi/integration_tests/clients/multiple-content-types/openapi.yaml",
109109
"chaotic-openapi/integration_tests/clients/parameters/openapi.yaml":"taxi/uservices/userver/chaotic-openapi/integration_tests/clients/parameters/openapi.yaml",
110+
"chaotic-openapi/integration_tests/clients/response-headers/openapi.yaml":"taxi/uservices/userver/chaotic-openapi/integration_tests/clients/response-headers/openapi.yaml",
110111
"chaotic-openapi/integration_tests/clients/swagger/swagger.yaml":"taxi/uservices/userver/chaotic-openapi/integration_tests/clients/swagger/swagger.yaml",
111112
"chaotic-openapi/integration_tests/clients/tags/openapi.yaml":"taxi/uservices/userver/chaotic-openapi/integration_tests/clients/tags/openapi.yaml",
112113
"chaotic-openapi/integration_tests/clients/test-middleware/openapi.yaml":"taxi/uservices/userver/chaotic-openapi/integration_tests/clients/test-middleware/openapi.yaml",

chaotic-openapi/chaotic_openapi/back/cpp_client/templates/responses.cpp.jinja

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,15 @@ namespace {{ namespace }} {
6262
{% endif %}
6363
{% endif %}
6464

65-
{# TODO: headers #}
65+
{% for header in response.headers %}
66+
{
67+
static const USERVER_NAMESPACE::http::headers::PredefinedHeader kHeader("{{ header.raw_name }}");
68+
auto it = http_response.headers().find(kHeader);
69+
if (it != http_response.headers().end()) {
70+
r.{{ header.cpp_name }} = it->second;
71+
}
72+
}
73+
{% endfor %}
6674

6775
{% if response.is_error() %}
6876
throw r;

chaotic-openapi/chaotic_openapi/back/cpp_client/templates/responses.hpp.jinja

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,12 @@ namespace {{ namespace }} {
6565
{% endif %}
6666

6767
{% for header in response.headers %}
68-
{{ NOT_IMPLEMENTED("response header") }}
68+
{% if header.cpp_type.nullable %}
69+
std::optional<{{ header.cpp_type.cpp_global_name() }}>
70+
{%- else -%}
71+
{{ header.cpp_type.cpp_global_name() }}
72+
{% endif -%}
73+
{{ header.cpp_name }};
6974
{% endfor %}
7075
};
7176
{% endfor %}

chaotic-openapi/chaotic_openapi/back/cpp_client/types.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ def responses_declaration_includes(self) -> List[str]:
183183
for response in op.responses:
184184
for _, body in response.body.items():
185185
includes.update(body.declaration_includes())
186+
for header in response.headers:
187+
includes.update(header.declaration_includes())
186188
return sorted(includes)
187189

188190
def responses_definitions_includes(self) -> List[str]:
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
openapi: 3.0.0
2+
info:
3+
title: test-object client
4+
version: '1.0'
5+
6+
paths:
7+
/test1:
8+
post:
9+
responses:
10+
'200':
11+
description: OK
12+
content:
13+
application/json:
14+
schema:
15+
type: object
16+
additionalProperties: false
17+
properties: {}
18+
headers:
19+
X-Header:
20+
schema:
21+
type: string
22+
components: {}

chaotic-openapi/integration_tests/src/responses_test.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <userver/utest/http_server_mock.hpp>
88

99
#include <client/multiple_content_types/responses.hpp>
10+
#include <client/response_headers/responses.hpp>
1011
#include <client/test_object/client_impl.hpp>
1112
#include <client/test_object/responses.hpp>
1213

@@ -182,6 +183,23 @@ UTEST(ResponsesMultipleContentType, InvalidSchema) {
182183
UEXPECT_THROW(client::ParseResponse(*http_response), client::ExceptionWithStatusCode);
183184
}
184185

186+
UTEST(ResponsesMultipleContentType, HeaderParse) {
187+
const utest::HttpServerMock http_server([](const utest::HttpServerMock::HttpRequest&) {
188+
utest::HttpServerMock::HttpResponse r;
189+
r.response_status = 200;
190+
r.body = R"({})";
191+
r.headers[std::string{"Content-Type"}] = "application/json";
192+
r.headers[std::string{"X-Header"}] = "string";
193+
return r;
194+
});
195+
auto http_client = utest::CreateHttpClient();
196+
auto http_response = http_client->CreateRequest().get(http_server.GetBaseUrl() + "/test1").perform();
197+
198+
namespace client = ::clients::response_headers::test1_post;
199+
auto response = client::ParseResponse(*http_response);
200+
EXPECT_EQ(response.X_Header, "string");
201+
}
202+
185203
} // namespace
186204

187205
USERVER_NAMESPACE_END

0 commit comments

Comments
 (0)