package org.exquery.ns; import java.io.*; import java.util.*; import javax.servlet.http.*; import org.basex.http.*; import org.basex.query.*; import org.basex.query.value.*; import org.basex.query.value.item.*; import org.basex.query.value.seq.*; import org.basex.util.hash.*; import org.basex.util.list.*; /** * This module contains functions for handling servlet requests. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ public final class Request extends QueryModule { /** * Returns the method of a request. * @return method * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str method() throws QueryException { return Str.get(request().getMethod()); } /** * Returns the Scheme component of a request. * @return scheme * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str scheme() throws QueryException { return Str.get(request().getScheme()); } /** * Returns the Hostname fragment of a request. * @return host name * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str hostname() throws QueryException { return Str.get(request().getServerName()); } /** * Returns the Port fragment of a request. * @return port * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Int port() throws QueryException { return Int.get(request().getServerPort()); } /** * Returns the path of the request. * @return path * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str path() throws QueryException { return Str.get(request().getRequestURI()); } /** * Returns the query string of a request. * @return query string * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str query() throws QueryException { final String query = request().getQueryString(); return query == null ? null : Str.get(query); } /** * Returns the URI of a request. * @return URI * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Uri uri() throws QueryException { return Uri.uri(request().getRequestURL().toString()); } /** * Returns the context path of a request. * @return context path * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str contextPath() throws QueryException { return Str.get(request().getContextPath()); } /** * Returns the address of a request. * @return address * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str address() throws QueryException { return Str.get(request().getLocalAddr()); } /** * Returns the remote host name of a request. * @return host name * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str remoteHostname() throws QueryException { return Str.get(request().getRemoteHost()); } /** * Returns the remote address of a request. * @return remote address * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str remoteAddress() throws QueryException { return Str.get(request().getRemoteAddr()); } /** * Returns the remote port of a request. * @return remote port * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Int remotePort() throws QueryException { return Int.get(request().getRemotePort()); } /** * Returns the names of all query parameters. * @return parameter names * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Value parameterNames() throws QueryException { try { final HTTPParams params = connection().params; final TokenSet cache = new TokenSet(); for(final String name : params.query().keySet()) cache.add(name); for(final String name : params.form(queryContext.context.options).keySet()) cache.add(name); final TokenList names = new TokenList(cache.size()); for(final byte[] name : cache) names.add(name); return StrSeq.get(names); } catch(final IOException ex) { throw new QueryException(ex); } } /** * Returns the value of a specific query parameter. * @param key key to be requested * @return parameter value * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Value parameter(final Str key) throws QueryException { return parameter(key, null); } /** * Returns the value of a specific query parameter. * @param key key to be requested * @param def default value * @return parameter value * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Value parameter(final Str key, final Value def) throws QueryException { try { final String name = key.toJava(); final HTTPParams params = connection().params; final Value query = params.query().get(name); final Value form = params.form(queryContext.context.options).get(name); if(query == null && form == null) return def; if(query == null) return form; if(form == null) return query; return new ValueBuilder().add(query).add(form).value(); } catch(final IOException ex) { throw new QueryException(ex); } } /** * Returns the names of all header parameters. * @return parameter names * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Value headerNames() throws QueryException { final TokenList tl = new TokenList(); final Enumeration<String> en = request().getHeaderNames(); while(en.hasMoreElements()) { tl.add(en.nextElement()); } return StrSeq.get(tl); } /** * Returns the value of a specific header parameter. * @param key key to be requested * @return parameter value * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str header(final Str key) throws QueryException { return header(key, null); } /** * Returns the value of a specific header parameter. * @param key key to be requested * @param def default value * @return parameter value * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str header(final Str key, final Str def) throws QueryException { final String val = request().getHeader(key.toJava()); return val == null ? def : Str.get(val); } /** * Returns all cookie names. * @return parameter names * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Value cookieNames() throws QueryException { final TokenList tl = new TokenList(); for(final Cookie c : request().getCookies()) tl.add(c.getName()); return StrSeq.get(tl); } /** * Returns the value of a specific cookie. * @param key key to be requested * @return parameter value * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str cookie(final Str key) throws QueryException { return cookie(key, null); } /** * Returns the value of a specific cookie. * @param key key to be requested * @param def default value * @return parameter value * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str cookie(final Str key, final Str def) throws QueryException { final String k = key.toJava(); for(final Cookie c : request().getCookies()) { if(c.getName().equals(k)) return Str.get(c.getValue()); } return def; } /** * Returns the value of a specific attribute. * @param key key to be requested * @return attribute value * @throws QueryException query exception */ @Deterministic @Requires(Permission.NONE) public Str attribute(final Str key) throws QueryException { final Object query = request().getAttribute(key.toJava()); return query == null ? null : Str.get(query.toString()); } // PRIVATE FUNCTIONS ============================================================================ /** * Returns the servlet request instance. * @return request * @throws QueryException query exception */ private HttpServletRequest request() throws QueryException { return connection().req; } /** * Returns the current HTTP connection. * @return HTTP connection * @throws QueryException query exception */ private HTTPConnection connection() throws QueryException { if(queryContext.http != null) return (HTTPConnection) queryContext.http; throw new QueryException("required."); } }