@@ -152,17 +152,37 @@ public class NetworkInstrumentation {
152
152
}
153
153
}
154
154
155
- let serverTimingPattern = #"traceparent;desc=['\"]00-([0-9a-f]{32})-([0-9a-f]{16})-01['\"]"#
156
-
157
155
func addLinkToSpan( span: Span , valStr: String ) {
158
- let regex = try ! NSRegularExpression ( pattern: serverTimingPattern)
156
+
157
+ let serverTimingPattern = #"traceparent;desc=['"]00-([0-9a-f]{32})-([0-9a-f]{16})-01['"]"#
158
+
159
+ guard let regex = try ? NSRegularExpression ( pattern: serverTimingPattern) else {
160
+ self . logger. log ( level: . fault) {
161
+ " Regex failed to compile "
162
+ }
163
+ // Intentional hard failure in both Debug and Release builds
164
+ preconditionFailure ( " Regex failed to compile. Likely programmer error in edit of serverTimingPattern regex: # \( serverTimingPattern) # " )
165
+ }
166
+
167
+ // Match the regex against the input string
159
168
let result = regex. matches ( in: valStr, range: NSRange ( location: 0 , length: valStr. utf16. count) )
160
- // per standard regex logic, number of matched segments is 3 (whole match plus two () captures)
161
- if result. count != 1 || result [ 0 ] . numberOfRanges != 3 {
169
+
170
+ // Ensure there's exactly one match and the correct number of capture groups
171
+ guard result. count == 1 , result [ 0 ] . numberOfRanges == 3 ,
172
+ let traceIdRange = Range ( result [ 0 ] . range ( at: 1 ) , in: valStr) ,
173
+ let spanIdRange = Range ( result [ 0 ] . range ( at: 2 ) , in: valStr) else {
174
+ // If the match or capture groups are invalid, log and return early
175
+ // Also, prevent over-long log output
176
+ let truncatedValStr = valStr. count > 255 ? String ( valStr. prefix ( 252 ) ) + " ... " : valStr
177
+ self . logger. log ( level: . debug) {
178
+ " Failed to match traceparent string: \( truncatedValStr) "
179
+ }
162
180
return
163
181
}
164
- let traceId = String ( valStr [ Range ( result [ 0 ] . range ( at: 1 ) , in: valStr) !] )
165
- let spanId = String ( valStr [ Range ( result [ 0 ] . range ( at: 2 ) , in: valStr) !] )
182
+
183
+ let traceId = String ( valStr [ traceIdRange] )
184
+ let spanId = String ( valStr [ spanIdRange] )
185
+
166
186
span. setAttribute ( key: " link.traceId " , value: traceId)
167
187
span. setAttribute ( key: " link.spanId " , value: spanId)
168
188
}
0 commit comments