Skip to content

Commit 934977b

Browse files
Merge pull request #83 from for-GET/x-katt-content-type
allow for content-type to be set via 'x-katt-content-type' header
2 parents 5a4056b + ccef44d commit 934977b

File tree

3 files changed

+39
-9
lines changed

3 files changed

+39
-9
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,14 @@ bin/katt --json base_url=http://httpbin.org my_name=Joe your_name=Mike -- doc/ex
194194

195195
A request can also be configured via HTTP request headers:
196196

197+
* `x-katt-content-type` would set a request content-type, without sending a `content-type` HTTP header
197198
* `x-katt-description` would take precedence over the transaction's description
198199
* `x-katt-request-timeout` would take precedence over the `request_timeout` param
199200
* `x-katt-request-sleep` would delay the request for a specific amount of milliseconds
200201
* `x-katt-transform` would call the `tranform` callback with its value as `id`
201202

202203
A response can also be configured via HTTP response headers:
204+
* `x-katt-content-type` would set a response (expected and actual) content-type, without expecting/receiving a `content-type` HTTP header
203205
* `x-katt-transform` would call the `tranform` callback with its value as `id`
204206

205207
### If you would like to convert a HAR file to an APIB file

src/katt.erl

+36-6
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,17 @@ run_transactions( From
280280
Request = make_katt_request(Req, Params, Callbacks),
281281
RequestFun = proplists:get_value(request, Callbacks),
282282
ValidateFun = proplists:get_value(validate, Callbacks),
283-
ActualResponse = RequestFun(Request, Params, Callbacks),
283+
ActualResponse0 = RequestFun(Request, Params, Callbacks),
284+
ActualResponseHdrs = ActualResponse0#katt_response.headers,
285+
{_ActualResponseContentType, _ActualResponseHdrs, ActualResponseHdrsCT} =
286+
get_headers_content_type(Res#katt_response.headers, ActualResponseHdrs),
287+
ParseFun = proplists:get_value(parse, Callbacks),
288+
ActualResponseParsedBody = ParseFun( ActualResponseHdrsCT
289+
, ActualResponse0#katt_response.body
290+
, Params
291+
, Callbacks
292+
),
293+
ActualResponse = ActualResponse0#katt_response{parsed_body = ActualResponseParsedBody},
284294
ExpectedResponse = make_katt_response(ActualResponse, Res, Params, Callbacks),
285295
ValidationResult = ValidateFun( ExpectedResponse
286296
, ActualResponse
@@ -326,8 +336,9 @@ make_katt_request( #katt_request{url=Url0, headers=Hdrs0, body=Body0} = Req0
326336
, Callbacks
327337
)),
328338
Url = make_request_url(Url1, Params),
329-
Hdrs = RecallFun(headers, Hdrs0, Params, Callbacks),
330-
[Hdrs, Body] = RecallFun(body, [Hdrs, Body0], Params, Callbacks),
339+
Hdrs1 = RecallFun(headers, Hdrs0, Params, Callbacks),
340+
{_ContentType, Hdrs, HdrsCT} = get_headers_content_type(Hdrs1),
341+
[HdrsCT, Body] = RecallFun(body, [HdrsCT, Body0], Params, Callbacks),
331342
Req = Req0#katt_request{ url = Url
332343
, headers = Hdrs
333344
, body = Body
@@ -341,9 +352,10 @@ make_katt_response( ActualResponse
341352
) ->
342353
RecallFun = proplists:get_value(recall, Callbacks),
343354
ParseFun = proplists:get_value(parse, Callbacks),
344-
Hdrs = RecallFun(headers, Hdrs0, Params, Callbacks),
345-
[Hdrs, Body] = RecallFun(body, [Hdrs, Body0], Params, Callbacks),
346-
ParsedBody = ParseFun(Hdrs, Body, Params, Callbacks),
355+
Hdrs1 = RecallFun(headers, Hdrs0, Params, Callbacks),
356+
{_ContentType, Hdrs, HdrsCT} = get_headers_content_type(Hdrs1),
357+
[HdrsCT, Body] = RecallFun(body, [HdrsCT, Body0], Params, Callbacks),
358+
ParsedBody = ParseFun(HdrsCT, Body, Params, Callbacks),
347359
Res = Res0#katt_response{ headers = Hdrs
348360
, body = Body
349361
, parsed_body = ParsedBody
@@ -395,3 +407,21 @@ maybe_transform_response(Res0, Params, Callbacks, ActualResponse) ->
395407
Res = Res0#katt_response{headers = Hdrs},
396408
TransformFun(TransformId, {Res, ActualResponse}, Params, Callbacks)
397409
end.
410+
411+
get_headers_content_type(Hdrs) ->
412+
get_headers_content_type(Hdrs, Hdrs).
413+
414+
get_headers_content_type(HdrsSrc, HdrsTarget0) ->
415+
case proplists:get_value("x-katt-content-type", HdrsSrc) of
416+
undefined ->
417+
{undefined, HdrsTarget0, HdrsTarget0};
418+
ContentType ->
419+
HdrsTarget = proplists:delete("x-katt-content-type", HdrsTarget0),
420+
HdrsTargetCT = case proplists:is_defined("Content-Type", HdrsTarget) of
421+
true ->
422+
katt_util:merge_proplists(HdrsTarget, [{"Content-Type", ContentType}]);
423+
false ->
424+
katt_util:merge_proplists(HdrsTarget, [{"content-type", ContentType}])
425+
end,
426+
{ContentType, HdrsTarget, HdrsTargetCT}
427+
end.

src/katt_callbacks.erl

+1-3
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,12 @@ parse(Hdrs, Body, Params, Callbacks) ->
165165
, params()
166166
, callbacks()
167167
) -> response().
168-
request(R = #katt_request{}, Params, Callbacks) ->
169-
ParseFun = proplists:get_value(parse, Callbacks),
168+
request(R = #katt_request{}, Params, _Callbacks) ->
170169
case http_request(R, Params) of
171170
{ok, {{Code, _}, Hdrs, Body}} ->
172171
#katt_response{ status = Code
173172
, headers = Hdrs
174173
, body = Body
175-
, parsed_body = ParseFun(Hdrs, Body, Params, Callbacks)
176174
};
177175
Error = {error, _} ->
178176
Error

0 commit comments

Comments
 (0)