2014-01-13 10 views
6

Ich versuche, eine HTTP-Anfrage von einer Extension zu senden, in der ich den User-Agent ändern muss.Ändern von User-Agent in XMLHttpRequest von einer Chrome-Erweiterung

Mein Code sieht wie folgt aus:

function getXMLHttpRequest(method, url, extraHeaders) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open(method, url, true) 

    for (var headerKey in extraHeaders) { 
     xhr.setRequestHeader(headerKey, extraHeaders[headerKey]); 
    } 

    return xhr; 
} 
//.... 

getXMLHttpRequest("POST", "....", { "User-Agent": "Blahblahblah" }) 

Dann bekomme ich einen Fehler „Refused unsicher Header zu setzen: Useragent“

ich das ändern müssen, weil mein Backend muss eine haben spezieller User-Agent, ist das von einer Erweiterung aus möglich?

Ich versuchte WebRequest API, um die Kopfzeile vor dem Senden der Anfrage zu ändern, aber es sagt, es funktioniert nicht mit XMLHttpRequest von Erweiterungen gemacht, um Sperren zu verhindern.

+1

@ExpertSystem Sie können den UserAgent jedoch mithilfe der webRequest-API ändern. Es ist eines der Beispiele im Dokument. http://developer.chrome.com/extensions/webRequest.html – HyLian

+0

@ExpertSystem Ich weiß, dass es unsicher ist, aber das ist kein normales Javascript, es ist eine Browser-Erweiterung, ich kann Sockets verwenden und senden, was ich will. Warum nicht erlauben, eine beliebige HTTP-Anfrage zu senden? Cross-Origin-Anfragen sind ebenfalls verboten und können mit der richtigen Konfiguration im Manifest durchgeführt werden. – HyLian

+0

http://www.w3.org/TR/cors/ Dieser Artikel beschreibt, wie Sie keine HTTP-Anfrage an einen Webserver stellen können, der in der Antwort für OPTIONS nicht den Zugriffssteuerungs-Zulassen-Ursprung enthält. Ich habe meinen Server nicht geändert, und ich kann XMLHttpRequests zu den Zielen machen, die diesen Header in der Antwort nicht enthalten. Wie auch immer, ich sage nicht, dass XMLHttpRequest es zulassen sollte, ich frage nach einer Möglichkeit, eine HTTP-Anfrage zu machen, die meinen eigenen User-Agent innerhalb einer Chrome-Erweiterung angibt. Es kann ein Chrom sein. * API oder was auch immer. – HyLian

Antwort

4

Sie können den User-Agent-Header einfach mit der webRequest API ändern.
Beispielcode siehe Associate a custom user agent to a specific Google Chrome page/tab.

Nehmen Sie den Code aus dieser Antwort und ändern Sie "main_frame", "sub_frame" in "xmlhttprequest", um Netzwerkanforderungen zu ändern, die über XMLHttpRequest initiiert wurden.

Offensichtlich Deadlocks zu vermeiden, ist diese Methode nicht tut Arbeit mit synchronen Anforderungen (das heißt, wenn der dritte Parameter von xhr.open wird auf false).

+0

Hey, Rob, war es immer so? Ich erinnere mich, irgendwo in den Dokumenten gelesen zu haben, dass die Beschränkung auf unsichere XMLHttpRequest-Header auch für eine chrome. * API gilt, aber ich kann sie nicht mehr finden. Irgendwelche Einsichten? Bin ich verrückt? – gkalpak

+0

@ExpertSystem Es gibt zwar eine Liste, aber "User-Agent" gehört nicht dazu. Scrollen Sie ein wenig nach unten unter https://developer.chrome.com/extensions/webRequest.html#life_cycle, um eine unvollständige Liste verdeckter Header anzuzeigen. Die Liste ist leider "nicht garantiert, dass sie vollständig oder stabil ist". Um eine definitive Antwort zu erhalten, muss man tief in den Quellcode von Chromium eintauchen. –

+0

Ja, ich habe die Liste gesehen, aber erinnere dich an ein Dokument, das ausdrücklich sagt, dass dieselben "unsicheren" Header wie XHR auch verhindern. OK, dann verliere ich es wahrscheinlich. BTW, du hast mich immer mit deinem Chromium-Source-Code-Grabing-Zeug gequält :) – gkalpak