jsonP - Request

942 views
Skip to first unread message

Andy Fuchs

unread,
Jan 9, 2012, 5:54:05 AM1/9/12
to fhem-...@googlegroups.com
Hallo Rudi,

könnte man (Du ;-)) fhem beibringen, auf einen JSONP-Request zu reagieren und statt einem responseString den Callback zurückzuschicken?

Also, statt so:

http://fhemhost:8083/fhem?cmd=jsonlist&XHR=1


so, wobei die JSONList dann im myJSONPCallback zurückgeschickt wird:

http://fhemhost:8083/fhem?cmd=jsonlist&XHR=1&callback =myJSONPCallback


Dies ist extrem praktisch um flexibler mit den Restriktionen der SOP umzugehen.

Andy

Rudolf Koenig

unread,
Jan 9, 2012, 8:23:14 AM1/9/12
to fhem-...@googlegroups.com
On Mon, Jan 09, 2012 at 11:54:05AM +0100, Andy Fuchs wrote:
> Hallo Rudi,
>
> k�nnte man (Du ;-)) fhem beibringen, auf einen JSONP-Request zu reagieren und
> statt einem responseString den Callback zur�ckzuschicken?

Bitte es mit dem Author des Moduls (Martin Fischer) klaeren, will da erstmal
nicht reinreden.

Andy Fuchs

unread,
Jan 9, 2012, 9:15:26 AM1/9/12
to fhem-...@googlegroups.com
Hi Rudi,

hm - ist das nicht mehr eine Basis-Funktion, die eigentlich in fhem reingehört? Ich weiß jetzt im Moment leider nicht, wie fhem intern diese Requests abarbeitet. Aber ich dachte fhem schaut sich diese requests immer an:

http://fhemhost:8083/fhem?cmd=list&XHR=1

und könnte somit quasi alles auch als callback zurückschicken

http://fhemhost:8083/fhem?cmd=list&XHR=1&callback=myCallback

-> {result: ...list... }

Gruß

andy

Am 09.01.2012 um 14:23 schrieb Rudolf Koenig:

> On Mon, Jan 09, 2012 at 11:54:05AM +0100, Andy Fuchs wrote:
>> Hallo Rudi,
>>

>> könnte man (Du ;-)) fhem beibringen, auf einen JSONP-Request zu reagieren und
>> statt einem responseString den Callback zurückzuschicken?


>
> Bitte es mit dem Author des Moduls (Martin Fischer) klaeren, will da erstmal
> nicht reinreden.
>

> --
> To unsubscribe from this group, send email to
> fhem-users+...@googlegroups.com

Rudolf Koenig

unread,
Jan 9, 2012, 9:44:48 AM1/9/12
to fhem-...@googlegroups.com
> hm - ist das nicht mehr eine Basis-Funktion, die eigentlich in fhem
> reingeh�rt?

Basis-Funktion ist relativ, ich brauche jsonlist nicht :) Es ist aber Teil des
FHEM Verzeichnisses und damit genauso "Basis-Funktion", wie at, notify und
filelog.


> und k�nnte somit quasi alles auch als callback zur�ckschicken

Sicher, jsonlist waere auch einfach zu aendern, ich meine aber derjenige der es
gebaut hat, soll erstmal dafuer Support uebernehmen.


> http://fhemhost:8083/fhem?cmd=list&XHR=1&callback=myCallback

Wenn auf der Kommandozeile (== telnet) das als "jsonlist callback myCallback"
aufgerufen werden kann (nachdem man das implementiert hatte :), dann waere
daraus auf HTTP:

http://fhemhost:8083/fhem?cmd=list+callback+myCallback&XHR=1

Andy Fuchs

unread,
Jan 9, 2012, 10:02:15 AM1/9/12
to fhem-...@googlegroups.com
Hi Rudi,

mir geht's nicht um jsonlist (das war nur ein Beispiel), sondern um die Möglichkeit den request an fhem als JSONP-Request zu schicken und damit die SOP zu umgehen, indem fhem das Ergebnis in einen callback wickelt.

http://fhemhost:8083/fhem?cmd=get%20myLog%20&XHR=1&callback=MyCallback

Andy

Am 09.01.2012 um 15:44 schrieb Rudolf Koenig:

>> hm - ist das nicht mehr eine Basis-Funktion, die eigentlich in fhem

>> reingehört?


