/** * Service. */ public override void service(HttpServletRequest request, HttpServletResponse response) { Env env = null; WriteStream ws = null; QuercusHttpServletRequest req = new QuercusHttpServletRequestImpl(request); QuercusHttpServletResponse res = new QuercusHttpServletResponseImpl(response); try { string path = getPath(req); QuercusPage page; try { page = getQuercus().parse(path); } catch (FileNotFoundException e) { // php/2001 log.log(Level.FINER, e.ToString(), e); response.sendError(HttpServletResponse.SC_NOT_FOUND); return; } ws = openWrite(response); // php/2002 // for non-Resin containers // for servlet filters that do post-request work after Quercus ws.setDisableCloseSource(true); // php/6006 ws.setNewlineString("\n"); QuercusContext quercus = getQuercus(); env = quercus.createEnv(page, ws, req, res); // php/815d env.setPwd(path.getParent()); quercus.setServletContext(new QuercusServletContextImpl(_servletContext)); try { env.start(); // php/2030, php/2032, php/2033 // Jetty hides server classes from web-app // http://docs.codehaus.org/display/JETTY/Classloading // // env.setGlobalValue("request", env.wrapJava(request)); // env.setGlobalValue("response", env.wrapJava(response)); // env.setGlobalValue("servletContext", env.wrapJava(_servletContext)); StringValue prepend = quercus.getIniValue("auto_prepend_file").ToStringValue(env); if (prepend.length() > 0) { string prependPath = env.lookup(prepend); if (prependPath == null) { env.error(L.l("auto_prepend_file '{0}' not found.", prepend)); } else { QuercusPage prependPage = getQuercus().parse(prependPath); prependPage.executeTop(env); } } env.executeTop(); StringValue append = quercus.getIniValue("auto_append_file").ToStringValue(env); if (append.length() > 0) { string appendPath = env.lookup(append); if (appendPath == null) { env.error(L.l("auto_append_file '{0}' not found.", append)); } else { QuercusPage appendPage = getQuercus().parse(appendPath); appendPage.executeTop(env); } } // return; } catch (QuercusExitException e) { throw e; } catch (QuercusErrorException e) { throw e; } catch (QuercusLineRuntimeException e) { log.log(Level.FINE, e.ToString(), e); ws.println(e.getMessage()); // return; } catch (QuercusValueException e) { log.log(Level.FINE, e.ToString(), e); ws.println(e.ToString()); // return; } catch (StackOverflowError e) { RuntimeException myException = new RuntimeException(L.l("StackOverflowError at {0}", env.getLocation()), e); throw myException; } catch (Throwable e) { if (response.isCommitted()) { e.printStackTrace(ws.getPrintWriter()); } ws = null; throw e; } finally { if (env != null) { env.close(); } // don't want a flush for an exception if (ws != null && env.getDuplex() == null) { ws.close(); } } } catch (QuercusDieException e) { // normal exit log.log(Level.FINE, e.ToString(), e); } catch (QuercusExitException e) { // normal exit log.log(Level.FINER, e.ToString(), e); } catch (QuercusErrorException e) { // error exit log.log(Level.FINE, e.ToString(), e); } catch (RuntimeException e) { throw e; } catch (Throwable e) { handleThrowable(response, e); } }
public override void service(ServletRequest request, ServletResponse response) { QuercusHttpServletRequest req = new QuercusHttpServletRequestImpl((HttpServletRequest)request); HttpServletResponse res = (HttpServletResponse)response; string uri = QuercusRequestAdapter.getPageURI(req); CacheEntry entry = _cache.get(uri); if (entry == null) { string path = getPath(req); string relPath = path.getUserPath(); string mimeType = _context.getMimeType(uri); entry = new CacheEntry(path, relPath, mimeType); _cache.put(uri, entry); } else if (entry.isModified()) { entry = new CacheEntry(entry.getPath(), entry.getRelPath(), entry.getMimeType()); _cache.put(uri, entry); } string ifMatch = req.getHeader("If-None-Match"); string etag = entry.getEtag(); if (ifMatch != null && ifMatch.equals(etag)) { res.addHeader("ETag", etag); res.sendError(HttpServletResponse.SC_NOT_MODIFIED); return; } string lastModified = entry.getLastModifiedString(); if (ifMatch == null) { string ifModified = req.getHeader("If-Modified-Since"); bool isModified = true; if (ifModified == null) { } else if (ifModified.equals(lastModified)) { isModified = false; } else { long ifModifiedTime; QDate date = QDate.allocateLocalDate(); try { ifModifiedTime = date.parseDate(ifModified); } catch (Exception e) { log.log(Level.FINER, e.ToString(), e); ifModifiedTime = 0; } QDate.freeLocalDate(date); isModified = ifModifiedTime == 0 || ifModifiedTime != entry.getLastModified(); } if (!isModified) { if (etag != null) { res.addHeader("ETag", etag); } res.sendError(HttpServletResponse.SC_NOT_MODIFIED); return; } } res.addHeader("ETag", etag); res.addHeader("Last-Modified", lastModified); string mime = entry.getMimeType(); if (mime != null) { res.setContentType(mime); } res.setContentLength((int)entry.getLength()); string method = req.getMethod(); if (method.equalsIgnoreCase("HEAD")) { return; } string path = entry.getPath(); if (path.isDirectory()) { res.sendError(HttpServletResponse.SC_NOT_FOUND); return; } else if (!path.canRead()) { res.sendError(HttpServletResponse.SC_NOT_FOUND); return; } OutputStream os = response.getOutputStream(); path.writeToStream(os); }