laforge has submitted this change. ( 
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, 68 insertions(+), 10 deletions(-)

Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved




diff --git a/library/HTTP_Adapter.ttcn b/library/HTTP_Adapter.ttcn
index 0885f05..b302a80 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,65 @@
 }
 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 to add HeaderLines to a an existing set of HeaderLines. 
HeaderLines that are already present, are updated. */
+function f_overlay_HTTP_Header(HeaderLines hdr, HeaderLines additional_hdr) 
return template (value) HeaderLines
+{
+       var integer i;
+       var integer k;
+       var boolean updated;
+
+       for (i := 0; i < lengthof(additional_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(additional_hdr[i].header_name)) {
+                               hdr[k] := additional_hdr[i];
+                               updated := true;
+                       }
+               }
+               if (updated == false) {
+                       hdr := hdr & { additional_hdr[i] };
+               }
+       }
+
+       return hdr;
+}
+
+template (value) HeaderLine ts_HeaderLine(charstring header_name, charstring 
header_value) := {
+       header_name := header_name,
+       header_value := header_value
+}
+
+function f_ts_HTTP_Header(template (omit) charstring body := omit,
+                         template (omit) charstring host := omit,
+                         HeaderLines custom_hdr := { })
+return template (value) HeaderLines {
+       var HeaderLines hdr := { };
+
+       /* Build default header */
+       if (not istemplatekind(host, "omit")) {
+               hdr := hdr & {valueof(ts_HeaderLine("Host", valueof(host)))};
+       }
+       hdr := hdr & {{ header_name := "Content-Type", header_value := 
"application/json" }};
+       if (not istemplatekind(body, "omit")) {
+               hdr := hdr & {valueof(ts_HeaderLine("Content-Length", 
int2str(lengthof(body))))};
+       }
+
+       return f_overlay_HTTP_Header(hdr, custom_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(f_ts_HTTP_Header(body, host, custom_hdr)),
                body := body
        }
 }
@@ -73,11 +115,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 +147,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);
 }


--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36504?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I115fd14254e0957c0955649aeb47059dc180bf57
Gerrit-Change-Number: 36504
Gerrit-PatchSet: 5
Gerrit-Owner: dexter <pma...@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <lafo...@osmocom.org>
Gerrit-Reviewer: pespin <pes...@sysmocom.de>
Gerrit-MessageType: merged

Reply via email to