>
> Basis-Funktion ist relativ, ich brauche jsonlist nicht :) Es ist aber Teil des
> FHEM Verzeichnisses und damit genauso "Basis-Funktion", wie at, notify und
> filelog.
>
>

>> und könnte somit quasi alles auch als callback zurückschicken


>
> Sicher, jsonlist waere auch einfach zu aendern, ich meine aber derjenige der es
> gebaut hat, soll erstmal dafuer Support uebernehmen.
>
>
>> http://fhemhost:8083/fhem?cmd=list&XHR=1&callback=myCallback
>
> Wenn auf der Kommandozeile (== telnet) das als "jsonlist callback myCallback"
> aufgerufen werden kann (nachdem man das implementiert hatte :), dann waere
> daraus auf HTTP:
>
> http://fhemhost:8083/fhem?cmd=list+callback+myCallback&XHR=1
>

Andy Fuchs

unread,
Jan 11, 2012, 6:00:35 AM1/11/12
to fhem-...@googlegroups.com
>>> http://fhemhost:8083/fhem?cmd=list&XHR=1&callback=myCallback
>>
>> Wenn auf der Kommandozeile (== telnet) das als "jsonlist callback myCallback"
>> aufgerufen werden kann (nachdem man das implementiert hatte :), dann waere
>> daraus auf HTTP:
>>
>> http://fhemhost:8083/fhem?cmd=list+callback+myCallback&XHR=1

Auf der CommandLine braucht man das ja auch nicht, da die Same-Origin-Policy ja eine 'künstliche' Schranke im Browser ist.

Aber:
Wo müsste ich denn das reinschreiben (sofern ich es in Perl hinbekomme), dass fhem mir den callback ausfüllt und zurückschickt?

http://fhemhost:8083/fhem?cmd=list&callback=myCallback

Gehört das nicht eigentlich so irgendwie in 01_FHEMWEB.pm rein?

if($FW_CALLBACK) {
$FW_RETTYPE = "application/json; charset=$FW_encoding";
...
print $callback . '(' . $json . ');';
}

Bin für jeden Hinweis dankbar.

Andy

Rudolf Koenig

unread,
Jan 11, 2012, 6:44:27 AM1/11/12
to fhem-...@googlegroups.com
> Geh�rt das nicht eigentlich so irgendwie in 01_FHEMWEB.pm rein?

Doch, dein SOP Argument hat mich ueberzeugt. Ich meine es macht nur im
Zusammenhang mit XHR Sinn, also sollte im "if($FW_XHR) {" Abschnitt sein.

> if($FW_CALLBACK) {
> $FW_RETTYPE = "application/json; charset=$FW_encoding";

Wieso json? eher "text/javascript, wenn es unbeding sein muss.
FHEMWEB hat von jsonlist keine Ahnung, und das ist gut so :)

Andy Fuchs

unread,
Jan 11, 2012, 7:00:51 AM1/11/12
to fhem-...@googlegroups.com
Am 11.01.2012 um 12:44 schrieb Rudolf Koenig:

>> Gehört das nicht eigentlich so irgendwie in 01_FHEMWEB.pm rein?


>
> Doch, dein SOP Argument hat mich ueberzeugt. Ich meine es macht nur im
> Zusammenhang mit XHR Sinn, also sollte im "if($FW_XHR) {" Abschnitt sein.

Freut mich - und das gibt eine Menge mehr Flexibilität für potentielle Frontends.

Kannst Du das auch reinmachen? Ich trau' mich nicht...

>
>> if($FW_CALLBACK) {
>> $FW_RETTYPE = "application/json; charset=$FW_encoding";
>
> Wieso json? eher "text/javascript, wenn es unbeding sein muss.
> FHEMWEB hat von jsonlist keine Ahnung, und das ist gut so :)


Ich bin mir nicht sicher, ob der Browser den returntype überhaupt interessiert, weil ja ein Callback zurückkommt (ich tippe mal auf 'nein'). Muss man mal ausprobieren.


Grüße

andy

Rudolf Koenig

unread,
Jan 11, 2012, 4:47:04 PM1/11/12
to fhem-...@googlegroups.com
> mir geht's nicht um jsonlist (das war nur ein Beispiel), sondern um die
> M�glichkeit den request an fhem als JSONP-Request zu schicken und damit die

> SOP zu umgehen, indem fhem das Ergebnis in einen callback wickelt.

