pespin submitted this change.
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(-)
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
To view, visit change 43662. To unsubscribe, or for help writing mail filters, visit settings.