@@ -67,7 +67,7 @@ struct JSONPackageCollectionProvider: PackageCollectionProvider {
67
67
}
68
68
69
69
if let errors = source. validate ( ) ? . errors ( ) {
70
- return callback ( . failure( MultipleErrors ( errors) ) )
70
+ return callback ( . failure( JSONPackageCollectionProviderError . invalidSource ( " \( errors) " ) ) )
71
71
}
72
72
73
73
// Source is a local file
@@ -89,18 +89,18 @@ struct JSONPackageCollectionProvider: PackageCollectionProvider {
89
89
switch result {
90
90
case . failure( HTTPClientError . badResponseStatusCode( let statusCode) ) :
91
91
if statusCode == 404 {
92
- return callback ( . failure( Errors . collectionNotFound ( source. url) ) )
92
+ return callback ( . failure( JSONPackageCollectionProviderError . collectionNotFound ( source. url) ) )
93
93
} else {
94
- return callback ( . failure( Errors . collectionUnavailable ( source. url, statusCode) ) )
94
+ return callback ( . failure( JSONPackageCollectionProviderError . collectionUnavailable ( source. url, statusCode) ) )
95
95
}
96
96
case . failure( let error) :
97
97
return callback ( . failure( error) )
98
98
case . success( let response) :
99
99
guard let contentLength = response. headers. get ( " Content-Length " ) . first. flatMap ( Int64 . init) else {
100
- return callback ( . failure( Errors . invalidResponse ( source. url, " Missing Content-Length header " ) ) )
100
+ return callback ( . failure( JSONPackageCollectionProviderError . invalidResponse ( source. url, " Missing Content-Length header " ) ) )
101
101
}
102
102
guard contentLength <= self . configuration. maximumSizeInBytes else {
103
- return callback ( . failure( Errors . responseTooLarge ( source. url, contentLength) ) )
103
+ return callback ( . failure( JSONPackageCollectionProviderError . responseTooLarge ( source. url, contentLength) ) )
104
104
}
105
105
// next do a get request to get the actual content
106
106
var getOptions = self . makeRequestOptions ( validResponseCodes: [ 200 ] )
@@ -109,9 +109,9 @@ struct JSONPackageCollectionProvider: PackageCollectionProvider {
109
109
switch result {
110
110
case . failure( HTTPClientError . badResponseStatusCode( let statusCode) ) :
111
111
if statusCode == 404 {
112
- return callback ( . failure( Errors . collectionNotFound ( source. url) ) )
112
+ return callback ( . failure( JSONPackageCollectionProviderError . collectionNotFound ( source. url) ) )
113
113
} else {
114
- return callback ( . failure( Errors . collectionUnavailable ( source. url, statusCode) ) )
114
+ return callback ( . failure( JSONPackageCollectionProviderError . collectionUnavailable ( source. url, statusCode) ) )
115
115
}
116
116
case . failure( let error) :
117
117
return callback ( . failure( error) )
@@ -120,13 +120,13 @@ struct JSONPackageCollectionProvider: PackageCollectionProvider {
120
120
// if not returning head and exceeding size
121
121
// TODO: store bad actors to prevent server DoS
122
122
guard let contentLength = response. headers. get ( " Content-Length " ) . first. flatMap ( Int64 . init) else {
123
- return callback ( . failure( Errors . invalidResponse ( source. url, " Missing Content-Length header " ) ) )
123
+ return callback ( . failure( JSONPackageCollectionProviderError . invalidResponse ( source. url, " Missing Content-Length header " ) ) )
124
124
}
125
125
guard contentLength < self . configuration. maximumSizeInBytes else {
126
- return callback ( . failure( Errors . responseTooLarge ( source. url, contentLength) ) )
126
+ return callback ( . failure( JSONPackageCollectionProviderError . responseTooLarge ( source. url, contentLength) ) )
127
127
}
128
128
guard let body = response. body else {
129
- return callback ( . failure( Errors . invalidResponse ( source. url, " Body is empty " ) ) )
129
+ return callback ( . failure( JSONPackageCollectionProviderError . invalidResponse ( source. url, " Body is empty " ) ) )
130
130
}
131
131
132
132
let certPolicyKey = self . sourceCertPolicy. certificatePolicyKey ( for: source) ?? . default
@@ -175,15 +175,15 @@ struct JSONPackageCollectionProvider: PackageCollectionProvider {
175
175
}
176
176
// Collection is unsigned
177
177
guard let collection = try ? self . decoder. decode ( JSONModel . Collection. self, from: data) else {
178
- return callback ( . failure( Errors . invalidJSON ( source. url) ) )
178
+ return callback ( . failure( JSONPackageCollectionProviderError . invalidJSON ( source. url) ) )
179
179
}
180
180
callback ( self . makeCollection ( from: collection, source: source, signature: nil ) )
181
181
}
182
182
}
183
183
184
184
private func makeCollection( from collection: JSONModel . Collection , source: Model . CollectionSource , signature: Model . SignatureData ? ) -> Result < Model . Collection , Error > {
185
185
if let errors = self . validator. validate ( collection: collection) ? . errors ( ) {
186
- return . failure( MultipleErrors ( errors) )
186
+ return . failure( JSONPackageCollectionProviderError . invalidCollection ( " \( errors) " ) )
187
187
}
188
188
189
189
var serializationOkay = true
@@ -345,27 +345,31 @@ struct JSONPackageCollectionProvider: PackageCollectionProvider {
345
345
)
346
346
}
347
347
}
348
+ }
348
349
349
- public enum Errors : Error , Equatable , CustomStringConvertible {
350
- case invalidJSON( URL )
351
- case invalidResponse( URL , String )
352
- case responseTooLarge( URL , Int64 )
353
- case collectionNotFound( URL )
354
- case collectionUnavailable( URL , Int )
355
-
356
- public var description : String {
357
- switch self {
358
- case . invalidJSON( let url) :
359
- return " The package collection at \( url. absoluteString) contains invalid JSON. "
360
- case . invalidResponse( let url, let message) :
361
- return " Received invalid response for package collection at \( url. absoluteString) : \( message) "
362
- case . responseTooLarge( let url, _) :
363
- return " The package collection at \( url. absoluteString) is too large. "
364
- case . collectionNotFound( let url) :
365
- return " No package collection found at \( url. absoluteString) . Please make sure the URL is correct. "
366
- case . collectionUnavailable( let url, _) :
367
- return " The package collection at \( url. absoluteString) is unavailable. Please make sure the URL is correct or try again later. "
368
- }
350
+ public enum JSONPackageCollectionProviderError : Error , Equatable , CustomStringConvertible {
351
+ case invalidSource( String )
352
+ case invalidJSON( URL )
353
+ case invalidCollection( String )
354
+ case invalidResponse( URL , String )
355
+ case responseTooLarge( URL , Int64 )
356
+ case collectionNotFound( URL )
357
+ case collectionUnavailable( URL , Int )
358
+
359
+ public var description : String {
360
+ switch self {
361
+ case . invalidSource( let errorMessage) , . invalidCollection( let errorMessage) :
362
+ return errorMessage
363
+ case . invalidJSON( let url) :
364
+ return " The package collection at \( url. absoluteString) contains invalid JSON. "
365
+ case . invalidResponse( let url, let message) :
366
+ return " Received invalid response for package collection at \( url. absoluteString) : \( message) "
367
+ case . responseTooLarge( let url, _) :
368
+ return " The package collection at \( url. absoluteString) is too large. "
369
+ case . collectionNotFound( let url) :
370
+ return " No package collection found at \( url. absoluteString) . Please make sure the URL is correct. "
371
+ case . collectionUnavailable( let url, _) :
372
+ return " The package collection at \( url. absoluteString) is unavailable. Please make sure the URL is correct or try again later. "
369
373
}
370
374
}
371
375
}
0 commit comments