pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/43662?usp=email )
Change subject: smf: Introduce generic functions to encode HTTP2 multipart messages ......................................................................
smf: Introduce generic functions to encode HTTP2 multipart messages
Change-Id: Ie16cfd4a8a2eda57369f362ad85f9cabe737aeab --- M library/HTTP2_Functions.ttcn M library/HTTP2_Templates.ttcn M smf/SMF_Session_CT_5G.ttcn 3 files changed, 71 insertions(+), 11 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/62/43662/1
diff --git a/library/HTTP2_Functions.ttcn b/library/HTTP2_Functions.ttcn index 83ebdd6..554b7eb 100644 --- a/library/HTTP2_Functions.ttcn +++ b/library/HTTP2_Functions.ttcn @@ -36,6 +36,20 @@ } type record of HTTP2_multipart_part HTTP2_multipart_part_list;
+template (value) HTTP2_multipart_part +ts_HTTP2_multipart_part(template (value) HTTP2_header_list headers, + template (value) octetstring data) := { + headers := headers, + data := data +} + +template (present) HTTP2_multipart_part +tr_HTTP2_multipart_part(template (present) HTTP2_header_list headers, + template (present) octetstring data) := { + headers := headers, + data := data +} + private function f_HTTP2_multipart_msg_parse_part_headers(octetstring data) return HTTP2_header_list { var HTTP2_header_list li := {}; @@ -92,5 +106,47 @@ return li; }
+private function f_HTTP2_multipart_msg_encode_part_headers(template (value) HTTP2_header_list li) +return octetstring { + var octetstring data := ''O; + var octetstring sep := char2oct(": "); + var octetstring rn := char2oct("\r\n"); + for (var integer i := 0; i < lengthof(li); i := i + 1) { + data := data & + char2oct(valueof(li[i].header_name)) & + sep & + char2oct(valueof(li[i].header_value)) & + rn; + } + return data; +} + +private function f_HTTP2_multipart_msg_encode_part(template (value) HTTP2_multipart_part part) +return octetstring { + var octetstring data := ''O; + data := f_HTTP2_multipart_msg_encode_part_headers(part.headers) & + char2oct("\r\n") & + valueof(part.data); + return data; +} + +function f_HTTP2_multipart_msg_encode(template (value) HTTP2_multipart_part_list part_li, + charstring boundary := "=-0EVVjxcWWFYNd1JXh1OQEg==") +return octetstring { + var HTTP2_multipart_part_list li := {}; + var octetstring token := char2oct("--" & boundary); + var octetstring rn := char2oct("\r\n"); + var octetstring data := ''O; + + for (var integer i := 0; i < lengthof(part_li); i := i + 1) { + var octetstring part_data := f_HTTP2_multipart_msg_encode_part(part_li[i]); + data := data & rn & token & rn & part_data; + } + /* End boundary: */ + data := data & rn & token & char2oct("--") & rn; + + return data; +} +
} diff --git a/library/HTTP2_Templates.ttcn b/library/HTTP2_Templates.ttcn index d6d8296..b77377e 100644 --- a/library/HTTP2_Templates.ttcn +++ b/library/HTTP2_Templates.ttcn @@ -183,6 +183,7 @@ header_value := header_value }
+const charstring c_HTTP2_HDR_content_id := "content-id"; const charstring c_HTTP2_HDR_content_type := "content-type"; const charstring c_HTTP2_HDR_accept := "accept"; const charstring c_HTTP2_HDR_user_agent := "user-agent"; @@ -192,6 +193,11 @@ const charstring c_HTTP2_HDR_location := "location";
template (value) HTTP2_header_field +ts_HTTP2_Hdr_content_id(template (omit) charstring header_value := omit) +:= ts_HTTP2_header_field(c_HTTP2_HDR_content_id, header_value); + + +template (value) HTTP2_header_field ts_HTTP2_Hdr_content_type(template (omit) charstring header_value := omit) := ts_HTTP2_header_field(c_HTTP2_HDR_content_type, header_value);
diff --git a/smf/SMF_Session_CT_5G.ttcn b/smf/SMF_Session_CT_5G.ttcn index c754845..01c7a9f 100644 --- a/smf/SMF_Session_CT_5G.ttcn +++ b/smf/SMF_Session_CT_5G.ttcn @@ -76,17 +76,15 @@ octetstring nas_ecnoded, charstring boundary := "=-0EVVjxcWWFYNd1JXh1OQEg==") return octetstring { - var charstring boundary_ext := "\r\n--" & boundary & "\r\n"; - var octetstring boundary_enc := char2oct(boundary_ext); - - return boundary_enc & - char2oct("Content-Type: application/json\r\n\r\n") & - json_encoded & - boundary_enc & - char2oct("Content-Id: 5gnas-sm\r\n") & - char2oct("Content-Type: application/vnd.3gpp.5gnas\r\n\r\n") & - nas_ecnoded & - boundary_enc; + var template (value) HTTP2_multipart_part_list parts; + parts := { + ts_HTTP2_multipart_part({ ts_HTTP2_Hdr_content_type("application/json") }, + json_encoded), + ts_HTTP2_multipart_part({ ts_HTTP2_Hdr_content_id("5gnas-sm"), + ts_HTTP2_Hdr_content_type("application/vnd.3gpp.5gnas") }, + nas_ecnoded) + }; + return f_HTTP2_multipart_msg_encode(parts, boundary); }
/* Nsmf_PDUSession_CreateSMContext Request/response