@@ -162,8 +162,8 @@ package enum PeerAddress: Equatable {
162162 var portComponent = addressWithoutType [ addressColon... ]
163163 _ = portComponent. popFirst ( )
164164
165- if let host = String ( hostComponent) , let port = String ( portComponent) {
166- self = . ipv4( address: host, port: Int ( port) )
165+ if let host = String ( hostComponent) , let port = Int ( utf8View : portComponent) {
166+ self = . ipv4( address: host, port: port)
167167 } else {
168168 return nil
169169 }
@@ -179,8 +179,8 @@ package enum PeerAddress: Equatable {
179179
180180 if let firstBracket = hostComponent. popFirst ( ) , let lastBracket = hostComponent. popLast ( ) ,
181181 firstBracket == UInt8 ( ascii: " [ " ) , lastBracket == UInt8 ( ascii: " ] " ) ,
182- let host = String ( hostComponent) , let port = String ( portComponent) {
183- self = . ipv6( address: host, port: Int ( port) )
182+ let host = String ( hostComponent) , let port = Int ( utf8View : portComponent) {
183+ self = . ipv6( address: host, port: port)
184184 } else {
185185 // This is some unexpected/unknown format
186186 return nil
@@ -194,3 +194,19 @@ package enum PeerAddress: Equatable {
194194 }
195195 }
196196}
197+
198+ extension Int {
199+ package init ? ( utf8View: Substring . UTF8View . SubSequence ) {
200+ var value = 0
201+ for utf8Element in utf8View {
202+ value &*= 10
203+ let elementValue = Int ( utf8Element - 48 ) // ASCII code for 0 is 48
204+ guard elementValue >= 0 , elementValue <= 9 else {
205+ // non-digit character
206+ return nil
207+ }
208+ value &+= elementValue
209+ }
210+ self = value
211+ }
212+ }
0 commit comments