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

Reply via email to