dexter has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36504?usp=email )
Change subject: HTTP_Adapter: allow API users to specifiy custom header ......................................................................
HTTP_Adapter: allow API users to specifiy custom header
At the moment HTTP_Adapter can only make requests with a fixed pre-defined HTTP header. However, some application may require additional custom header lines or different values than the ones specified in the pre-defined HTTP header.
Related: SYS#6824 Change-Id: I115fd14254e0957c0955649aeb47059dc180bf57 --- M library/HTTP_Adapter.ttcn 1 file changed, 57 insertions(+), 10 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/04/36504/1
diff --git a/library/HTTP_Adapter.ttcn b/library/HTTP_Adapter.ttcn index 0885f05..879313d 100644 --- a/library/HTTP_Adapter.ttcn +++ b/library/HTTP_Adapter.ttcn @@ -15,6 +15,7 @@
import from HTTPmsg_Types all; import from HTTPmsg_PortType all; +import from Native_Functions all;
type component http_CT { port HTTPmsg_PT HTTP; @@ -37,24 +38,54 @@ } template (value) Close ts_HTTP_Close := { client_id := omit };
-template (value) HeaderLines ts_HTTP_Header(charstring body, charstring host) := { - { header_name := "Host", header_value := host }, - { header_name := "Content-Type", header_value := "application/json" }, - { header_name := "Content-Length", header_value := int2str(lengthof(body)) } +function ts_HTTP_Header(template charstring body := omit, + template charstring host := omit, + HeaderLines custom_hdr := { }) +return template (value) HeaderLines { + var HeaderLines hdr := { }; + var integer i; + var integer k; + var boolean updated; + + /* Build default header */ + if (ispresent(host)) { + hdr := hdr & {{ header_name := "Host", header_value := valueof(host) }}; + } + hdr := hdr & {{ header_name := "Content-Type", header_value := "application/json" }}; + if (ispresent(body)) { + hdr := hdr & {{ header_name := "Content-Length", header_value := int2str(lengthof(body)) }} + } + + /* Add custom header lines, already existing headers (name) are updated */ + for (i := 0; i < lengthof(custom_hdr); i := i+1) { + updated := false; + for (k := 0; k < lengthof(hdr); k := k+1) { + if (f_str_tolower(hdr[k].header_name) == f_str_tolower(custom_hdr[i].header_name)) { + hdr[k] := custom_hdr[i]; + updated := true; + } + } + if (updated == false) { + hdr := hdr & { custom_hdr[i] }; + } + } + + return hdr; }
template (value) HTTPMessage ts_HTTP_Req(charstring url, charstring method := "GET", charstring body := "", integer v_maj := 1, integer v_min := 1, - charstring host) := { + charstring host, + HeaderLines custom_hdr := { }) := { request := { client_id := omit, method := method, uri := url, version_major := v_maj, version_minor := v_min, - header := valueof(ts_HTTP_Header(body, host)), + header := valueof(ts_HTTP_Header(body, host, custom_hdr)), body := body } } @@ -73,11 +104,12 @@
template HTTPMessage tr_HTTP_Resp2xx := tr_HTTP_Resp((200..299));
-function f_http_tx_request(charstring url, charstring method := "GET", charstring body := "") +function f_http_tx_request(charstring url, charstring method := "GET", charstring body := "", + HeaderLines custom_hdr := { }) runs on http_CT { HTTP.send(ts_HTTP_Connect(g_http_host, g_http_port)); HTTP.receive(Connect_result:?); - HTTP.send(ts_HTTP_Req(url, method, body, host := g_http_host & ":" & int2str(g_http_port))); + HTTP.send(ts_HTTP_Req(url, method, body, host := g_http_host & ":" & int2str(g_http_port), custom_hdr := custom_hdr)); }
function f_http_rx_response(template HTTPMessage exp := tr_HTTP_Resp2xx, float tout := 2.0) @@ -104,9 +136,9 @@ /* run a HTTP request and return the response */ function f_http_transact(charstring url, charstring method := "GET", charstring body := "", template HTTPMessage exp := tr_HTTP_Resp2xx, - float tout := 2.0) + float tout := 2.0, HeaderLines custom_hdr := { }) runs on http_CT return HTTPMessage { - f_http_tx_request(url, method, body); + f_http_tx_request(url, method, body, custom_hdr); return f_http_rx_response(exp, tout); }