diff --git a/Turbolinks/Session.swift b/Turbolinks/Session.swift index ce95a36..98cfd33 100644 --- a/Turbolinks/Session.swift +++ b/Turbolinks/Session.swift @@ -10,6 +10,10 @@ public protocol SessionDelegate: class { func sessionDidFinishRequest(_ session: Session) } +public protocol SessionDataSource: class { + func session(_ session: Session, additionalHeadersForRequestWithURL url: URL) -> [String: String]? +} + public extension SessionDelegate { func sessionDidLoadWebView(_ session: Session) { session.webView.navigationDelegate = session @@ -26,8 +30,15 @@ public extension SessionDelegate { } } +public extension SessionDataSource { + func session(_ session: Session, additionalHeadersForRequestWithURL url: URL) -> [String: String]? { + return nil + } +} + open class Session: NSObject { open weak var delegate: SessionDelegate? + open weak var dataSource: SessionDataSource? open var webView: WKWebView { return _webView @@ -78,6 +89,7 @@ open class Session: NSObject { currentVisit = visit visit.delegate = self + visit.dataSource = self visit.start() } @@ -195,6 +207,12 @@ extension Session: VisitDelegate { } } +extension Session: VisitDataSource { + func visit(_ visit: Visit, additionalHeadersForRequestWithURL url: URL) -> [String : String]? { + return dataSource?.session(self, additionalHeadersForRequestWithURL: url) + } +} + extension Session: VisitableDelegate { public func visitableViewWillAppear(_ visitable: Visitable) { guard let topmostVisit = self.topmostVisit, let currentVisit = self.currentVisit else { return } diff --git a/Turbolinks/Visit.swift b/Turbolinks/Visit.swift index 24f39fb..8c07dfc 100644 --- a/Turbolinks/Visit.swift +++ b/Turbolinks/Visit.swift @@ -17,6 +17,10 @@ protocol VisitDelegate: class { func visitRequestDidFinish(_ visit: Visit) } +protocol VisitDataSource: class { + func visit(_ visit: Visit, additionalHeadersForRequestWithURL url: URL) -> [String: String]? +} + enum VisitState { case initialized case started @@ -27,6 +31,7 @@ enum VisitState { class Visit: NSObject { weak var delegate: VisitDelegate? + weak var dataSource: VisitDataSource? var visitable: Visitable var action: Action @@ -141,7 +146,12 @@ class ColdBootVisit: Visit, WKNavigationDelegate, WebViewPageLoadDelegate { webView.navigationDelegate = self webView.pageLoadDelegate = self - let request = URLRequest(url: location) + var request = URLRequest(url: location) + if let headers = dataSource?.visit(self, additionalHeadersForRequestWithURL: location) { + for header in headers { + request.setValue(header.value, forHTTPHeaderField: header.key) + } + } navigation = webView.load(request) delegate?.visitDidStart(self)