Ick, this seems like a bad idea.  Wouldn't it be better to subclass this
servlet for Oracle instead?

--Chris

On 10/17/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
>
>   Revision 773 Author olabini Date 2007-10-17 11:20:11 -0400 (Wed, 17 Oct
> 2007) Log Message
>
> Don't save a dispatcher, and also implement UGLY workaround for Oracle
>
> Modified Paths
>
>    -
>    
> trunk/rails-integration/src/main/java/org/jruby/webapp/FileServlet.java<#115ae8dc77757435_trunkrailsintegrationsrcmainjavaorgjrubywebappFileServletjava>
>    -
>    
> trunk/rails-integration/src/main/java/org/jruby/webapp/RailsServlet.java<#115ae8dc77757435_trunkrailsintegrationsrcmainjavaorgjrubywebappRailsServletjava>
>
>  Diff Modified:
> trunk/rails-integration/src/main/java/org/jruby/webapp/FileServlet.java (772
> => 773)
>
> --- trunk/rails-integration/src/main/java/org/jruby/webapp/FileServlet.java   
> 2007-10-16 12:32:16 UTC (rev 772)
> +++ trunk/rails-integration/src/main/java/org/jruby/webapp/FileServlet.java   
> 2007-10-17 15:20:11 UTC (rev 773)
> @@ -1,321 +1,322 @@
> -package org.jruby.webapp;
> -
> -import org.jruby.webapp.util.FileUtil;
> -import javax.servlet.RequestDispatcher;
> -import javax.servlet.ServletContext;
> -import javax.servlet.ServletException;
> -import javax.servlet.http.HttpServlet;
> -import javax.servlet.http.HttpServletRequest;
> -import javax.servlet.http.HttpServletResponse;
> -import java.io.File;
> -import java.io.IOException;
> -import java.io.FileNotFoundException;
> -import java.io.OutputStream;
> -import java.io.FileInputStream;
> -import java.util.Calendar;
> -import java.util.Date;
> -import java.text.SimpleDateFormat;
> -import java.nio.channels.FileChannel;
> -import java.nio.ByteBuffer;
> -
> -/**
> - * This servlet returns a static file.
> - *
> - * @author Robert Egglestone
> - */
> -public class FileServlet extends HttpServlet {
> -
> -    private static final String METHOD_DELETE = "DELETE";
> -    private static final String METHOD_HEAD = "HEAD";
> -    private static final String METHOD_GET = "GET";
> -    private static final String METHOD_OPTIONS = "OPTIONS";
> -    private static final String METHOD_POST = "POST";
> -    private static final String METHOD_PUT = "PUT";
> -    private static final String METHOD_TRACE = "TRACE";
> -
> -     public static final String FALLBACK_SERVLET_PROPERTY = "files.default";
> -
> -     private static final String[] DEFAULT_WELCOME_FILES = {"index.html", 
> "index.htm"};
> -
> -     public final static String CACHE_CONTROL_HEADER = "Cache-Control";
> -     public final static String EXPIRES_HEADER = "Expires";
> -     public final static String DATE_HEADER = "Date";
> -
> -     private int bufferSize = 1024;
> -
> -     private File root;
> -
> -     private String prefix;
> -
> -     private boolean setCacheHeaders;
> -     private int maxAge;
> -
> -     /**
> -      * A servlet to pass control to if the file does not exist.
> -      */
> -     private RequestDispatcher defaultServletDispatcher;
> -
> -     /**
> -      * Initialize the servlet, and determine the webapp root.
> -      */
> -     public void init() throws ServletException {
> -             prefix = findPrefix();
> -             root = findRoot();
> -
> -             // determine the cache values
> -             setCacheHeaders = getServletConfig().getInitParameter("maxAge") 
> != null;
> -             if (setCacheHeaders) {
> -                     maxAge = 
> Integer.parseInt(getServletConfig().getInitParameter("maxAge"));
> -             }
> -
> -             // check for default fallback servlet
> -             ServletContext context = getServletContext();
> -             String defaultServletName = 
> getServletConfig().getInitParameter("defaultServlet");
> -             if (defaultServletName == null) {
> -                     defaultServletName = 
> context.getInitParameter(FileServlet.FALLBACK_SERVLET_PROPERTY);
> -             }
> -             if (defaultServletName != null && defaultServletName.length() 
> != 0) {
> -                     defaultServletDispatcher = 
> context.getNamedDispatcher(defaultServletName);
> -             }
> -     }
> -
> -     /**
> -      * A prefix to prepend on the path when translating from URL to file 
> location, typically "/public".
> -      */
> -     protected String findPrefix() {
> -             String prefix = 
> getServletContext().getInitParameter("files.prefix");
> -             if (prefix == null) prefix = "/public";
> -             // prefix must start with a slash if it's specified
> -             if (prefix.length() > 0 && !prefix.startsWith("/")) {
> -                     prefix = "/" + prefix;
> -             }
> -             return prefix;
> -     }
> -
> -     /**
> -      * Root of the webapp, may be null in which case it is determined from 
> the servlet api.
> -      * The root should be an absolute path that refers to a directory.
> -      */
> -     protected File findRoot() throws ServletException {
> -             String rootPath = 
> getServletContext().getInitParameter("files.root");
> -             if (rootPath == null) {
> -                     rootPath = FileUtil.getPath(getServletContext(), "/");
> -             }
> -
> -             File root = new File(rootPath);
> -             if (!root.isDirectory()) {
> -                     throw new ServletException("Webapp root does not point 
> to a directory");
> -             }
> -
> -             return root;
> -     }
> -
> -     public String[] getWelcomeFiles() {
> -             String[] welcomeFiles;
> -
> -             String welcomeFilesString = 
> getServletContext().getInitParameter("files.welcome");
> -             if (welcomeFilesString != null) {
> -                     welcomeFiles = parseCommaList(welcomeFilesString);
> -             } else {
> -                     welcomeFiles = DEFAULT_WELCOME_FILES;
> -             }
> -
> -             return welcomeFiles;
> -     }
> -
> -     private String[] parseCommaList(String commaList) {
> -             String[] parts = commaList.split(",");
> -             for(int i=0; i<parts.length; i++) {
> -                     parts[i] = parts[i].trim();
> -             }
> -             return parts;
> -     }
> -
> -     /**
> -      * Look for a file matching the request.
> -      */
> -     protected File getFile(HttpServletRequest request) {
> -             // find the location of the file
> -             String contextPath = request.getContextPath();
> -             String relativePath = 
> request.getRequestURI().substring(contextPath.length());
> -
> -             // normalize the path
> -             relativePath = relativePath.replaceAll("\\\\", 
> "/").replaceAll("//", "/");
> -
> -             // determine the file path to check for
> -             String filePath;
> -             if (root == null) {
> -                     filePath = prefix + relativePath;
> -             } else {
> -                     filePath = root.getAbsolutePath() + prefix + 
> relativePath;
> -             }
> -
> -             return getFile(filePath);
> -     }
> -
> -     /**
> -      * Look for a file matching the specified path.
> -      * This should also check default extensions, and for index files in 
> the case of a directory.
> -      */
> -     protected File getFile(String filePath) {
> -             // try the exact match
> -             File fileLocation = getExactFile(filePath);
> -             if (fileLocation != null) return fileLocation;
> -
> -             // try default extension
> -             fileLocation = getExactFile(filePath + ".html");
> -             if (fileLocation != null) return fileLocation;
> -
> -             // try welcome files
> -             String[] welcomeFiles = getWelcomeFiles();
> -             for (int i = 0; i < welcomeFiles.length; i++) {
> -
> -                     fileLocation = getExactFile(filePath + "/" + 
> welcomeFiles[i]);
> -                     if (fileLocation != null) return fileLocation;
> -             }
> -
> -             // no match was found
> -             return null;
> -     }
> -
> -     /**
> -      * Look for a file with this exact path.
> -      */
> -     protected File getExactFile(String path) {
> -             // try to load the resource
> -             File filePath = new File(path);
> -             if (!filePath.isFile()) return null;
> -             return filePath;
> -     }
> -
> -     private String formatDateForHeader(Date date) {
> -       String safari3OnlyAccessThisStyleDataFormat = "EEE, d MMM yyyy 
> HH:mm:ss z";
> -       return new 
> SimpleDateFormat(safari3OnlyAccessThisStyleDataFormat).format(date);
> -     }
> -
> -     /**
> -      * Transfer the file.
> -      */
> -     protected void service(HttpServletRequest request, HttpServletResponse 
> response) throws ServletException, IOException {
> -             try {
> -                     // check the file and open it
> -                     File fileLocation = getFile(request);
> -                     if (fileLocation != null) {
> -                             // file was found, all good
> -                     } else if (defaultServletDispatcher != null) {
> -                             // forward request to the default servlet
> -                             defaultServletDispatcher.forward(request, 
> response);
> -                             return;
> -                     } else {
> -                             // file not found
> -                             log("File not found: " + 
> request.getRequestURI());
> -                             throw new 
> FileNotFoundException(request.getRequestURI());
> -                     }
> -
> -                     // check for modifications
> -                     long ifModifiedSince = 
> request.getDateHeader("If-Modified-Since");
> -                     if (ifModifiedSince != -1) {
> -                             long lastModified = fileLocation.lastModified();
> -                             if (lastModified == 0) {
> -                                     // last modified date is not known
> -                             } else if (lastModified < ifModifiedSince) {
> -                                     throw new NotModifiedException();
> -                             } else {
> -                                     response.setDateHeader("Last-Modified", 
> lastModified);
> -                             }
> -                     }
> -
> -                     // set cache headers
> -                     if (setCacheHeaders) {
> -                             response.setHeader(CACHE_CONTROL_HEADER, 
> "max-age=" + maxAge);
> -                             Calendar now = Calendar.getInstance();
> -                             response.setHeader(DATE_HEADER, 
> formatDateForHeader(now.getTime()));
> -                             now.add(Calendar.SECOND, maxAge);
> -                             response.setHeader(EXPIRES_HEADER, 
> formatDateForHeader(now.getTime()));
> -                     }
> -
> -                     // set the content type
> -                     String contentType = 
> guessContentTypeFromName(fileLocation.getName());
> -                     response.setContentType(contentType);
> -
> -                     if (request.getMethod().equals(METHOD_HEAD)) {
> -                             // head requests don't send the body
> -                     } else if (request.getMethod().equals(METHOD_GET) || 
> request.getMethod().equals(METHOD_POST)) {
> -                             // transfer the content
> -                             sendFile(fileLocation, response);
> -                     } else {
> -                             // anything else cannot be processed on the file
> -                             // alternatively we could forward to rails, but 
> this
> -                             // approach is probably more consistent with 
> other web servers
> -                             
> response.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
> -                     }
> -
> -             } catch (NotModifiedException e) {
> -                     response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
> -             } catch (FileNotFoundException e) {
> -                     response.sendError(HttpServletResponse.SC_NOT_FOUND);
> -             } catch (IOException e) {
> -                     
> response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 
> e.getMessage());
> -             }
> -     }
> -
> -     /**
> -      * Send the file, faster, but requires the file is accessible on the 
> file system.
> -      */
> -     private void sendFile(File file, HttpServletResponse response) throws 
> IOException {
> -             // setup IO streams
> -             ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
> -             FileChannel in = null;
> -             try {
> -                     in = new FileInputStream(file).getChannel();
> -
> -                     // start returning the response
> -                     OutputStream out = response.getOutputStream();
> -
> -                     // read the bytes, returning them in the response
> -                     while (in.read(buffer) != -1) {
> -                             out.write(buffer.array(), 0, buffer.position());
> -                             buffer.clear();
> -                     }
> -                     out.close();
> -             } finally {
> -                     try {
> -                             if (in != null) in.close();
> -                     } catch (IOException ignore) {
> -                     }
> -             }
> -     }
> -
> -     /**
> -      * Return the content-type the would be returned for this file name.
> -      */
> -     public String guessContentTypeFromName(String fileName) {
> -             // quick hack for types that are necessary, but not handled
> -             String lowerName = fileName.toLowerCase();
> -             if (lowerName.endsWith(".css")) {
> -                     return "text/css";
> -             } else if (lowerName.endsWith(".js")) {
> -                     return "text/js";
> -             }
> -        try {
> -            // everything else
> -            javax.activation.FileTypeMap typeMap =
> -                javax.activation.FileTypeMap.getDefaultFileTypeMap();
> -            return typeMap.getContentType(fileName);
> -        } catch (Throwable t) {
> -            // allow activation.jar to be missing
> -            return "application/octet-stream";
> -        }
> -     }
> -
> -     /**
> -      * An exception when the source object has not been modified. While this
> -      * condition is not a failure, it is a break from the normal flow of
> -      * execution.
> -      */
> -     private static class NotModifiedException extends IOException {
> -             public NotModifiedException() {
> -             }
> -     }
> -
> -}
> +package org.jruby.webapp;
> +
> +import org.jruby.webapp.util.FileUtil;
> +import javax.servlet.RequestDispatcher;
> +import javax.servlet.ServletContext;
> +import javax.servlet.ServletException;
> +import javax.servlet.http.HttpServlet;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +import java.io.File;
> +import java.io.IOException;
> +import java.io.FileNotFoundException;
> +import java.io.OutputStream;
> +import java.io.FileInputStream;
> +import java.util.Calendar;
> +import java.util.Date;
> +import java.text.SimpleDateFormat;
> +import java.nio.channels.FileChannel;
> +import java.nio.ByteBuffer;
> +
> +/**
> + * This servlet returns a static file.
> + *
> + * @author Robert Egglestone
> + */
> +public class FileServlet extends HttpServlet {
> +
> +    private static final String METHOD_DELETE = "DELETE";
> +    private static final String METHOD_HEAD = "HEAD";
> +    private static final String METHOD_GET = "GET";
> +    private static final String METHOD_OPTIONS = "OPTIONS";
> +    private static final String METHOD_POST = "POST";
> +    private static final String METHOD_PUT = "PUT";
> +    private static final String METHOD_TRACE = "TRACE";
> +
> +     public static final String FALLBACK_SERVLET_PROPERTY = "files.default";
> +
> +     private static final String[] DEFAULT_WELCOME_FILES = {"index.html", 
> "index.htm"};
> +
> +     public final static String CACHE_CONTROL_HEADER = "Cache-Control";
> +     public final static String EXPIRES_HEADER = "Expires";
> +     public final static String DATE_HEADER = "Date";
> +
> +     private int bufferSize = 1024;
> +
> +     private File root;
> +
> +     private String prefix;
> +
> +     private boolean setCacheHeaders;
> +     private int maxAge;
> +
> +     /**
> +      * A servlet to pass control to if the file does not exist.
> +      */
> +
> +    private String defaultServletDispatcherName;
> +
> +     /**
> +      * Initialize the servlet, and determine the webapp root.
> +      */
> +     public void init() throws ServletException {
> +             prefix = findPrefix();
> +             root = findRoot();
> +
> +             // determine the cache values
> +             setCacheHeaders = getServletConfig().getInitParameter("maxAge") 
> != null;
> +             if (setCacheHeaders) {
> +                     maxAge = 
> Integer.parseInt(getServletConfig().getInitParameter("maxAge"));
> +             }
> +
> +             // check for default fallback servlet
> +             ServletContext context = getServletContext();
> +             String defaultServletName = 
> getServletConfig().getInitParameter("defaultServlet");
> +             if (defaultServletName == null) {
> +                     defaultServletName = 
> context.getInitParameter(FileServlet.FALLBACK_SERVLET_PROPERTY);
> +             }
> +             if (defaultServletName != null && defaultServletName.length() 
> != 0) {
> +            defaultServletDispatcherName = defaultServletName;
> +             }
> +     }
> +
> +     /**
> +      * A prefix to prepend on the path when translating from URL to file 
> location, typically "/public".
> +      */
> +     protected String findPrefix() {
> +             String prefix = 
> getServletContext().getInitParameter("files.prefix");
> +             if (prefix == null) prefix = "/public";
> +             // prefix must start with a slash if it's specified
> +             if (prefix.length() > 0 && !prefix.startsWith("/")) {
> +                     prefix = "/" + prefix;
> +             }
> +             return prefix;
> +     }
> +
> +     /**
> +      * Root of the webapp, may be null in which case it is determined from 
> the servlet api.
> +      * The root should be an absolute path that refers to a directory.
> +      */
> +     protected File findRoot() throws ServletException {
> +             String rootPath = 
> getServletContext().getInitParameter("files.root");
> +             if (rootPath == null) {
> +                     rootPath = FileUtil.getPath(getServletContext(), "/");
> +             }
> +
> +             File root = new File(rootPath);
> +             if (!root.isDirectory()) {
> +                     throw new ServletException("Webapp root does not point 
> to a directory");
> +             }
> +
> +             return root;
> +     }
> +
> +     public String[] getWelcomeFiles() {
> +             String[] welcomeFiles;
> +
> +             String welcomeFilesString = 
> getServletContext().getInitParameter("files.welcome");
> +             if (welcomeFilesString != null) {
> +                     welcomeFiles = parseCommaList(welcomeFilesString);
> +             } else {
> +                     welcomeFiles = DEFAULT_WELCOME_FILES;
> +             }
> +
> +             return welcomeFiles;
> +     }
> +
> +     private String[] parseCommaList(String commaList) {
> +             String[] parts = commaList.split(",");
> +             for(int i=0; i<parts.length; i++) {
> +                     parts[i] = parts[i].trim();
> +             }
> +             return parts;
> +     }
> +
> +     /**
> +      * Look for a file matching the request.
> +      */
> +     protected File getFile(HttpServletRequest request) {
> +             // find the location of the file
> +             String contextPath = request.getContextPath();
> +             String relativePath = 
> request.getRequestURI().substring(contextPath.length());
> +
> +             // normalize the path
> +             relativePath = relativePath.replaceAll("\\\\", 
> "/").replaceAll("//", "/");
> +
> +             // determine the file path to check for
> +             String filePath;
> +             if (root == null) {
> +                     filePath = prefix + relativePath;
> +             } else {
> +                     filePath = root.getAbsolutePath() + prefix + 
> relativePath;
> +             }
> +
> +             return getFile(filePath);
> +     }
> +
> +     /**
> +      * Look for a file matching the specified path.
> +      * This should also check default extensions, and for index files in 
> the case of a directory.
> +      */
> +     protected File getFile(String filePath) {
> +             // try the exact match
> +             File fileLocation = getExactFile(filePath);
> +             if (fileLocation != null) return fileLocation;
> +
> +             // try default extension
> +             fileLocation = getExactFile(filePath + ".html");
> +             if (fileLocation != null) return fileLocation;
> +
> +             // try welcome files
> +             String[] welcomeFiles = getWelcomeFiles();
> +             for (int i = 0; i < welcomeFiles.length; i++) {
> +
> +                     fileLocation = getExactFile(filePath + "/" + 
> welcomeFiles[i]);
> +                     if (fileLocation != null) return fileLocation;
> +             }
> +
> +             // no match was found
> +             return null;
> +     }
> +
> +     /**
> +      * Look for a file with this exact path.
> +      */
> +     protected File getExactFile(String path) {
> +             // try to load the resource
> +             File filePath = new File(path);
> +             if (!filePath.isFile()) return null;
> +             return filePath;
> +     }
> +
> +     private String formatDateForHeader(Date date) {
> +       String safari3OnlyAccessThisStyleDataFormat = "EEE, d MMM yyyy 
> HH:mm:ss z";
> +       return new 
> SimpleDateFormat(safari3OnlyAccessThisStyleDataFormat).format(date);
> +     }
> +
> +     /**
> +      * Transfer the file.
> +      */
> +     protected void service(HttpServletRequest request, HttpServletResponse 
> response) throws ServletException, IOException {
> +             try {
> +                     // check the file and open it
> +                     File fileLocation = getFile(request);
> +                     if (fileLocation != null) {
> +                             // file was found, all good
> +                     } else if (defaultServletDispatcherName != null) {
> +                             // forward request to the default servlet
> +                
> getServletContext().getNamedDispatcher(defaultServletDispatcherName).forward(request,
>  response);
> +                             return;
> +                     } else {
> +                             // file not found
> +                             log("File not found: " + 
> request.getRequestURI());
> +                             throw new 
> FileNotFoundException(request.getRequestURI());
> +                     }
> +
> +                     // check for modifications
> +                     long ifModifiedSince = 
> request.getDateHeader("If-Modified-Since");
> +                     if (ifModifiedSince != -1) {
> +                             long lastModified = fileLocation.lastModified();
> +                             if (lastModified == 0) {
> +                                     // last modified date is not known
> +                             } else if (lastModified < ifModifiedSince) {
> +                                     throw new NotModifiedException();
> +                             } else {
> +                                     response.setDateHeader("Last-Modified", 
> lastModified);
> +                             }
> +                     }
> +
> +                     // set cache headers
> +                     if (setCacheHeaders) {
> +                             response.setHeader(CACHE_CONTROL_HEADER, 
> "max-age=" + maxAge);
> +                             Calendar now = Calendar.getInstance();
> +                             response.setHeader(DATE_HEADER, 
> formatDateForHeader(now.getTime()));
> +                             now.add(Calendar.SECOND, maxAge);
> +                             response.setHeader(EXPIRES_HEADER, 
> formatDateForHeader(now.getTime()));
> +                     }
> +
> +                     // set the content type
> +                     String contentType = 
> guessContentTypeFromName(fileLocation.getName());
> +                     response.setContentType(contentType);
> +
> +                     if (request.getMethod().equals(METHOD_HEAD)) {
> +                             // head requests don't send the body
> +                     } else if (request.getMethod().equals(METHOD_GET) || 
> request.getMethod().equals(METHOD_POST)) {
> +                             // transfer the content
> +                             sendFile(fileLocation, response);
> +                     } else {
> +                             // anything else cannot be processed on the file
> +                             // alternatively we could forward to rails, but 
> this
> +                             // approach is probably more consistent with 
> other web servers
> +                             
> response.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
> +                     }
> +
> +             } catch (NotModifiedException e) {
> +                     response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
> +             } catch (FileNotFoundException e) {
> +                     response.sendError(HttpServletResponse.SC_NOT_FOUND);
> +             } catch (IOException e) {
> +                     
> response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 
> e.getMessage());
> +             }
> +     }
> +
> +     /**
> +      * Send the file, faster, but requires the file is accessible on the 
> file system.
> +      */
> +     private void sendFile(File file, HttpServletResponse response) throws 
> IOException {
> +             // setup IO streams
> +             ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
> +             FileChannel in = null;
> +             try {
> +                     in = new FileInputStream(file).getChannel();
> +
> +                     // start returning the response
> +                     OutputStream out = response.getOutputStream();
> +
> +                     // read the bytes, returning them in the response
> +                     while (in.read(buffer) != -1) {
> +                             out.write(buffer.array(), 0, buffer.position());
> +                             buffer.clear();
> +                     }
> +                     out.close();
> +             } finally {
> +                     try {
> +                             if (in != null) in.close();
> +                     } catch (IOException ignore) {
> +                     }
> +             }
> +     }
> +
> +     /**
> +      * Return the content-type the would be returned for this file name.
> +      */
> +     public String guessContentTypeFromName(String fileName) {
> +             // quick hack for types that are necessary, but not handled
> +             String lowerName = fileName.toLowerCase();
> +             if (lowerName.endsWith(".css")) {
> +                     return "text/css";
> +             } else if (lowerName.endsWith(".js")) {
> +                     return "text/js";
> +             }
> +        try {
> +            // everything else
> +            javax.activation.FileTypeMap typeMap =
> +                javax.activation.FileTypeMap.getDefaultFileTypeMap();
> +            return typeMap.getContentType(fileName);
> +        } catch (Throwable t) {
> +            // allow activation.jar to be missing
> +            return "application/octet-stream";
> +        }
> +     }
> +
> +     /**
> +      * An exception when the source object has not been modified. While this
> +      * condition is not a failure, it is a break from the normal flow of
> +      * execution.
> +      */
> +     private static class NotModifiedException extends IOException {
> +             public NotModifiedException() {
> +             }
> +     }
> +
> +}
>
>  Modified:
> trunk/rails-integration/src/main/java/org/jruby/webapp/RailsServlet.java
> (772 => 773)
>
> --- trunk/rails-integration/src/main/java/org/jruby/webapp/RailsServlet.java  
> 2007-10-16 12:32:16 UTC (rev 772)
> +++ trunk/rails-integration/src/main/java/org/jruby/webapp/RailsServlet.java  
> 2007-10-17 15:20:11 UTC (rev 773)
> @@ -110,12 +110,42 @@
>               return cgiClass.newInstance(cgiArgs, Block.NULL_BLOCK);
>       }
>
> +    /*
> +     * This ugly hack is because Oracle servlets doesn't handle URIs like
> +     * /people;browse correctly. We need to add this manually.
> +     */
> +    private String addMissingSemiColonParameterForOracle(String 
> requestUriBefore, HttpServletRequest request) {
> +        try {
> +            java.lang.reflect.Field reqField = 
> request.getClass().getField("requestURI");
> +            Object reqData = reqField.get(request);
> +            byte[] data = 
> (byte[])reqData.getClass().getField("data").get(reqData);
> +            int offset = 
> reqData.getClass().getField("offset").getInt(reqData);
> +            int length = 
> reqData.getClass().getField("length").getInt(reqData);
> +
> +            int p = offset+length;
> +            int len = data.length;
> +            if(p < len && data[p++] == ';') {
> +                int start = p;
> +                // Delimited by either ? or a space - possibly not a 100% 
> safe
> +                while(p < len && data[p] != '?' && data[p] != ' ') {
> +                    p++;
> +                }
> +                return requestUriBefore + ";" + new String(data, start, 
> p-start);
> +            }
> +        } catch(Throwable e) {}
> +        return requestUriBefore;
> +    }
> +
>       protected void setupEnvironment(Ruby runtime, HttpServletRequest 
> request) {
>               RubyHash env = (RubyHash)runtime.getObject().getConstant("ENV");
>
>               String requestUri = chomp(request.getRequestURI(), "/");
>               if (requestUri.length() == 0) requestUri = "/";
>
> +        
> if(request.getClass().getName().indexOf("EvermindHttpServletRequest") != -1) {
> +            requestUri = addMissingSemiColonParameterForOracle(requestUri, 
> request);
> +        }
> +
>               // RFC3875 The Common Gateway Interface (CGI) Version 1.1
>               setEnv(env, "AUTH_TYPE", request.getAuthType());
>               if (request.getContentLength() != -1) {
>
>
> _______________________________________________
> Jruby-extras-devel mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/jruby-extras-devel
>
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to