Habs eingebaut, aber statt callback habe ich die Variable jsonp genannt. Also:

http://fhemhost:8083/fhem?cmd=jsonlist&jsonp=MyCallback

XHR ist mit jsonp implicit. Eingecheckt und per fhemupdate zur Verfuegung
gestellt. Bitte testen.

Andy Fuchs

unread,
Jan 13, 2012, 2:55:33 PM1/13/12
to fhem-...@googlegroups.com
Hallo Rudi,

vielen Dank für das Einbauen vom JSONP. Es funktioniert schon fast ;-)

Allerdings wird bei dem Request ein STRING zurückgegeben, aber der müsste in JSON zurückkommen:

Der Request ist so: 'http://<meineIP>/fhem?cmd=jsonlist&jsonp=?';

und zurück kommt dann sowas:

jsonp2('{
"ResultSet": "full",
"Results": [
{
"list": "Global",
"devices": [
{
"DEF": "<no definition>",
"NAME": "global",
"NR": "1",
...
"verbose": "3",
"version": "5.2+SVN from 2012-01-07 ($Id: fhem.pl 1177 2012-01-07 09:00:32Z rudolfkoenig $)"
},
"READINGS": []
}
]
},
...
],
"totalResultsReturned": 33
}
');

und ich bekomme: fhem:1SyntaxError: Unexpected EOF

Könntest Du das bitte noch anpassen?

Danke

Andy

Am 11.01.2012 um 12:44 schrieb Rudolf Koenig:

>> Gehört das nicht eigentlich so irgendwie in 01_FHEMWEB.pm rein?

Rudolf Koenig

unread,
Jan 14, 2012, 3:52:14 AM1/14/12
to fhem-...@googlegroups.com
> Allerdings wird bei dem Request ein STRING zur�ckgegeben, aber der m�sste in
> JSON zur�ckkommen:

Da bin ich dagegen, sonst kann man nur jsonlist als Argument verwenden. Ein
eval wirst Du wohl auch selber hinkriegen :)


> Der Request ist so: 'http://<meineIP>/fhem?cmd=jsonlist&jsonp=?';

Falsch :) Der Request ist so:
http://<meineIP>/fhem?cmd=jsonlist&jsonp=MyFunc
Wo kommt der ' und ; her?


> und ich bekomme: fhem:1SyntaxError: Unexpected EOF

Kriege ich nicht. Auch bei jsonp=? nicht. Evtl. Proxy?

Andy Fuchs

unread,
Jan 14, 2012, 6:51:32 AM1/14/12
to fhem-...@googlegroups.com

Am 14.01.2012 um 09:52 schrieb Rudolf Koenig:

>> Allerdings wird bei dem Request ein STRING zurückgegeben, aber der müsste in
>> JSON zurückkommen:
>

> Da bin ich dagegen, sonst kann man nur jsonlist als Argument verwenden. Ein
> eval wirst Du wohl auch selber hinkriegen :)


Nein - das geht nicht, da der Fehler bereits auf Browser-Ebene auftritt, d.h. BEVOR ich überhaupt ein eval ausführen kann (das 'jsonp' wird als Callback interpretiert).

Ausserdem kann man dann eben genau nicht nur jsonlist als Argument verwenden, sondern eben alles. Die Lösung ist eigentlich ganz einfach: Statt dem String zurückzugeben, wrappt man diesen in ein JSON, d.h.

statt
'{ x: [a:1]}' //also als String - so wie jetzt

macht man:
{ result: '{ x: [a:1]}'} //JSON

DANN kann man einen eval auf das 'result' machen. Also eval( myReturnedJSON.result)

>> Der Request ist so: 'http://<meineIP>/fhem?cmd=jsonlist&jsonp=?';
>
> Falsch :) Der Request ist so:
> http://<meineIP>/fhem?cmd=jsonlist&jsonp=MyFunc
> Wo kommt der ' und ; her?

das ' hatte ich nur zum markieren der Zeile benutzt und das ? steht für den Callback Namen:

Wenn ich von meinem Server (sagen wir mal Port 80) diesen Request abschicke:

http://<myip>:8083/fhem?cmd=jsonlist&jsonp=MyFunc

dann erhalte ich im Browser folgendes:
XMLHttpRequest cannot load http://<myip>:8083/fhem?cmd=jsonlist&jsonp=MyFunc. Origin http://<myip> is not allowed by Access-Control-Allow-Origin.

