From 7692f448e2112f7bad3e4d2bb523141c9d2e4e99 Mon Sep 17 00:00:00 2001
From: stpeter First draft. This spesification defines how JSON data type is used to exchange information between client and XMPP-service. Intended use is in JavaScript-based clients running in web browser, widget runtime etc. This JSON handling in service is targetet both for C2S and BOSH connections. The following design requirements reflect the need to offer performance as close as possible to standard XMPP-based stanza handling.
+
+
+
Intent for following use-cases is to support JavaScript-based clients which typically start XMPP-session from HTTP-dialog, and then depending on network environment and run-time support end using BOSH or C2S through Web Sockets.
+Initial BOSH request from browser or equivalent uses in http header content-type "application/jsonrequest". This initial request payload is in JSON format, and server responds with same content-type and JSON playload.
+If server doesn't support JSON it responds with http status 400 "Bad Request". In that case client either switches to content-type "text/xml; charset=utf-8" and XML-payload.
+In Client to Service connection initialization client proposes stream feature "json" TBD...
+Client (and server) implementation needs to take care of using such JSON object format which retains all structure of all XMPP XML stanzas.
+Following http-header is used to communicate with server using JSON playload:
+
+POST /http-bind HTTP/1.1
+Host: httpcm.jabber.org
+Accept-Encoding: gzip, deflate
+Content-Type: application/jsonrequest
+Content-Length: 230
+
+HTTP/1.1 200 OK
+Content-Type: application/jsonrequest
+Content-Length: 513
+
In following example server name is modified so content length is not accurate. Also JSON payload is modified for better clarity of its structure.
+ JSON data is typically converted to JS-object in browser client. Practically this means that tag string name / value string pairs are converted to tag name / value string pairs. Example:
+POST /http-bind HTTP/1.1
+Host: httpcm.jabber.org
+Accept-Encoding: gzip, deflate
+Content-Type: application/jsonrequest
+Content-Length: 230
+
+{ "body" : {
+ "hold" : 1,
+ "ver" : "1.6",
+ "wait" : 285,
+ "requests" : 2,
+ "rid" : 2669000493,
+ "to" : "server.com",
+ "lang" : { "$$" : "xml", "$" : "en" },
+ "version" : { "$$" : "xmpp", " : "1.0" },
+ "xmlns" : {
+ "$", "http://jabber.org/protocol/httpbind",
+ "@xmpp" : "urn:xmpp:xbosh" }
+ }
+}
+
+HTTP/1.1 200 OK
+Content-Type: application/jsonrequest
+Content-Length: 513
+
+{ "body" : {
+ "sid" : "b1165122e8856a087c0be4c53c229713a95d8ce6",
+ "wait" : "285",
+ "requests" : "2",
+ "inactivity" : "30",
+ "maxpause" : "120",
+ "polling" : "2",
+ "ver" : "1.6",
+ "from" : "server.com",
+ "secure" : "true",
+ "authid" : "1402940319",
+ "xmlns" : {
+ "$" : "http://jabber.org/protocol/httpbind",
+ "@xmpp" : "urn:xmpp:xbosh",
+ "@stream" : "http://etherx.jabber.org/streams"
+ },
+ "version" : { "$$" : "xmpp", "$" : "1.0" },
+ "$" : {
+ "features" : {
+ "$$" : "stream",
+ "$" : {
+ "mechanisms" : {
+ "xmlns" : "urn:ietf:params:xml:ns:xmpp-sasl",
+ "$" : { "mechanism" : "PLAIN" }
+ }
+ }
+ }
+ }
+}
+
+
+<tag>txt-value</tag>
+
+ JSON:
+{ "tag" : "txt-value" }
+
+
+<tag>
+ <tag2>txt-value</tag2>
+</tag>
+
+ JSON:
+{ "tag" : {
+ "$" : {
+ "tag2" : "txt-value" }
+ }
+}
+
+
+<tag>
+ <tag2>txt-value1</tag2>
+ <tag2>txt-value2</tag2>
+</tag>
+
+ JSON:
+{ "tag" : {
+ "$" : {
+ "tag2" : [ "txt-value1", "txt-value2" ] }
+ }
+}
+
+
+<tag attr="attr-value" />
+
+ JSON:
+{ "tag" : { "attr" : "attr-value" } }
+
+
+<tag attr="attr-value1" attr="attr-value2" />
+
+ JSON:
+{ "tag" : {
+ "attr" : [ "attr-value1", "attr-value2" ] }
+}
+
+
+<tag>
+ <tag2 attr="attr-value1" />
+ <tag2 attr="attr-value2" />
+</tag>
+
+ JSON:
+{ "tag" : {
+ "tag2" : [
+ { "attr" : "attr-value1" },
+ { "attr" : "attr-value2" } ]
+ }
+}
+
+
+<tag xmlns:ns="ns-value" />
+
+ JSON:
+{ "tag" : {
+ "xmlns" : {
+ "@ns" : "attr-value" }
+ }
+}
+
+
+<tag xmlns="root-value" xmlns:ns="ns-value" />
+
+ JSON:
+{ "tag" : {
+ "xmlns" : {
+ "$" : "root-value",
+ "@ns" : "attr-value" }
+ }
+}
+
+
+<ns:tag attr="attr-value" />
+
+ JSON:
+{ "tag" : {
+ "$$" : "ns",
+ "attr" : "attr-value" }
+}
+
+
+<tag attr="attr-value">txt-value</tag>
+
+ JSON:
+{ "tag" : {
+ "attr" : "attr-value",
+ "$" : "txt-value" }
+}
+
+
+<ns:tag attr="attr-value">txt-value</tag>
+
+ JSON:
+{ "tag" : {
+ "$$" : "ns",
+ "attr" : "attr-value",
+ "$" : "txt-value" }
+}
+
+
+var s = '{ "key" : "value" }';
+var sObj = JSON.parse(s); // sObj = { key : "value" };
+var sStr = JSON.stringify(sObj); // sStr = '{"key":"value"}';
+
Javascript variable naming doesn't support full colon characters ':'. Intented conversion between JSON and JS-objects is based on native JavaScript class JSON, more spesifically methods JSON.stringify() for converting object to JSON, and JSON.parse() from JSON to object.
+ Because of this namespace definitions are constructed hiearchically and their scope is within tag it is defined. Currently only reserved namespace name is 'xml'.
Same security issues apply as XML-payload. When using JSON class of later html5-supported browsers no need to use eval to convert JSON-string into variable value.
+REQUIRED.
+The XMPP Registrar [??] includes 'xx:xx:xx' in its registry of protocol namespaces.
+Makes me wonder how to use XML Schema for playing with JSON payload ?
+