I think it would be beneficial to everyone if we kept all js in javascript/, unless it's for a language-specific detail. This will help ensure feature parity between different language implementations. What do you think?
On Dec 22, 2007 8:11 AM, <[EMAIL PROTECTED]> wrote: > Added: incubator/shindig/trunk/php/js/json.js > URL: > http://svn.apache.org/viewvc/incubator/shindig/trunk/php/js/json.js?rev=606463&view=auto > > ============================================================================== > --- incubator/shindig/trunk/php/js/json.js (added) > +++ incubator/shindig/trunk/php/js/json.js Sat Dec 22 08:11:57 2007 > @@ -0,0 +1,319 @@ > +/* > + json.js > + 2007-10-10 > + > + Public Domain > + > + This file adds these methods to JavaScript: > + > + array.toJSONString(whitelist) > + boolean.toJSONString() > + date.toJSONString() > + number.toJSONString() > + object.toJSONString(whitelist) > + string.toJSONString() > + These methods produce a JSON text from a JavaScript value. > + It must not contain any cyclical references. Illegal values > + will be excluded. > + > + The default conversion for dates is to an ISO string. You can > + add a toJSONString method to any date object to get a > different > + representation. > + > + The object and array methods can take an optional whitelist > + argument. A whitelist is an array of strings. If it is > provided, > + keys in objects not found in the whitelist are excluded. > + > + string.parseJSON(filter) > + This method parses a JSON text to produce an object or > + array. It can throw a SyntaxError exception. > + > + The optional filter parameter is a function which can filter > and > + transform the results. It receives each of the keys and > values, and > + its return value is used instead of the original value. If it > + returns what it received, then structure is not modified. If > it > + returns undefined then the member is deleted. > + > + Example: > + > + // Parse the text. If a key contains the string 'date' then > + // convert the value to a date. > + > + myData = text.parseJSON(function (key, value) { > + return key.indexOf('date') >= 0 ? new Date(value) : > value; > + }); > + > + It is expected that these methods will formally become part of the > + JavaScript Programming Language in the Fourth Edition of the > + ECMAScript standard in 2008. > + > + This file will break programs with improper for..in loops. See > + http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ > + > + This is a reference implementation. You are free to copy, modify, or > + redistribute. > + > + Use your own copy. It is extremely unwise to load untrusted third > party > + code into your pages. > +*/ > + > +/*jslint evil: true */ > + > +// Augment the basic prototypes if they have not already been augmented. > + > +if (!Object.prototype.toJSONString) { > + > + Array.prototype.toJSONString = function (w) { > + var a = [], // The array holding the partial texts. > + i, // Loop counter. > + l = this.length, > + v; // The value to be stringified. > + > +// For each value in this array... > + > + for (i = 0; i < l; i += 1) { > + v = this[i]; > + switch (typeof v) { > + case 'object': > + > +// Serialize a JavaScript object value. Treat objects thats lack the > +// toJSONString method as null. Due to a specification error in > ECMAScript, > +// typeof null is 'object', so watch out for that case. > + > + if (v && typeof v.toJSONString === 'function') { > + a.push(v.toJSONString(w)); > + } else { > + a.push('null'); > + } > + break; > + > + case 'string': > + case 'number': > + case 'boolean': > + a.push(v.toJSONString()); > + break; > + default: > + a.push('null'); > + } > + } > + > +// Join all of the member texts together and wrap them in brackets. > + > + return '[' + a.join(',') + ']'; > + }; > + > + > + Boolean.prototype.toJSONString = function () { > + return String(this); > + }; > + > + > + Date.prototype.toJSONString = function () { > + > +// Eventually, this method will be based on the date.toISOString method. > + > + function f(n) { > + > +// Format integers to have at least two digits. > + > + return n < 10 ? '0' + n : n; > + } > + > + return '"' + this.getUTCFullYear() + '-' + > + f(this.getUTCMonth() + 1) + '-' + > + f(this.getUTCDate()) + 'T' + > + f(this.getUTCHours()) + ':' + > + f(this.getUTCMinutes()) + ':' + > + f(this.getUTCSeconds()) + 'Z"'; > + }; > + > + > + Number.prototype.toJSONString = function () { > + > +// JSON numbers must be finite. Encode non-finite numbers as null. > + > + return isFinite(this) ? String(this) : 'null'; > + }; > + > + > + Object.prototype.toJSONString = function (w) { > + var a = [], // The array holding the partial texts. > + k, // The current key. > + i, // The loop counter. > + v; // The current value. > + > +// If a whitelist (array of keys) is provided, use it assemble the > components > +// of the object. > + > + if (w) { > + for (i = 0; i < w.length; i += 1) { > + k = w[i]; > + if (typeof k === 'string') { > + v = this[k]; > + switch (typeof v) { > + case 'object': > + > +// Serialize a JavaScript object value. Ignore objects that lack the > +// toJSONString method. Due to a specification error in ECMAScript, > +// typeof null is 'object', so watch out for that case. > + > + if (v) { > + if (typeof v.toJSONString === 'function') { > + a.push(k.toJSONString() + ':' + > + v.toJSONString(w)); > + } > + } else { > + a.push(k.toJSONString() + ':null'); > + } > + break; > + > + case 'string': > + case 'number': > + case 'boolean': > + a.push(k.toJSONString() + ':' + v.toJSONString > ()); > + > +// Values without a JSON representation are ignored. > + > + } > + } > + } > + } else { > + > +// Iterate through all of the keys in the object, ignoring the proto > chain > +// and keys that are not strings. > + > + for (k in this) { > + if (typeof k === 'string' && > + Object.prototype.hasOwnProperty.apply(this, [k])) > { > + v = this[k]; > + switch (typeof v) { > + case 'object': > + > +// Serialize a JavaScript object value. Ignore objects that lack the > +// toJSONString method. Due to a specification error in ECMAScript, > +// typeof null is 'object', so watch out for that case. > + > + if (v) { > + if (typeof v.toJSONString === 'function') { > + a.push(k.toJSONString() + ':' + > + v.toJSONString()); > + } > + } else { > + a.push(k.toJSONString() + ':null'); > + } > + break; > + > + case 'string': > + case 'number': > + case 'boolean': > + a.push(k.toJSONString() + ':' + v.toJSONString > ()); > + > +// Values without a JSON representation are ignored. > + > + } > + } > + } > + } > + > +// Join all of the member texts together and wrap them in braces. > + > + return '{' + a.join(',') + '}'; > + }; > + > + > + (function (s) { > + > +// Augment String.prototype. We do this in an immediate anonymous > function to > +// avoid defining global variables. > + > +// m is a table of character substitutions. > + > + var m = { > + '\b': '\\b', > + '\t': '\\t', > + '\n': '\\n', > + '\f': '\\f', > + '\r': '\\r', > + '"' : '\\"', > + '\\': '\\\\' > + }; > + > + > + s.parseJSON = function (filter) { > + var j; > + > + function walk(k, v) { > + var i, n; > + if (v && typeof v === 'object') { > + for (i in v) { > + if (Object.prototype.hasOwnProperty.apply(v, > [i])) { > + n = walk(i, v[i]); > + if (n !== undefined) { > + v[i] = n; > + } > + } > + } > + } > + return filter(k, v); > + } > + > + > +// Parsing happens in three stages. In the first stage, we run the text > against > +// a regular expression which looks for non-JSON characters. We are > especially > +// concerned with '()' and 'new' because they can cause invocation, and > '=' > +// because it can cause mutation. But just to be safe, we will reject all > +// unexpected characters. > + > +// We split the first stage into 4 regexp operations in order to work > around > +// crippling deficiencies in IE's and Safari's regexp engines. First we > replace > +// all backslash pairs with '@' (a non-JSON character). Second, we > replace all > +// simple value tokens with ']' characters. Third, we delete all open > brackets > +// that follow a colon or comma or that begin the text. Finally, we look > to see > +// that the remaining characters are only whitespace or ']' or ',' or ':' > or '{' > +// or '}'. If that is so, then the text is safe for eval. > + > + if (/^[\],:{}\s]*$/.test(this.replace(/\\./g, '@'). > + > replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, > ']'). > + replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { > + > +// In the second stage we use the eval function to compile the text into > a > +// JavaScript structure. The '{' operator is subject to a syntactic > ambiguity > +// in JavaScript: it can begin a block or an object literal. We wrap the > text > +// in parens to eliminate the ambiguity. > + > + j = eval('(' + this + ')'); > + > +// In the optional third stage, we recursively walk the new structure, > passing > +// each name/value pair to a filter function for possible transformation. > + > + return typeof filter === 'function' ? walk('', j) : j; > + } > + > +// If the text is not JSON parseable, then a SyntaxError is thrown. > + > + throw new SyntaxError('parseJSON'); > + }; > + > + > + s.toJSONString = function () { > + > +// If the string contains no control characters, no quote characters, and > no > +// backslash characters, then we can simply slap some quotes around it. > +// Otherwise we must also replace the offending characters with safe > +// sequences. > + > + if (/["\\\x00-\x1f]/.test(this)) { > + return '"' + this.replace(/[\x00-\x1f\\"]/g, function (a) > { > + var c = m[a]; > + if (c) { > + return c; > + } > + c = a.charCodeAt(); > + return '\\u00' + Math.floor(c / 16).toString(16) + > + (c % 16).toString(16); > + }) + '"'; > + } > + return '"' + this + '"'; > + }; > + })(String.prototype); > +} > \ No newline at end of file > > Added: incubator/shindig/trunk/php/key-modulo > URL: > http://svn.apache.org/viewvc/incubator/shindig/trunk/php/key-modulo?rev=606463&view=auto > > ============================================================================== > --- incubator/shindig/trunk/php/key-modulo (added) > +++ incubator/shindig/trunk/php/key-modulo Sat Dec 22 08:11:57 2007 > @@ -0,0 +1 @@ > +1004152471828278089 > \ No newline at end of file > > Added: incubator/shindig/trunk/php/key-private > URL: > http://svn.apache.org/viewvc/incubator/shindig/trunk/php/key-private?rev=606463&view=auto > > ============================================================================== > --- incubator/shindig/trunk/php/key-private (added) > +++ incubator/shindig/trunk/php/key-private Sat Dec 22 08:11:57 2007 > @@ -0,0 +1 @@ > +365146352663319971 > \ No newline at end of file > > Added: incubator/shindig/trunk/php/key-public > URL: > http://svn.apache.org/viewvc/incubator/shindig/trunk/php/key-public?rev=606463&view=auto > > ============================================================================== > --- incubator/shindig/trunk/php/key-public (added) > +++ incubator/shindig/trunk/php/key-public Sat Dec 22 08:11:57 2007 > @@ -0,0 +1 @@ > +11 > \ No newline at end of file > > Added: incubator/shindig/trunk/php/proxy.php > URL: > http://svn.apache.org/viewvc/incubator/shindig/trunk/php/proxy.php?rev=606463&view=auto > > ============================================================================== > --- incubator/shindig/trunk/php/proxy.php (added) > +++ incubator/shindig/trunk/php/proxy.php Sat Dec 22 08:11:57 2007 > @@ -0,0 +1,74 @@ > +<?php > +/* > + * Licensed under the Apache License, Version 2.0 (the "License"); > + * you may not use this file except in compliance with the License. > + * You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > +?><?php > +function errorPage($code, $message) { > + header("Status: $code"); > + header("Content-Type: text/plain"); > + echo $message; > +} > + > +error_log('----------------------------starting API > call-----------------------------------'); > +$op = $_POST['op']; > +if (!$op || $op == '') { > + //try from GET > + $op = $_GET['op']; > +} > + > +$appOrigin = $_POST['origin']; > +if (preg_match('@[\W]@', $appOrigin)) { > + errorPage(400, 'Bogus origin param'); > + return; > +} > + > +$curl = curl_init(); > + > +if ($op == 'proxy') { > + $url = $_GET['url']; > + curl_setopt($curl,CURLOPT_GET,true); > +} > +else if ($appOrigin){ > + $url = 'http://' . $appOrigin . XN_AtomHelper::$DOMAIN_SUFFIX . > '/gadgets/index/backendApi'; > + curl_setopt($curl,CURLOPT_POST,true); > + curl_setopt($curl,CURLOPT_POSTFIELDS,$_POST); > +} > +else { > + error_log("Bogus API call: $appOrigin -> $op"); > + return; > +} > + > +error_log('api: url=' . $url); > + > +curl_setopt($curl,CURLOPT_USERAGENT,"Mozilla/4.0 (Compatible; Shindig > Auth)"); > +curl_setopt($curl, CURLOPT_TIMEOUT, 30); > +curl_setopt($curl, CURLOPT_MAXREDIRS, 5); > +curl_setopt($curl,CURLOPT_URL,$url); > +ob_start(); > +$result = curl_exec($curl); > +if ($result == false) { > + $errno = curl_errno($curl); > + error_log("Error excuting api request $op $appOrigin $url : $errno"); > + header("HTTP/1.1 500 Error"); > + echo "Error executing request"; > +} > +$data = ob_get_contents(); > +ob_end_clean(); > + > +$retcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); > +curl_close($curl); > +header('Content-Type: text/plain'); > +echo $data; > +error_log('----------------------------END API > call-----------------------------------'); > + > +?> > > >