Für den Browser sind die unterschiedlichen ports bereits eine Verletzung der SOP.


>> und ich bekomme: fhem:1SyntaxError: Unexpected EOF
>
> Kriege ich nicht. Auch bei jsonp=? nicht. Evtl. Proxy?

Vermutlich, weil Du Deinen Test von <ip:8083> auf <ip:8083> abschickst. Probier's doch mal von einem anderen Port (oder besser noch: anderen Rechner) aus.

Könntest Du das nochmal probieren? Ich hab' echt alles versucht, aber einen String zurück lässt der Browser nicht.

Gruß

Andy


Rudolf Koenig

unread,
Jan 14, 2012, 8:23:42 AM1/14/12
to fhem-...@googlegroups.com
> Nein - das geht nicht, da der Fehler bereits auf Browser-Ebene auftritt, d.h.
> BEVOR ich �berhaupt ein eval ausf�hren kann (das 'jsonp' wird als Callback
> interpretiert).

Klar doch, das sollte doch auch der Sinn von jsonP sein.

Zitat http://de.wikipedia.org/wiki/JavaScript_Object_Notation
Im src-Attribut eines <script>-Elements ist es m�glich, beliebige URLs
anzugeben. F�r dieses Attribut greift die Same-Origin-Policy nicht. Es ist
also m�glich, eine URL in einer anderen Domain anzugeben, die beispielsweise
JSON-Daten zur�ck gibt. Dieses Script h�tte aber keinen Effekt.

Um die JSON-Daten auf dem Client verarbeiten zu k�nnen, verpackt der Server
diese als Parameter in eine JavaScript-Funktion, die im Webbrowser bereits
definiert ist. Der Name dieser Funktion wird dem Server �ber einen Query
String der URL mitgeteilt.

<script>
function
MyFunc(arg)
{
var result = eval arg;
...
}
</script>

<script type="text/javascript"
src="http://fhem:8083/fhem?cmd=jsonlist&jsonp=MyFunc">
</script>

Aber vielleicht verstehe ich auch was nicht.

Andy Fuchs

unread,
Jan 14, 2012, 11:22:18 AM1/14/12
to fhem-...@googlegroups.com
Hi Rudi,

Du hast es nicht ausprobiert, stimmts? ;-)

> Um die JSON-Daten auf dem Client verarbeiten zu können, verpackt der Server


> diese als Parameter in eine JavaScript-Funktion, die im Webbrowser bereits

> definiert ist. Der Name dieser Funktion wird dem Server über einen Query


> String der URL mitgeteilt.
>
> <script>
> function
> MyFunc(arg)
> {
> var result = eval arg;
> ...
> }
> </script>


Der Browser führt das aus, was er zurückbekommt, also im aktuellen falle

MyFunc('foo') {} // geht aber nicht

wohingegen:

MyFunc({'foo':'bar'}) {} // geht

<zitat http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/ >

The way JSONP works is simple, but requires a little bit of server-side cooperation. Basically, the idea is that you let the client decide on a small chunk of arbitrary text to prepend to the JSON document, and you wrap it in parentheses to create a valid JavaScript document (and possibly a valid function call).

The client decides on the arbitrary prepended text by using a query argument named jsonp with the text to prepend. Simple! With an empty jsonp argument, the result document is simply JSON wrapped in parentheses.

</zitat>


Ich habe in fhem mal die single-quotes bei FW_pO "$FW_jsonp('$FW_cmdret');"; entfernt:

FW_pO "$FW_jsonp($FW_cmdret);";

Dann geht alles wie geschnitten Brot (zumindest mit der JSONList). Möchte man das verallgemeinern gibt es meiner Meinung nach 2 Möglichkeiten:

1.) Wenn $FW_cmdret am Anfang ein { und am Ende ein } hat, dann schickt man es einfach wie oben zurück, ansonsten macht man vorn und hinten eine Klammer dran.
2. Man wrappt das $FW_cmdret in ein JSON:

FW_pO "$FW_jsonp({'jsonresult':'$FW_cmdret'});";

Das wiederum dürfte Ärger machen, wenn man die jsonlist zurückschickt, da diese ja dann als String eingebettet würde.

