2

I am rendering local web content on a WKWebView using a local server of GCDWebServer, but I have a cross-origin request due to cookies sitting in the backend. how could I configure a proxy that will solve this problem.

NOTE: I have try'd to implement something on GitHub called CorsProxy but it's outdated and frankly doesn't solve my problem, creating a proxy.

I have come across answers addressing a similar problem, however I am running my webView on a GCDWebServer and I don't know how to create such a proxy on this particular local server?

Any help?

Here's my code:

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler {

    var wkWebView: WKWebView!
    var webServer = GCDWebServer()    
    var contentController = WKUserContentController()    

    func initWebServer() {
        let folderPath = Bundle.main.path(forResource: "www", ofType: nil)            
        webServer.addGETHandler(forBasePath: "/", directoryPath: folderPath!, indexFilename: "index.html", cacheAge: 0, allowRangeRequests: true)            
        webServer.start(withPort: 8080, bonjourName: "GCD Web Server")            
    }

    public override func viewDidLoad() {
        super.viewDidLoad()
        
        initWebServer()
        
        let userScript = WKUserScript(source: "helloMsg2(\"boooo hoo hoo hoooo\")", injectionTime: .atDocumentEnd, forMainFrameOnly: true)
        
        contentController.addUserScript(userScript)
        contentController.add(self, name: "callback")
        
        let config = WKWebViewConfiguration()
        config.userContentController = contentController
        
        
        wkWebView = WKWebView(frame: view.bounds, configuration: config)
        wkWebView.scrollView.bounces = false
        wkWebView.uiDelegate = self
        wkWebView.navigationDelegate = self
        view.addSubview(wkWebView!)
    
        wkWebView.load(URLRequest(url: webServer.serverURL!))
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        if message.name == "callback" {
            print("message from javaScript is: \(message.body)")
        } else {
            print("message from javaScript is: \(message.body)")
        }
    }
}
Lorenzo B
  • 33,216
  • 24
  • 116
  • 190
Hudi Ilfeld
  • 1,905
  • 2
  • 16
  • 25

3 Answers3

1

You will need to roll your own implementation of -addGETHandlerForBasePath...to add the Access-Control-Allow-Origin: * header since this API doesn't allow customization of the headers.

See the source code in https://github.com/swisspol/GCDWebServer/blob/master/GCDWebServer/Core/GCDWebServer.m#L1015.

Pol
  • 3,848
  • 1
  • 38
  • 55
0

This may help support CORS. Just add Access-Control-Allow-Origin: * into the response headers.

Juky
  • 247
  • 1
  • 9
0

Just do:

GCDWebServerResponse * yourResponse = [GCDWebServerResponse new];
[yourResponse setValue:@"*" forAdditionalHeader:@"Access-Control-Allow-Origin"];
Mojtaba Hosseini
  • 95,414
  • 31
  • 268
  • 278
leavetao
  • 9
  • 1