| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| dojo.provide("dojo.io.RhinoIO"); |
| |
| dojo.require("dojo.io.common"); |
| dojo.require("dojo.lang.func"); |
| dojo.require("dojo.lang.array"); |
| dojo.require("dojo.string.extras"); |
| |
| dojo.io.RhinoHTTPTransport = new function(){ |
| this.canHandle = function(/*dojo.io.Request*/req){ |
| //summary: Tells dojo.io.bind() if this is a good transport to |
| //use for the particular type of request. This type of transport can |
| //only be used inside the Rhino JavaScript engine. |
| |
| // We have to limit to text types because Rhino doesnt support |
| // a W3C dom implementation out of the box. In the future we |
| // should provide some kind of hook to inject your own, because |
| // in all my projects I use XML for Script to provide a W3C DOM. |
| if(dojo.lang.find(["text/plain", "text/html", "text/xml", "text/javascript", "text/json", "application/json"], |
| (req.mimetype.toLowerCase() || "")) < 0){ |
| return false; |
| } |
| |
| // We only handle http requests! Unfortunately, because the method is |
| // protected, I can't directly create a java.net.HttpURLConnection, so |
| // this is the only way to test. |
| if(req.url.substr(0, 7) != "http://"){ |
| return false; |
| } |
| |
| return true; |
| } |
| |
| function doLoad(req, conn){ |
| var ret; |
| if (req.method.toLowerCase() == "head"){ |
| // TODO: return the headers |
| }else{ |
| var stream = conn.getContent(); |
| var reader = new java.io.BufferedReader(new java.io.InputStreamReader(stream)); |
| |
| // read line-by-line because why not? |
| var text = ""; |
| var line = null; |
| while((line = reader.readLine()) != null){ |
| text += line; |
| } |
| |
| if(req.mimetype == "text/javascript"){ |
| try{ |
| ret = dj_eval(text); |
| }catch(e){ |
| dojo.debug(e); |
| dojo.debug(text); |
| ret = null; |
| } |
| }else if(req.mimetype == "text/json" || req.mimetype == "application/json"){ |
| try{ |
| ret = dj_eval("("+text+")"); |
| }catch(e){ |
| dojo.debug(e); |
| dojo.debug(text); |
| ret = false; |
| } |
| }else{ |
| ret = text; |
| } |
| } |
| |
| req.load("load", ret, req); |
| } |
| |
| function connect(req){ |
| var content = req.content || {}; |
| var query; |
| |
| if (req.sendTransport){ |
| content["dojo.transport"] = "rhinohttp"; |
| } |
| |
| if(req.postContent){ |
| query = req.postContent; |
| }else{ |
| query = dojo.io.argsFromMap(content, req.encoding); |
| } |
| |
| var url_text = req.url; |
| if(req.method.toLowerCase() == "get" && query != ""){ |
| url_text = url_text + "?" + query; |
| } |
| |
| var url = new java.net.URL(url_text); |
| var conn = url.openConnection(); |
| |
| // |
| // configure the connection |
| // |
| |
| conn.setRequestMethod(req.method.toUpperCase()); |
| |
| if(req.headers){ |
| for(var header in req.headers){ |
| if(header.toLowerCase() == "content-type" && !req.contentType){ |
| req.contentType = req.headers[header]; |
| }else{ |
| conn.setRequestProperty(header, req.headers[header]); |
| } |
| } |
| } |
| if(req.contentType){ |
| conn.setRequestProperty("Content-Type", req.contentType); |
| } |
| |
| if(req.method.toLowerCase() == "post"){ |
| conn.setDoOutput(true); |
| |
| // write the post data |
| var output_stream = conn.getOutputStream(); |
| var byte_array = (new java.lang.String(query)).getBytes(); |
| output_stream.write(byte_array, 0, byte_array.length); |
| } |
| |
| // do it to it! |
| conn.connect(); |
| |
| // perform the load |
| doLoad(req, conn); |
| } |
| |
| this.bind = function(req){ |
| //summary: function that sends the request to the server. |
| |
| //The following are acceptable properties in kwArgs (in addition to the |
| //normal dojo.io.Request object properties). |
| //url: String: URL the server URL to use for the request. |
| //method: String: the HTTP method to use (GET, POST, etc...). |
| //mimetype: Specifies what format the result data should be given to the load/handle callback. Values of |
| // text/javascript, text/json, and application/json will cause the transport |
| // to evaluate the response as JavaScript/JSON. Any other mimetype will give back a text |
| // string. |
| //transport: String: specify "RhinoHTTPTransport" to force the use of this transport. |
| //sync: boolean: if true, then a synchronous XMLHttpRequest call is done, |
| // if false (the default), then an asynchronous call is used. |
| //headers: Object: The object property names and values will be sent as HTTP request header |
| // names and values. |
| //encoding: String: The type of encoding to use when dealing with the content kwArgs property. |
| //content: Object: The content object is converted into a name=value&name=value string, by |
| // using dojo.io.argsFromMap(). The encoding kwArgs property is passed to dojo.io.argsFromMap() |
| // for use in encoding the names and values. The resulting string is added to the request. |
| //postContent: String: Raw name=value&name=value string to be included as part of the request. |
| |
| var async = req["sync"] ? false : true; |
| if (async){ |
| setTimeout(dojo.lang.hitch(this, function(){ |
| connect(req); |
| }), 1); |
| } else { |
| connect(req); |
| } |
| } |
| |
| dojo.io.transports.addTransport("RhinoHTTPTransport"); |
| } |