Egal wie: möchte man das Ergebnis nicht nur auf die jsonlist beschränken, muß man drauf achten, dass der Rückgabewert auch ein gültiges JSON ist, oder ihn encoden.

Mir würde die Variante 1 am besten gefallen.

Mein Perl ist leider viel zu schlecht, sonst würde ich Dir das Snippet schicken :)

Grüße

Andy


>
> <script type="text/javascript"
> src="http://fhem:8083/fhem?cmd=jsonlist&jsonp=MyFunc">
> </script>
>
> Aber vielleicht verstehe ich auch was nicht.


>

Rudolf Koenig

unread,
Jan 14, 2012, 3:05:50 PM1/14/12
to fhem-...@googlegroups.com
> Du hast es nicht ausprobiert, stimmts? ;-)

Stimmts. Es sollte auch:
eval('result='+arg);
heissen. Damit geht es. Ausprobiert :)

Andy Fuchs

unread,
Jan 14, 2012, 3:11:55 PM1/14/12
to fhem-...@googlegroups.com

Wie hast Du das denn ausprobiert? Ich bekomme bereits bei der Antwort vom Server eine DOM-Exception, so dass ich gar nicht mehr dazu komme das Ergebnis zu verwerten. Ich sehe zwar, dass die korrekten Daten ankommen, komme aber an die nicht dran, weil die DOM-Exception meine Programmfluss unterbricht.

Kannst Du das mal mit einem Stückchen HTML und Javascript ausprobieren - und mir sagen was ich machen muß, damit das bei mir auch geht? ;-)

Grüße

andy

Rudolf Koenig

unread,
Jan 14, 2012, 4:44:28 PM1/14/12
to fhem-...@googlegroups.com
> Kannst Du das mal mit einem St�ckchen HTML und Javascript ausprobieren - und
> mir sagen was ich machen mu�, damit das bei mir auch geht? ;-)

Wie das im Wiki vorgeschlagen wurde:

test.html:
=======
<html>
<head>
<title>Test</title>
<script type="text/javascript">
function MyFunc(arg)
{
eval('result='+arg);
alert(result);
}
//window.onload = MyFunc("HellO");
</script>
<script type="text/javascript"
src="http://fhemhost:8083/fhem?cmd=jsonlist&jsonp=MyFunc">
</script>
</head>
<body>
Test1.
</body>
</html>
=======

Aufruf:
http://webserver/test.html

fhemhost != webserver

Andy Fuchs

unread,
Jan 14, 2012, 8:34:08 PM1/14/12
to fhem-...@googlegroups.com
Geht nicht - auf keinem meiner Browser. Ich erhalte:


Firefox:
----------

unterminated string literal

