pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36814?usp=email )
Change subject: SIP_Templates: Always set Content-Length
......................................................................
SIP_Templates: Always set Content-Length
According to RFC3261 7.4.2, 7.5, 20.14 Content-Length SHOULD be set over
any transport, and MUST be set over TCP.
Hence, make sure we set it in all cases.
This allows Asterisk being able to decode SIP messages sent to it over a
TCP connection, since it uses the Content-Length field to look up for
message boundaries over the TCP stream.
Change-Id: I26e444fe466b4742d74ef5a6e371ce8488a5afcf
---
M library/SIP_Templates.ttcn
1 file changed, 68 insertions(+), 17 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/14/36814/1
diff --git a/library/SIP_Templates.ttcn b/library/SIP_Templates.ttcn
index 1c684c1..ab566d0 100644
--- a/library/SIP_Templates.ttcn
+++ b/library/SIP_Templates.ttcn
@@ -215,6 +215,16 @@
}
+// [20.14]
+template (value) ContentLength ts_ContentLength(template (value) integer len := 0) := {
+ fieldName := CONTENT_LENGTH_E,
+ len := len
+}
+template (present) ContentLength tr_ContentLength(template (present) integer len := ?) :=
{
+ fieldName := CONTENT_LENGTH_E,
+ len := len
+}
+
// [20.19]
template (value) Expires ts_Expires(template (value) DeltaSec deltaSec :=
"7200") := {
fieldName := EXPIRES_E,
@@ -433,6 +443,16 @@
return ct;
}
+private function f_ContentLength(template (omit) charstring body)
+return template (value) ContentLength {
+ /* rfc3261 20.14: "If no body is present in a message, then the
+ * Content-Length header field value MUST be set to zero." */
+ if (istemplatekind(body, "omit")) {
+ return ts_ContentLength(0);
+ }
+ return ts_ContentLength(lengthof(body));
+}
+
template (value) ContentType ts_CT_SDP := {
fieldName := CONTENT_TYPE_E,
mediaType := "application/sdp"
@@ -553,6 +573,7 @@
template (value) charstring method,
template (value) integer seq_nr,
template (value) Via via,
+ template (omit) ContentLength content_length := ts_ContentLength(0),
template (omit) ContentType content_type := omit,
template (omit)Authorization authorization := omit,
template (omit) Allow allow := ts_Allow(c_SIP_defaultMethods),
@@ -572,6 +593,7 @@
callid := call_id
},
contact := contact,
+ contentLength := content_length,
contentType := content_type,
cSeq := {
fieldName := CSEQ_E,
@@ -606,8 +628,9 @@
template Contact contact,
template (present) Via via := tr_Via_from(?),
template charstring method,
- template ContentType content_type := *,
template integer seq_nr := ?,
+ template ContentLength content_length := *,
+ template ContentType content_type := *,
template Allow allow := *,
template Expires expires := *,
template Require require := *,
@@ -624,6 +647,7 @@
callid := call_id
},
contact := contact,
+ contentLength := content_length,
contentType := content_type,
cSeq := {
fieldName := CSEQ_E,
@@ -669,7 +693,8 @@
requestLine := ts_SIP_ReqLine(REGISTER_E, sip_url_host_port),
msgHeader := ts_SIP_msgh_std(call_id, from_addr, to_addr, contact,
"REGISTER", seq_nr, via,
- f_ContentTypeOrOmit(ts_CT_SDP, body),
+ content_length := f_ContentLength(body),
+ content_type := f_ContentTypeOrOmit(ts_CT_SDP, body),
authorization := authorization,
expires := expires,
require := require,
@@ -693,7 +718,7 @@
template charstring body := *) := {
requestLine := tr_SIP_ReqLine(REGISTER_E, sip_url_host_port),
msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, contact,
- via, "REGISTER", *, seq_nr,
+ via, "REGISTER", seq_nr,
expires := expires,
require := require,
security_client := security_client,
@@ -714,7 +739,8 @@
msgHeader := ts_SIP_msgh_std(call_id, from_addr, to_addr, contact,
"INVITE", seq_nr,
via,
- f_ContentTypeOrOmit(ts_CT_SDP, body)),
+ content_length := f_ContentLength(body),
+ content_type := f_ContentTypeOrOmit(ts_CT_SDP, body)),
messageBody := body,
payload := omit
}
@@ -728,7 +754,7 @@
template charstring body) := {
requestLine := tr_SIP_ReqLine(INVITE_E, uri),
msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, ?,
- via, "INVITE", *, seq_nr),
+ via, "INVITE", seq_nr),
messageBody := body,
payload := omit
}
@@ -742,7 +768,9 @@
template (omit) charstring body) := {
requestLine := ts_SIP_ReqLine(BYE_E, to_addr.addr.nameAddr.addrSpec),
msgHeader := ts_SIP_msgh_std(call_id, from_addr, to_addr, omit, "BYE",
seq_nr,
- via, f_ContentTypeOrOmit(ts_CT_SDP, body)),
+ via,
+ content_length := f_ContentLength(body),
+ content_type := f_ContentTypeOrOmit(ts_CT_SDP, body)),
messageBody := body,
payload := omit
}
@@ -757,7 +785,7 @@
template charstring body := *) := {
requestLine := tr_SIP_ReqLine(BYE_E, uri),
msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, omit,
- via, "BYE", *, seq_nr),
+ via, "BYE", seq_nr),
messageBody := body,
payload := omit
}
@@ -775,7 +803,8 @@
ts_Contact_SipAddr(from_addr),
"ACK", seq_nr,
via,
- f_ContentTypeOrOmit(ts_CT_SDP, body)),
+ content_length := f_ContentLength(body),
+ content_type := f_ContentTypeOrOmit(ts_CT_SDP, body)),
messageBody := body,
payload := omit
}
@@ -790,7 +819,7 @@
requestLine := tr_SIP_ReqLine(ACK_E, uri),
msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, *,
via,
- "ACK", *, seq_nr),
+ "ACK", seq_nr),
messageBody := body,
payload := omit
}
@@ -806,7 +835,7 @@
requestLine := tr_SIP_ReqLine(CANCEL_E, uri),
msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, *,
via,
- "CANCEL", *, seq_nr),
+ "CANCEL", seq_nr),
messageBody := body,
payload := omit
}
@@ -823,7 +852,9 @@
template (omit) charstring body := omit) := {
statusLine := ts_SIP_StatusLine(status_code, reason),
msgHeader := ts_SIP_msgh_std(call_id, from_addr, to_addr, omit, method, seq_nr,
- via, f_ContentTypeOrOmit(ts_CT_SDP, body)),
+ via,
+ content_length := f_ContentLength(body),
+ content_type := f_ContentTypeOrOmit(ts_CT_SDP, body)),
messageBody := body,
payload := omit
}
@@ -839,7 +870,9 @@
template (omit) charstring body := omit) := {
statusLine := ts_SIP_StatusLine(100, "Trying"),
msgHeader := ts_SIP_msgh_std(call_id, from_addr, to_addr, omit, method, seq_nr,
- via, f_ContentTypeOrOmit(ts_CT_SDP, body)),
+ via,
+ content_length := f_ContentLength(body),
+ content_type := f_ContentTypeOrOmit(ts_CT_SDP, body)),
messageBody := body,
payload := omit
}
@@ -855,7 +888,9 @@
template (omit) charstring body := omit) := {
statusLine := ts_SIP_StatusLine(180, "Ringing"),
msgHeader := ts_SIP_msgh_std(call_id, from_addr, to_addr, omit, method, seq_nr,
- via, f_ContentTypeOrOmit(ts_CT_SDP, body)),
+ via,
+ content_length := f_ContentLength(body),
+ content_type := f_ContentTypeOrOmit(ts_CT_SDP, body)),
messageBody := body,
payload := omit
}
@@ -874,7 +909,7 @@
statusLine := tr_SIP_StatusLine(status_code, reason),
msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, contact,
via,
- method, *, seq_nr),
+ method, seq_nr),
messageBody := body,
payload := omit
}
@@ -896,7 +931,7 @@
statusLine := tr_SIP_StatusLine(status_code, reason),
msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, contact,
via,
- method, *, seq_nr,
+ method, seq_nr,
wwwAuthenticate := wwwAuthenticate),
messageBody := body,
payload := omit
@@ -917,7 +952,7 @@
statusLine := tr_SIP_StatusLine(status_code, reason),
msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, omit,
via,
- method, *, seq_nr),
+ method, seq_nr),
messageBody := body,
payload := omit
}
@@ -937,7 +972,7 @@
statusLine := tr_SIP_StatusLine(status_code, reason),
msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, *,
via,
- method, *, seq_nr),
+ method, seq_nr),
messageBody := body,
payload := omit
}
--
To view, visit
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36814?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: I26e444fe466b4742d74ef5a6e371ce8488a5afcf
Gerrit-Change-Number: 36814
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: newchange