@@ -17,14 +17,23 @@ void SipHeader::parseHeader() {
17
17
}
18
18
19
19
std::size_t pos = 0 ;
20
- std::string pattern = " (.*)=(.*?)>*" ;
21
20
absl::string_view& header = raw_text_;
21
+ bool isHost = true ;
22
22
23
23
// Has "SIP/2.0" in top line
24
24
// Eg: INVITE sip:[email protected] SIP/2.0
25
25
if (std::size_t found = header.find (" SIP" ); found != absl::string_view::npos) {
26
26
header = header.substr (0 , found);
27
27
}
28
+ // Has message Type in header
29
+ // Eg: Route: <sip:[email protected] ;role=anch;lr;transport=udp; \
30
+ // x-suri=sip:scscf-internal.cncs.svc.cluster.local:5060;ep=10.0.0.1>
31
+ if (std::size_t found = header.find (" : " ); found != absl::string_view::npos) {
32
+ header = header.substr (found + 2 );
33
+ }
34
+ if (std::size_t found = header.find (" <" ); found != absl::string_view::npos) {
35
+ header = header.substr (found + 1 );
36
+ }
28
37
29
38
while (std::size_t found = header.find_first_of (" ;>" , pos)) {
30
39
absl::string_view str;
@@ -34,30 +43,55 @@ void SipHeader::parseHeader() {
34
43
str = header.substr (pos, found - pos);
35
44
}
36
45
37
- std::string param = " " ;
38
- std::string value = " " ;
39
- re2::RE2::FullMatch (std::string (str), pattern, ¶m, &value);
46
+ std::size_t value_pos = str.find (" =" );
47
+ if (value_pos == absl::string_view::npos) {
48
+ // First as host
49
+ if (isHost) {
50
+ if (str.find (" sip:" ) != absl::string_view::npos) {
51
+ str = str.substr (std::strlen (" sip:" ));
52
+ }
40
53
41
- if (!param.empty () && !value.empty ()) {
42
- if (value.find (" sip:" ) != absl::string_view::npos) {
43
- value = value.substr (std::strlen (" sip:" ));
44
- }
54
+ if (!str.empty ()) {
55
+ std::size_t at = str.find (' @' );
56
+ if (at != absl::string_view::npos) {
57
+ str = str.substr (at + 1 );
58
+ }
59
+ }
45
60
46
- if (!value.empty ()) {
47
- std::size_t comma = value.find (' :' );
48
- if (comma != absl::string_view::npos) {
49
- value = value.substr (0 , comma);
61
+ if (!str.empty ()) {
62
+ std::size_t comma = str.find (' :' );
63
+ if (comma != absl::string_view::npos) {
64
+ str = str.substr (0 , comma);
65
+ }
50
66
}
67
+ params_.emplace_back (std::make_pair (" host" , str));
68
+ isHost = false ;
51
69
}
70
+ } else {
71
+ auto param = str.substr (0 , value_pos);
72
+ value_pos += 1 ;
73
+ auto value = str.substr (value_pos);
74
+ if (!param.empty () && !value.empty ()) {
75
+ if (value.find (" sip:" ) != absl::string_view::npos) {
76
+ value = value.substr (std::strlen (" sip:" ));
77
+ }
78
+
79
+ if (!value.empty ()) {
80
+ std::size_t comma = value.find (' :' );
81
+ if (comma != absl::string_view::npos) {
82
+ value = value.substr (0 , comma);
83
+ }
84
+ }
52
85
53
- if (!value.empty ()) {
54
- if (param == " opaque" ) {
55
- auto value_view = header.substr (header.find (value), value.length ());
56
- params_.emplace_back (std::make_pair (" ep" , value_view));
57
- } else {
58
- auto param_view = header.substr (header.find (param), param.length ());
59
- auto value_view = header.substr (header.find (value), value.length ());
60
- params_.emplace_back (std::make_pair (param_view, value_view));
86
+ if (!value.empty ()) {
87
+ if (param == " opaque" ) {
88
+ auto value_view = header.substr (header.find (value), value.length ());
89
+ params_.emplace_back (std::make_pair (" ep" , value_view));
90
+ } else {
91
+ auto param_view = header.substr (header.find (param), param.length ());
92
+ auto value_view = header.substr (header.find (value), value.length ());
93
+ params_.emplace_back (std::make_pair (param_view, value_view));
94
+ }
61
95
}
62
96
}
63
97
}
@@ -85,7 +119,7 @@ void MessageMetadata::setTransactionId(absl::string_view data) {
85
119
}
86
120
87
121
void MessageMetadata::addEPOperation (
88
- size_t raw_offset, absl::string_view& header,
122
+ size_t raw_offset, absl::string_view& header, HeaderType type,
89
123
const std::vector<envoy::extensions::filters::network::sip_proxy::v3alpha::LocalService>&
90
124
local_services) {
91
125
if (header.find (" ;ep=" ) != absl::string_view::npos) {
@@ -100,7 +134,7 @@ void MessageMetadata::addEPOperation(
100
134
}
101
135
102
136
// is domain matched
103
- if (!isDomainMatched (header , local_services)) {
137
+ if (!isDomainMatched (type , local_services)) {
104
138
ENVOY_LOG (trace, " header {} domain is not equal to local_services domain, don't add EP." ,
105
139
header);
106
140
return ;
@@ -154,47 +188,16 @@ void MessageMetadata::addMsgHeader(HeaderType type, absl::string_view value) {
154
188
}
155
189
}
156
190
157
- std::string MessageMetadata::getDomainFromHeaderParameter (absl::string_view& header,
158
- const std::string& parameter) {
159
- // Parameter default is host
160
- if (!parameter.empty () && parameter != " host" ) {
161
- auto start = header.find (parameter);
162
- if (start != absl::string_view::npos) {
163
- // service.parameter() + "="
164
- start = start + parameter.length () + strlen (" =" );
165
- if (" sip:" == header.substr (start, strlen (" sip:" ))) {
166
- start += strlen (" sip:" );
167
- }
168
- // end
169
- auto end = header.find_first_of (" :;>" , start);
170
- if (end != absl::string_view::npos) {
171
- return std::string (header.substr (start, end - start));
172
- }
173
- }
174
- }
175
- // Parameter is host
176
- // Or no domain in configured parameter, then try host
177
- auto start = header.find (" sip:" );
178
- if (start == absl::string_view::npos) {
179
- return " " ;
191
+ absl::string_view MessageMetadata::getDomainFromHeaderParameter (HeaderType type,
192
+ const std::string& parameter) {
193
+ parseHeader (type);
194
+ if ((parameter.empty () || !header (type).hasParam (parameter)) && header (type).hasParam (" host" )) {
195
+ return header (type).param (" host" );
180
196
}
181
- start += strlen (" sip:" );
182
- auto end = header.find_first_of (" :;>" , start);
183
- // TopLine should be absl::string_view::npos
184
- if (end == absl::string_view::npos) {
185
- end = header.length ();
186
- }
187
-
188
- auto addr = header.substr (start, end - start);
189
-
190
- // Remove name in format of sip:name@addr:pos
191
- auto pos = addr.find (" @" );
192
- if (pos == absl::string_view::npos) {
193
- return std::string (header.substr (start, end - start));
194
- } else {
195
- pos += strlen (" @" );
196
- return std::string (addr.substr (pos, addr.length () - pos));
197
+ if (header (type).hasParam (parameter)) {
198
+ return header (type).param (parameter);
197
199
}
200
+ return " " ;
198
201
}
199
202
200
203
} // namespace SipProxy
0 commit comments