You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by br...@apache.org on 2007/12/22 17:11:58 UTC
svn commit: r606463 [5/5] - in /incubator/shindig/trunk/php: ./ js/
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-----------------------------------');
+
+?>
Re: svn commit: r606463 [5/5] - in /incubator/shindig/trunk/php: ./ js/
Posted by Brian McCallister <br...@skife.org>.
On Dec 22, 2007, at 10:17 AM, Kevin Brown wrote:
> 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?
Totally agree. Getting this stuff working with the js in javascript/
is a big todo item.
-Brian
>
>
> On Dec 22, 2007 8:11 AM, <br...@apache.org> 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-----------------------------------');
>> +
>> +?>
>>
>>
>>
Re: svn commit: r606463 [5/5] - in /incubator/shindig/trunk/php: ./ js/
Posted by Kevin Brown <et...@google.com>.
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, <br...@apache.org> 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-----------------------------------');
> +
> +?>
>
>
>