Forum: Mikrocontroller und Digitale Elektronik Same Origin Policy, Webserver auf LPC1766


von Flo H. (flohaase)


Lesenswert?

Hey Leute

Ich habe auf meinem LPC1766 den uIP Webserver laufen. (Download: 
https://www.olimex.com/Products/ARM/NXP/LPC1766-STK/)

Um XMLHttpRequests domainübergreifend zu machen, muss ich den Header 
Response ändern in z. B.
1
Access-Control-Allow-Origin: *

Bevor ich das ganze auf dem Mircocontroller implementiere, habe ich auf 
meinen "normalen" Webserver getestet und es geht so weit. Dazu habe ich 
einfach in der Datei, die per XMLHttpRequest
1
xmlhttp.open("POST","http://www.domain2.de/1.php",true);

aufgerufen wird, den Header geändert auf
1
<?
2
    header("Access-Control-Allow-Origin: *");
3
?>

Leider ist das ganz jetzt ja in php und auf dem uIP Webserver läuft kein 
PHP-Server mit. Jetzt ist die Frage, wie den Header noch ändern kann, so 
dass es auf dem uIP-Webserver implementieren kann.

Hier http://enable-cors.org/server.html gibt es eine Auswahl an Methode, 
wie ich den Header ändern kann. Allerdings weiß ich nicht genau, was 
davon jetzt auf dem uIP-Webserver installiert ist.

ich hoffe, ihr könnt mir helfen. Vielen Dank.

von Chris R. (hownottobeseen)


Lesenswert?

Hi,

irgendwo muss dein Webserver "HTTP/1.x 200 Document follows" o. ä. 
ausgeben.

Genau danach kannst du die Direktive für Same Origin Policy ausgeben.

Mein AVR-Serverchen spuckt für JSON-Dateien folgendes aus:
1
HTTP/1.0 200 Document follows
2
Server: AVR_Small_Webserver
3
Access-Control-Allow-Origin: *
4
Content-Type: application/json

Such doch man ach entsprechender Stelle im Quellcode. Zumindest HTTP und 
200 muss vorkommen.

von Flo H. (flohaase)


Lesenswert?

Sorry, aber das sind jetzt ein paar Infos zu viel für mich.

Also im Quellcode des Javascripts, dass auf dem Webserver läuft finde 
ich hier "200":
1
http.open(serverActionMethod, paramURL, true);
2
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
3
4
http.onreadystatechange = function() {
5
    if(http.readyState == 4 && http.status == 200) {
6
        if(callback != undefined && typeof callback == 'function') callback(http.responseText);
7
    }
8
}
9
http.send(Parameter);

Das meinst du aber bestimmt nicht.

Wo könnte ich noch danach suchen?

Vielen Dank für deine Mühe

von Chris R. (hownottobeseen)


Lesenswert?

Hi,

das was im Browser verarbeitet wird, ist an der Stelle egal,
du musst in den Header ja durch den Server senden lassen.

Der ist bei dem Beispiel etwas komisch geschrieben (warum nicht einfach 
den String in den Array schreiben, anstatt jedes Zeichen einzeln in 
Hex...), such einfach mal nach http_header_200:

1
\LPC1766-STK\LPC1766-STK\uip_webserver\uip\httpd\httpd.c:234
2
\LPC1766-STK\LPC1766-STK\uip_webserver\uip\httpd\http-strings.c:46
3
\LPC1766-STK\LPC1766-STK\uip_webserver\uip\httpd\http-strings.h:16

Wenn du es einfach haben willst, musst du nur die letzten beiden Stellen 
anpassen.

von Flo H. (flohaase)


Lesenswert?

Ok, ich habe die Stellen gefunden. Leider weiß ich nicht, wie ich sie 
anpassen soll.

In hex steht dort ja einfach noch mal das gleich, dass auch als 
Kommentar zu finden ist.

Ich bin verwirrt.

Vielen Dank :)

von Lothar (Gast)


Lesenswert?

Immer noch dabei :-)

Ob das tatsächlich so funktioniert weiss ich nicht, aber er meint:

const char http_header_200[16] =
// "HTTP/1.0 200 OK"
{0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 
0x20, 0x4F, 0x4B, };

ersetzen durch:

const char http_header_200[??] =
// "HTTP/1.0 200 Document follows\r\nServer: 
uIP\r\nAccess-Control-Allow-Origin: *\r\nContent-Type: 
application/json\r\n"
{??, };

Noch Stringlänge und HEX ergänzen ...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Flo Haase schrieb:
> Also im Quellcode des Javascripts, dass auf dem Webserver läuft

Das Javascript läuft nicht auf dem Server, sonder auf dem Client...

Flo Haase schrieb:
> Leider weiß ich nicht, wie ich sie anpassen soll

Wie ein HTTP Header aufgebaut ist steht z.B. hier:
https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol

Es kann auch hilfreich sein, sich z.B. mit FireBug mal die Requests 
anzuschauen, dann sieht man was jede Seite sendet und dass kann dann 
auch Aufschluss geben.

Flo Haase schrieb:
> Um XMLHttpRequests domainübergreifend zu machen, muss ich den Header
> Response ändern

Zwischen welchen "Domains" willst du den zugreifen? ggf. kannst du auf 
der Ursprungsdomain auch einfach einen Proxy einrichten, der Anfragen an 
deinen µc weiterreicht.

von Flo H. (flohaase)


Lesenswert?

@ Lothar

Ja, ich bin jetzt wieder dran :) wegen den Prüfungen hatte ich ja eine 
Pause eingelegt :)

@ Läubi

Zur Untersuche der Header habe ich bis jetzt die mitgelieferten 
Entwickler-Tools von Safari oder Chrome benutzt. Hier sind auf jeden 
Fall mal die Einträge zu sehen, die mich interessieren.

Derzeit sind die "Domains" nur 2 IP-Adresse in meinen lokalen Netzwerk. 
192.168.0.104 und 105.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.