/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.script.js;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.apache.commons.lang.StringUtils;
import org.geotools.util.logging.Logging;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
import org.restlet.data.Form;
import org.restlet.data.Reference;
import org.restlet.data.Request;
import org.restlet.data.Response;
public class JsgiRequest extends ScriptableObject {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
static Logger LOGGER = Logging.getLogger("org.geoserver.script.js");
/**
* Generates a JavaScript object that conforms to the JSGI spec.
* http://wiki.commonjs.org/wiki/JSGI/Level0/A/Draft2
*
* @param request
* @param response
* @param cx
* @param scope
*/
public JsgiRequest(Request request, Response response, Context cx, Scriptable scope) {
super(scope, ScriptableObject.getObjectPrototype(scope));
Reference ref = request.getResourceRef();
this.put("method", this, request.getMethod().toString());
this.put("scriptName", this, ref.getLastSegment());
List<String> seg = new ArrayList<String>(ref.getSegments().subList(4, ref.getSegments().size()));
seg.add(0, "");
this.put("pathInfo", this, StringUtils.join(seg.toArray(), "/"));
this.put("queryString", this, ref.getQuery());
this.put("host", this, ref.getHostDomain());
this.put("port", this, ref.getHostPort());
this.put("scheme", this, ref.getScheme());
try {
// TODO: deal with input
this.put("input", this, Context.javaToJS(request.getEntity().getStream(), scope));
} catch (IOException e) {
LOGGER.warning(e.getMessage());
}
Scriptable headers = cx.newObject(scope);
Form requestHeaders = (Form) request.getAttributes().get("org.restlet.http.headers");
for (String name : requestHeaders.getNames()) {
String value = requestHeaders.getFirstValue(name, true);
headers.put(name.toLowerCase(), headers, value);
}
this.put("headers", this, headers);
// create jsgi object
Scriptable jsgiObject = cx.newObject(scope);
int readonly = ScriptableObject.PERMANENT | ScriptableObject.READONLY;
Scriptable version = cx.newArray(scope, new Object[] {Integer.valueOf(0), Integer.valueOf(3)});
ScriptableObject.defineProperty(jsgiObject, "version", version, readonly);
ScriptableObject.defineProperty(jsgiObject, "multithread", Boolean.TRUE, readonly);
ScriptableObject.defineProperty(jsgiObject, "multiprocess", Boolean.FALSE, readonly);
ScriptableObject.defineProperty(jsgiObject, "async", Boolean.TRUE, readonly);
ScriptableObject.defineProperty(jsgiObject, "runOnce", Boolean.FALSE, readonly);
ScriptableObject.defineProperty(jsgiObject, "cgi", Boolean.FALSE, readonly);
this.put("jsgi", this, jsgiObject);
// create env object
Scriptable env = cx.newObject(scope);
env.put("servletRequest", env, Context.javaToJS(request, scope));
env.put("servletResponse", env, Context.javaToJS(response, scope));
this.put("env", this, env);
}
@Override
public String getClassName() {
return "JsgiRequest";
}
}