2016-01-25 3 views
18

Ich habe jetzt ein seltsames Problem mit dem Senden der http-Anfrage von der Chrome-Erweiterung, die ich gerade entwickle (normales JavaScript). Dies ist eine POST Anfrage mit XmlHttpRequest (von background.js) mit URL wie:POST Absolute URI wird von XmlHttpRequest an den Server gesendet, wenn der Squid3-Proxy verwendet wird

http://host.com/postform/upload 

ich diese Anfrage auch von normaler Webseite (nicht Chrome-Erweiterung) und wichtiges Bit ist senden, dass, wenn ich öffne Entwickler Werkzeuge und überprüfen Registerkarte Netzwerk für meine Anfrage (rohe Header Auswahl anzuzeigen) i ersten Kopf siehe da:

POST /postform/upload HTTP/1.1 

und es funktioniert gut vor Ich aktiviere Proxy anstelle einer direkten Verbindung. Ich benutze squid3 auf meinem Ubuntu dafür. Nur eins unterscheidet zwischen Anforderungen, wenn Proxy - und es macht HTTP-Server Rückkehr 404 nicht gefunden - nur, wenn Proxy ..

Wenn ich Chrome zwingen, mit meinem Proxy auf der Grundlage eines squid3 (i verwenden PAC-Skript dafür in meiner Chrome-Erweiterung), meine Anfrage wird nicht funktionieren. Ich überprüfte viele Male und tat alles, was ich konnte, um irgendeinen Unterschied im Anfragekörper zu reduzieren, und alles, was ich jetzt noch habe, ist der erste Header.

Es sieht wie folgt aus Anfrage, wenn sie mit Proxy aktiv (von Netzwerk-Registerkarte Entwicklertools, geöffnet von Hintergrund Seite) gesendet:

POST http://host.com/postform/upload HTTP/1.1 

Ich habe versucht, chome.webRequest.onBeforeSendHeaders API verwenden, aber das hat nicht geholfen. Ich habe auch versucht, Hostnamen von URL in XmlHttpRequest.open zu entfernen, aber das hat nicht geholfen.

Ja, ich sende in jedem Fall korrekte Host und Origin Header. Könnte das ein Problem in meiner squid3-Konfiguration sein, oder was sollte ich in meinem JavaScript ändern?

UPDATE Realisiert nun, dass squid ist nicht das Problem in keiner Weise, und das Problem ist, dass POST Anfrage FULL uri enthält (http://...) Anstelle der "Pfad". GET funktioniert gut. Es bringt mich um.

Ich kann iframe Workarounds nicht verwenden. Was ist mein Problem?

+0

Ich verstehe, was verursacht 404 Fehler auf dem Server bei der Verwendung von Proxy, aber ich verstehe nicht, warum alles funktioniert (mit PAC-Proxy) in Ordnung, wenn Anfrage von normalen Chrome-Webseite (jquery/ajax) und nicht Erweiterung Backend-Skript gesendet wird. – Croll

Antwort

4

Um die API XHR in Ihrer Chrome-Erweiterung zu verwenden, müssen Sie die Berechtigung für den Zielhost anfordern, indem Sie die URL im Manifest-Attribut "permissions" angeben. Wenn der Zielhost (an den Sie die Anforderung XHR senden möchten) beispielsweise http://www.example.org lautet, sollte Ihr Manifest die folgenden Codezeilen enthalten.

... 
"permissions" : { 
    "http://www.example.org", 
    ... 
} 

Wenn Sie dies bereits getan haben, dann liegt der Fehler offensichtlich am Backend-Teil. Lesen Sie auch über match patterns, um das Übereinstimmen mehrerer URLs mit einer einzelnen Zeichenfolge zu ermöglichen, z. B. *://www.example.org/*.

+2

Ich habe bereits '*: //*.*' Erlaubnis in meinem Manifest – Croll

+1

@DmitrjA Wenn das ist, was Sie haben, ist das ein falsches Übereinstimmungsmuster. Soll '' *: // */* "' – Xan

+1

@Xan '*: // *. Org' genau das tun, was ich brauche. Ich habe deine Lösung versucht und nichts hat sich geändert. GET funktioniert wie erwartet, POST schlägt fehl, da der Header den vollständigen Anforderungs-URI anstelle von "Speicherort" (Pfad) enthält. – Croll

Verwandte Themen