2016-07-19 10 views
1

Ich bin heute innerhalb von phantomjs auf einen sehr merkwürdigen Fehler gestoßen, an den ich mich für die Community gewandt habe. Die erwartete JSON-Antwort einer API, die ich mit phantomJS aufgerufen hatte, wurde nicht zurückgegeben, sondern das Ergebnis war ein Fehlerstatus.PhantomJS gibt den Status failed zurück, wenn die geladene Seite einen ungültigen Antworttyp vom Inhaltstyp hat

onResourceReceived() zeigte einen 200 HTTP-Statuscode für die betreffende Ressource onLoadFinished() zeigt einen Status von

scheitern

Nach dem Debuggen dies für einige Zeit, bemerkte ich, dass die Website wurde ein Nicht-Standard-Content-Type-Rückkehr Header auf die Antwort. Statt des Inhaltstyps von "application/json" war der zurückgegebene Header "application/servicename-1.0 + json".

Um dies zu überprüfen, haben wir einen lokalen Webserver hochgefahren, der einen ähnlichen Header lieferte, und natürlich kann phantom js die Seite nicht laden. Wenn Sie den Antwortheader auf "application/json" und phantomjs setzen, wird die Seite korrekt gerendert und die page.plainText-Variable der Seitenobjekte festgelegt. Ich habe das Testskript unten eingefügt.

Hat jemand schon einmal so etwas erlebt?

Haben Sie Vorschläge, wie Sie dieses Problem innerhalb von phantomjs lösen können?

Antwort

1

Die einfachste und schnellste Lösung, die ich mir vorstellen kann (ohne den Quellcode von PhantomJS zu bearbeiten und zu kompilieren), ist die Einrichtung eines einfachen lokalen Proxy-Servers vor PhantomJS, der den falschen Header schreiben würde.

Es könnte so etwas wie Fiddler2, Charles Proxy oder ein einfaches node.js Skript, wie diese schnell-n-dirty Beispiel sein:

// npm install proxy-tamper 
var proxy = require('proxy-tamper').start({port: 3000}); 

proxy.tamper(/api.truelocal.com.au.*$/, function (request) { 

    request.onResponse(function (response) { 

    if ('content-type' in response.headers && response.headers['content-type'] == 'application/servicename-1.0+json') { 
     response.headers['content-type'] = 'application/json'; 
    } 

    response.complete(); 
    }); 
}); 

Dann haben PhantomJS verwenden es:

phantomjs --proxy=127.0.0.1:3000 script.js 

Beachten Sie, dass dies für sichere Seiten nicht funktioniert.

+0

Interessante Idee, nicht mit der phantomJS-Quelle super vertraut Ich bin offen für Änderungen. Irgendwelche Ideen auf dieser Front? – Jesse

1

Nun, nachdem ich diese Frage gestellt hatte, tauchte ich tiefer in die Phantomquelle. Sieht so aus, als gäbe es hier eine ziemlich strikte Erkennung auf Anwendung/JSON: https://github.com/Vitallium/qtwebkit/blob/phantomjs/Source/WebCore/dom/DOMImplementation.cpp#L368

+0

Also können Sie einfach 'application/servicename-1.0 + json' als Option hinzufügen, bauen Sie es und es würde funktionieren? Nett! – Vaviloff

+0

Ich denke schon? muss graben und es tatsächlich bauen, aber ich habe Hoffnungen .... – Jesse

Verwandte Themen