MyFunc('{
fhem?c...=MyFunc (Zeile 1, Spalte 7)


Safari:
---------
MyFunc('{
fhem:1SyntaxError: Unexpected EOF


Google Chrome:
-----------------------
Uncaught SyntaxError: Unexpected token ILLEGAL

:-(

Alles MacOSX latest rev.

Vielleicht hast Du an Deinen Rechnern die Rechte verdreht?


Gruß

Andy


Am 14.01.2012 um 22:44 schrieb Rudolf Koenig:

>> Kannst Du das mal mit einem Stückchen HTML und Javascript ausprobieren - und
>> mir sagen was ich machen muß, damit das bei mir auch geht? ;-)


>
> Wie das im Wiki vorgeschlagen wurde:
>
> test.html:
> =======
> <html>
> <head>
> <title>Test</title>
> <script type="text/javascript">
> function MyFunc(arg)
> {
> eval('result='+arg);
> alert(result);
> }
> //window.onload = MyFunc("HellO");
> </script>
> <script type="text/javascript"
> src="http://fhemhost:8083/fhem?cmd=jsonlist&jsonp=MyFunc">
> </script>
> </head>
> <body>
> Test1.
> </body>
> </html>
> =======
>
> Aufruf:
> http://webserver/test.html
>
> fhemhost != webserver
>

Rudolf Koenig

unread,
Jan 15, 2012, 5:07:29 AM1/15/12
to fhem-...@googlegroups.com
> Vielleicht hast Du an Deinen Rechnern die Rechte verdreht?

Nichts dergleichen. Die Meldung deutet darauf hin, dass das schliessende '
fehlt, vermutlich hast Du sie bei deinem Experiment vergessen. Es sollte so
ausschauen:
$FW_cmdret =~ s/'/\\'/g;
FW_pO "$FW_jsonp('$FW_cmdret');";
Oder in Deinem fhem.cfg sind Sonderzeichen, die in jsonlist nicht geschuetzt
sind. Kannst Du dein Experiment auch mit einem minimalen fhem.cfg versuchen?

Andy Fuchs

unread,
Jan 15, 2012, 7:14:08 AM1/15/12
to fhem-...@googlegroups.com

>> Vielleicht hast Du an Deinen Rechnern die Rechte verdreht?
>
> Nichts dergleichen. Die Meldung deutet darauf hin, dass das schliessende '
> fehlt, vermutlich hast Du sie bei deinem Experiment vergessen. Es sollte so
> ausschauen:
> $FW_cmdret =~ s/'/\\'/g;
> FW_pO "$FW_jsonp('$FW_cmdret');";

Nein - ich hab' für die Tests die Original fhem verwendet (ohne irgendwelche Modifikationen).
Mit meiner Variante
FW_pO "$FW_jsonp($FW_cmdret);";
tritt das Problem ja nicht auf (zumindest bei der jsonlist).

> Oder in Deinem fhem.cfg sind Sonderzeichen, die in jsonlist nicht geschuetzt
> sind. Kannst Du dein Experiment auch mit einem minimalen fhem.cfg versuchen?


OK - ich hab dasselbe mal (Original-fhem) mit folgender cfg gemacht - ohne Änderung der Ergebnisse. Auf allen Browsern gibt's Exceptions.


attr global modpath /usr/share/fhem
attr global nofork 1
attr global port 7072 global
attr global statefile /var/log/fhem/fhem.save
attr global verbose 3

define CUNO CUL 192.168.x.y:2323 1234

define WEB FHEMWEB 8083 global


Was für einen Browser verwendest Du denn? Und hast Du's mal mit einem anderen versucht?

Vielleicht wäre es doch einfacher das so zu machen, wie ich es vorgeschlagen habe ;-)

Danke für Deine Mühe

Andy

Alexander Brickwedde

unread,
Jan 16, 2012, 3:53:08 PM1/16/12
to FHEM users
On 15 Jan., 02:34, Andy Fuchs <tiptro...@online.de> wrote:> Geht nicht
- auf keinem meiner Browser. Ich erhalte:> > Firefox:> ----------> >
unterminated string literal
Da sind "zuviele" Zeilenumbrüche drin. Im Result des jsonp darf kein
Zeilenumbruch drin sein. Meine "myJSONPCallback" würde dann so
aussehen und x enthält dann das passende Object/Array. ("eval" is
"evil", nur nutzen, wenns der Browser nicht unterstützt, z.B. ie<=7)

function myJSONPCallback(s){ var x = JSON.parse(s);
...}

Alexander Brickwedde

unread,
Jan 16, 2012, 3:55:41 PM1/16/12
to FHEM users
Die Formatierung ist ja echt grottig, sorry. Gibt's hier Tags, die man
nutzen kann ???

...Alex

On 16 Jan., 21:53, Alexander Brickwedde <a...@nfsroot.de> wrote:
> On 15 Jan., 02:34, Andy Fuchs <tiptro...@online.de> wrote:> Geht nicht
> - auf keinem meiner Browser. Ich erhalte:> > Firefox:> ----------> >
> unterminated string literal
> Da sind "zuviele" Zeilenumbrüche drin. Im Result desjsonpdarf kein

Andy Fuchs

unread,
Jan 16, 2012, 4:33:27 PM1/16/12
to fhem-...@googlegroups.com
Am 16.01.2012 um 21:53 schrieb Alexander Brickwedde:

> On 15 Jan., 02:34, Andy Fuchs <tiptro...@online.de> wrote:> Geht nicht
> - auf keinem meiner Browser. Ich erhalte:> > Firefox:> ----------> >
> unterminated string literal
> Da sind "zuviele" Zeilenumbrüche drin. Im Result des jsonp darf kein
> Zeilenumbruch drin sein.

Deshalb ist's ja meiner Ansicht nach besser gleich alles als JSON zurückzugeben.
a) Sparst Du Dir damit das parsen im UI
b) Können da beliebig viele Returns drin sein (weil diese ja nicht als solche interpretiert werden)
c) Funktioniert das ganze dann auch ohne Umschweife mit den gängigen Javascript-Bibliotheken wie jQuery, Prototype, DoJo, etc...

