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-----------------------------------');
> +
> +?>
>
>
>