Skip to content

Commit fa9985f

Browse files
committed
Pass request instead of href+url in FailureHandler
1 parent 4e7bce4 commit fa9985f

File tree

7 files changed

+81
-27
lines changed

7 files changed

+81
-27
lines changed

Sources/Adapters/GCDWebServer/GCDHTTPServer.swift

+22-14
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public class GCDHTTPServer: HTTPServer, Loggable {
8989
}
9090

9191
private func handle(request: ReadiumGCDWebServerRequest, completion: @escaping ReadiumGCDWebServerCompletionBlock) {
92-
responseResource(for: request) { resource, failureHandler in
92+
responseResource(for: request) { httpServerRequest, resource, failureHandler in
9393
let response: ReadiumGCDWebServerResponse
9494
switch resource.length {
9595
case let .success(length):
@@ -100,10 +100,11 @@ public class GCDHTTPServer: HTTPServer, Loggable {
100100
)
101101
case let .failure(error):
102102
self.log(.error, error)
103-
failureHandler?(resource.link.href, request.url, error)
103+
failureHandler?(httpServerRequest, error)
104104
response = ReadiumGCDWebServerErrorResponse(
105105
statusCode: error.httpStatusCode,
106-
error: error)
106+
error: error
107+
)
107108
}
108109

109110
completion(response) // goes back to ReadiumGCDWebServerConnection.m
@@ -112,13 +113,13 @@ public class GCDHTTPServer: HTTPServer, Loggable {
112113

113114
private func responseResource(
114115
for request: ReadiumGCDWebServerRequest,
115-
completion: @escaping (Resource, FailureHandler?) -> Void
116+
completion: @escaping (HTTPServerRequest, Resource, FailureHandler?) -> Void
116117
) {
117-
let completion = { resource, failureHandler in
118+
let completion = { request, resource, failureHandler in
118119
// Escape the queue to avoid deadlocks if something is using the
119120
// server in the handler.
120121
DispatchQueue.global().async {
121-
completion(resource, failureHandler)
122+
completion(request, resource, failureHandler)
122123
}
123124
}
124125

@@ -141,39 +142,46 @@ public class GCDHTTPServer: HTTPServer, Loggable {
141142

142143
for (endpoint, handler) in handlers {
143144
if endpoint == pathWithoutAnchor {
144-
let resource = handler.resourceHandler(HTTPServerRequest(url: request.url, href: nil))
145-
completion(transform(resource: resource, at: endpoint),
145+
let request = HTTPServerRequest(url: request.url, href: nil)
146+
let resource = handler.resourceHandler(request)
147+
completion(request,
148+
transform(resource: resource, at: endpoint),
146149
handler.failureHandler)
147150
return
148151

149152
} else if path.hasPrefix(endpoint.addingSuffix("/")) {
150-
let resource = handler.resourceHandler(HTTPServerRequest(
153+
let request = HTTPServerRequest(
151154
url: request.url,
152155
href: path.removingPrefix(endpoint.removingSuffix("/"))
153-
))
154-
completion(transform(resource: resource, at: endpoint),
156+
)
157+
let resource = handler.resourceHandler(request)
158+
completion(request,
159+
transform(resource: resource, at: endpoint),
155160
handler.failureHandler)
156161
return
157162
}
158163
}
159164

160165
log(.warning, "Resource not found for request \(request)")
161-
completion(FailureResource(link: Link(href: request.url.absoluteString), error: .notFound(nil)), nil)
166+
completion(
167+
HTTPServerRequest(url: request.url, href: nil),
168+
FailureResource(link: Link(href: request.url.absoluteString),
169+
error: .notFound(nil)),
170+
nil)
162171
}
163172
}
164173

165174
// MARK: HTTPServer
166175

167176
public func serve(at endpoint: HTTPServerEndpoint,
168-
handler: @escaping (HTTPServerRequest) -> Resource,
177+
handler: @escaping (HTTPServerRequest) -> Resource,
169178
failureHandler: FailureHandler?) throws -> URL {
170179
try queue.sync(flags: .barrier) {
171180
if case .stopped = state {
172181
try start()
173182
}
174183

175184
guard case let .started(port: _, baseURL: baseURL) = state else {
176-
failureHandler?(endpoint, server.serverURL, .other(GCDHTTPServerError.serverNotStarted))
177185
throw GCDHTTPServerError.serverNotStarted
178186
}
179187

Sources/Navigator/CBZ/CBZNavigatorViewController.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,15 @@ open class CBZNavigatorViewController: UIViewController, VisualNavigator, Loggab
5959
publicationBaseURL = try httpServer.serve(
6060
at: uuidEndpoint,
6161
publication: publication,
62-
failureHandler: { [weak self] href, url, error in
62+
failureHandler: { [weak self] request, error in
6363
DispatchQueue.main.async { [weak self] in
6464
guard let self = self else {
6565
return
6666
}
6767
self.delegate?.navigator(
6868
self,
69-
didFailToLoadResourceAt: href,
70-
url: url,
69+
didFailToLoadResourceAt: request.href,
70+
url: request.url,
7171
withError: error)
7272
}
7373
}

Sources/Navigator/EPUB/EPUBNavigatorViewController.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ extension EPUBNavigatorViewController: EPUBNavigatorViewModelDelegate {
947947

948948
func epubNavigatorViewModel(_ viewModel: EPUBNavigatorViewModel,
949949
didFailToLoadResourceAt href: String?,
950-
url: URL?,
950+
url: URL,
951951
withError error: ResourceError) {
952952
DispatchQueue.main.async {
953953
self.delegate?.navigator(self,

Sources/Navigator/EPUB/EPUBNavigatorViewModel.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ protocol EPUBNavigatorViewModelDelegate: AnyObject {
1313
func epubNavigatorViewModelInvalidatePaginationView(_ viewModel: EPUBNavigatorViewModel)
1414
func epubNavigatorViewModel(_ viewModel: EPUBNavigatorViewModel,
1515
didFailToLoadResourceAt href: String?,
16-
url: URL?,
16+
url: URL,
1717
withError error: ResourceError)
1818
}
1919

@@ -82,14 +82,14 @@ final class EPUBNavigatorViewModel: Loggable {
8282
publicationBaseURL = try httpServer.serve(
8383
at: uuidEndpoint, //serving the chapters endpoint
8484
publication: publication,
85-
failureHandler: { [weak self] href, url, error in
85+
failureHandler: { [weak self] request, error in
8686
guard let self = self else {
8787
return
8888
}
8989
self.delegate?.epubNavigatorViewModel(
9090
self,
91-
didFailToLoadResourceAt: href,
92-
url: url,
91+
didFailToLoadResourceAt: request.href,
92+
url: request.url,
9393
withError: error)
9494
}
9595
)

Sources/Navigator/Navigator.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public protocol NavigatorDelegate: AnyObject {
105105
func navigator(_ navigator: Navigator, shouldNavigateToNoteAt link: Link, content: String, referrer: String?) -> Bool
106106

107107
/// Called when an error occurs while attempting to load a resource.
108-
func navigator(_ navigator: Navigator, didFailToLoadResourceAt href: String?, url: URL?, withError error: ResourceError)
108+
func navigator(_ navigator: Navigator, didFailToLoadResourceAt href: String?, url: URL, withError error: ResourceError)
109109
}
110110

111111
public extension NavigatorDelegate {

Sources/Navigator/PDF/PDFNavigatorViewController.swift

+6-2
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,16 @@ open class PDFNavigatorViewController: UIViewController, VisualNavigator, Select
120120
publicationBaseURL = try httpServer.serve(
121121
at: uuidEndpoint,
122122
publication: publication,
123-
failureHandler: { href, url, error in
123+
failureHandler: { request, error in
124124
DispatchQueue.main.async { [weak self] in
125125
guard let self = self else {
126126
return
127127
}
128-
self.delegate?.navigator(self, didFailToLoadResourceAt: href, url: url, withError: error)
128+
self.delegate?.navigator(
129+
self,
130+
didFailToLoadResourceAt: request.href,
131+
url: request.url,
132+
withError: error)
129133
}
130134
}
131135
)

Sources/Shared/Toolkit/HTTP/HTTPServer.swift

+44-2
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,25 @@ import Foundation
1111
/// This is required by some Navigators to access a local publication's
1212
/// resources.
1313
public protocol HTTPServer {
14-
typealias FailureHandler = (_ href: String?, _ url: URL?, _ error: ResourceError) -> Void
14+
typealias FailureHandler = (_ request: HTTPServerRequest, _ error: ResourceError) -> Void
1515

1616
/// Serves resources at the given `endpoint`.
1717
///
1818
/// Subsequent calls with the same `endpoint` overwrite each other.
1919
///
2020
/// - Returns the base URL for this endpoint.
2121
@discardableResult
22+
func serve(at endpoint: HTTPServerEndpoint,
23+
handler: @escaping (HTTPServerRequest) -> Resource) throws -> URL
24+
25+
/// Serves resources at the given `endpoint`.
26+
///
27+
/// Subsequent calls with the same `endpoint` overwrite each other.
28+
///
29+
/// If the resource cannot be served, the `failureHandler` is called.
30+
///
31+
/// - Returns the base URL for this endpoint.
32+
@discardableResult
2233
func serve(at endpoint: HTTPServerEndpoint,
2334
handler: @escaping (HTTPServerRequest) -> Resource,
2435
failureHandler: FailureHandler?) throws -> URL
@@ -33,6 +44,12 @@ public protocol HTTPServer {
3344
}
3445

3546
public extension HTTPServer {
47+
@discardableResult
48+
func serve(at endpoint: HTTPServerEndpoint,
49+
handler: @escaping (HTTPServerRequest) -> Resource) throws -> URL {
50+
try serve(at: endpoint, handler: handler, failureHandler: nil)
51+
}
52+
3653
/// Serves the local file `url` at the given `endpoint`.
3754
///
3855
/// If the provided `url` is a directory, then all the files in the
@@ -41,6 +58,20 @@ public extension HTTPServer {
4158
///
4259
/// - Returns the URL to access the file(s) on the server.
4360
@discardableResult
61+
func serve(at endpoint: HTTPServerEndpoint, contentsOf url: URL) throws -> URL {
62+
try serve(at: endpoint, contentsOf: url, failureHandler: nil)
63+
}
64+
65+
/// Serves the local file `url` at the given `endpoint`.
66+
///
67+
/// If the provided `url` is a directory, then all the files in the
68+
/// directory are served. Subsequent calls with the same served `endpoint`
69+
/// overwrite each other.
70+
///
71+
/// If the file cannot be served, the `failureHandler` is called.
72+
///
73+
/// - Returns the URL to access the file(s) on the server.
74+
@discardableResult
4475
func serve(
4576
at endpoint: HTTPServerEndpoint,
4677
contentsOf url: URL,
@@ -68,14 +99,25 @@ public extension HTTPServer {
6899
/// - Returns the base URL to access the publication's resources on the
69100
/// server.
70101
@discardableResult
102+
func serve(at endpoint: HTTPServerEndpoint, publication: Publication) throws {
103+
try serve(at: endpoint, publication: publication)
104+
}
105+
106+
/// Serves a `publication`'s resources at the given `endpoint`.
107+
///
108+
/// If the resource cannot be served, the `failureHandler` is called.
109+
///
110+
/// - Returns the base URL to access the publication's resources on the
111+
/// server.
112+
@discardableResult
71113
func serve(
72114
at endpoint: HTTPServerEndpoint,
73115
publication: Publication,
74116
failureHandler: FailureHandler?
75117
) throws -> URL {
76118
func handler(request: HTTPServerRequest) -> Resource {
77119
guard let href = request.href else {
78-
failureHandler?(nil, request.url, .notFound(nil))
120+
failureHandler?(request, .notFound(nil))
79121

80122
return FailureResource(
81123
link: Link(href: request.url.absoluteString),

0 commit comments

Comments
 (0)