Andy


> Meine "myJSONPCallback" würde dann so
> aussehen und x enthält dann das passende Object/Array. ("eval" is
> "evil", nur nutzen, wenns der Browser nicht unterstützt, z.B. ie<=7)
>
> function myJSONPCallback(s){ var x = JSON.parse(s);
> ...}
>

gaggi

unread,
Aug 28, 2012, 9:34:00 AM8/28/12
to fhem-...@googlegroups.com

Deshalb ist's ja meiner Ansicht nach besser gleich alles als JSON zurückzugeben.
a) Sparst Du Dir damit das parsen im UI
b) Können da beliebig viele Returns drin sein (weil diese ja nicht als solche interpretiert werden)
c) Funktioniert das ganze dann auch ohne Umschweife mit den gängigen Javascript-Bibliotheken wie jQuery, Prototype, DoJo, etc...

Andy

Lange keine Antwort hier aber ich denke hier passts am besten rein.
Ich bin gerade dabei mir ein kleines Interface zu basteln und stand vor dem Problem das ein normaler XMLHttpRequest per "jsonlist&XHR=1" nur vom selben server möglich ist.
Per JSONP hab ich die Daten wegen der Zeilenumbrüche in der Datei aber auch nicht geladen bekommen.
Ich habe daher die 01_FHEMWEB.pl so geändert das ein anhägen von "CORS=1", durch setzen eines Headers, das Cross-origin resource sharing freigibt.

Ich hänge meine 01_FHEMWEB.pl mal hier an falls irgendwer das nochmal benötigt.
(Änderungen in Zeile 91, 279-282, 614, 639)

Gruß
Gerrit
01_FHEMWEB.pm

Rudolf Koenig

unread,
Aug 28, 2012, 2:19:21 PM8/28/12
to fhem-...@googlegroups.com
> Ich habe daher die 01_FHEMWEB.pl so ge�ndert das ein anh�gen von "CORS=1",
> durch setzen eines Headers, das Cross-origin resource sharing freigibt.

Hab die Aenderungen uebernommen und eingecheckt. Bitte das naechste mal den
Output von diff -u (oder einen anderen patch-faehigen diff) posten.
Message has been deleted

gaggi

unread,
Sep 5, 2012, 6:34:17 AM9/5/12
to fhem-...@googlegroups.com
Ich hab die 01_FHEMWEB.pl nochmal überarbeitet um CORS auch bei aktiviertem basic auth benutzen zu können.
Außerdem noch ein Patch für das Eltako FSM61 EnOcean Modul um released als Status zuzulassen.
01_FHEMWEB.diff
10_EnOcean.diff
Message has been deleted

Rudolf Koenig

unread,
Sep 19, 2012, 3:47:55 AM9/19/12
to fhem-...@googlegroups.com
Hab beide diffs (EnOcean FSB61) + FHEMWEB Cors fix) nach kurzes Testen eingecheckt.
FSB61 habe ich in der commandref.html noch erwaehnt.

Rudolf Koenig

unread,
Nov 1, 2012, 4:26:45 AM11/1/12
to FHEM users
> Hab beide diffs (EnOcean FSB61) + FHEMWEB Cors fix) nach kurzes Testen eingecheckt.
> FSB61 habe ich in der commandref.html noch erwaehnt.

Bin gerade ueber das CORS handling gestolpert, und ich finde, dass ein
CORS Flag (Cross-Origin-Resource-Sharing) gehoert nicht zum Aufruf-URL
sondern als FHEMWEB Attribut. Veto?
Weiterhin steht in diesem Fall im header, dass FHEMWEB GET, PUT und
OPTIONS verarbeitet: stimmt so nicht. PUT und OPTIONS habe ich erstmal
entfernt.

Jörg Schneider

unread,
Nov 18, 2012, 2:13:01 PM11/18/12
to fhem-...@googlegroups.com
Hallo!


Am Mittwoch, 5. September 2012 12:34:17 UTC+2 schrieb gaggi:
Ich hab die 01_FHEMWEB.pl nochmal überarbeitet um CORS auch bei aktiviertem basic auth benutzen zu können.
Außerdem noch ein Patch für das Eltako FSM61 EnOcean Modul um released als Status zuzulassen.

Ich möchte die Diskussion zu JSONP auch nochmal aufgreifen und zwei Patches vorschlagen:

jsonp-newlines.patch:
JavaScript mag keine String-Definitionen über mehrere Zeilen. Daher beschwert sich der Browser bei der bisherigen JSONP-Funktion, wenn es mehrzeilige Ausgaben (z.B. von jsonlist) gibt. Man kann die Zeilenumbrüche aber einfach mit \ vor dem Zurückschicken escapen. Danach funktioniert das JSONP mit Firefox, IE 9 und Opera.

jsonlist-devicedetails.patch
Die Ausgabe von jsonlist ohne Parameter und mit einem Typ als Parameter ist ein Objekt mit den Attributen Result und ResultSet[]. Übergibt man aber einen konkreten Devicenamen als Parameter, dann enthält das Objekt nur ein Attribut Result, das wiederum das Attribut ResultSet (diesmal kein Array) enthält (also JSON.parse(answer).Result.ResultSet statt JSON.parse(answer).ResultSet[0]). Eigentlich sollte hier auch eine Devspec möglich sein, es wird aber immer nur das letzte passende Device angezeigt.

Ich habe in dem Patch die Ausgabe für den dritten Fall an die ersten beiden angepaßt. Jetzt ist die Ausgabe aber nicht mehr mit dem alten Stand kompatibel und ich bin mir nicht sicher, ob es vernüftigt ist, auf die Anfrage nach einem konkreten Device mit einem Array zu antworten.

Viele Grüße
Jörg
jsonlist-devicedetails.patch
jsonp-newlines.patch

Rudolf Koenig

unread,
Nov 19, 2012, 2:01:11 AM11/19/12
to fhem-...@googlegroups.com
> Ich m�chte die Diskussion zu JSONP auch nochmal aufgreifen und zwei Patches
> vorschlagen:

Den FHEMWEB Patch habe ich eingecheckt.
Den anderen sollte Martin (Autor von jsonlist) uebernehmen.

gaggi

unread,
Nov 19, 2012, 4:24:08 PM11/19/12
to fhem-...@googlegroups.com
Hallo, stimme dir voll zu das CORS über eine attr aktiviert werden sollte.
Der im "Access-Control-Allow-Methods" Header muss laut spezifikation ausser GET mindestens noch OPTIONS angegeben werden damit CORS funktioniert.
Alle modernen Browser handhaben es auch so das bei nicht gesetztem OPTIONS die UserCredentials bei Ajax Requests nicht mitgesendet werden.
Eine Ausnahme stellt hierbei der InternetExplorer dar, dem ist das ganze herzlich egal und man bräuchte theoretisch überhaupt keine Änderungen am Header machen.

Rudolf Koenig

unread,
Nov 20, 2012, 12:52:00 PM11/20/12
to fhem-...@googlegroups.com
> Hallo, stimme dir voll zu das CORS �ber eine attr aktiviert werden sollte.

Umgebaut, und eingecheckt: "attr WEB CORS 1" ist ab jetzt notwendig.


> Der im "Access-Control-Allow-Methods" Header muss laut spezifikation ausser
> GET mindestens noch OPTIONS angegeben werden damit CORS funktioniert.

Ok, OPTIONS ist wieder drin, aber auf OPTIONS antwortet FHEMWEB nicht richtig,
der kapiert nur GET :). Kannst Du es bitte testen, ich wuesste nicht wie.

gaggi

unread,
Nov 21, 2012, 5:20:48 AM11/21/12
to fhem-...@googlegroups.com
Am Dienstag, 20. November 2012 18:52:02 UTC+1 schrieb Rudolf Koenig:
Ok, OPTIONS ist wieder drin, aber auf OPTIONS antwortet FHEMWEB nicht richtig,
der kapiert nur GET :).  Kannst Du es bitte testen, ich wuesste nicht wie.

Gerade geladen und getestet funktioniert genau so wie es soll. 
Klar antwortet FHEM auf einen Options Request sogar HTTP/1.1 konform ;)
Hab das damals so angelegt das er auf einen Options Request nur mit Headern antwortet

if($headerOptions[0]) {
    print $c "HTTP/1.1 200 OK\r\n",
        $FW_headercors,
        "Content-Length: 0\r\n\r\n";
    $hash->{BUF}="";
    return;
    exit(1);
};

Funktioniert ausgezeichnet ;)
Reply all
Reply to author
Forward
0 new messages