private DirectoryIndexDescriptor loadDirectoryIndexResource(final String path) { String normalizedDirectoryPath = pathHelper.getNormalizedDirectoryPath(path); for (String index : serverConfig.getDirectoryIndex()) { String directoryIndexPath = normalizedDirectoryPath + index; ResourceProvider resourceProvider = getResourceProvider(directoryIndexPath); if (resourceProvider != null) { return new DirectoryIndexDescriptor(resourceProvider, directoryIndexPath); } } return null; }
/** * Throws exception in case of invalid request. * * @param request */ private void validateRequest(final HttpServletRequest request) { if (!isMethodSupported(request.getMethod())) { throw new MethodNotAllowedException(); } }
private void handleDirectoryIndex(final HttpServletResponseImpl response, final HttpServletRequestImpl request, final String requestedPath) throws IOException { DirectoryIndexDescriptor indexDescriptor = loadDirectoryIndexResource(requestedPath); if (indexDescriptor == null) { throw new NotFoundException(); } else { if (!pathHelper.isDirectoryPath(requestedPath)) { sendRedirectToDirectorySlashedPath(response, requestedPath); } else { indexDescriptor.getResourceProvider().load( indexDescriptor.getDirectoryPath(), request, response); } } }
validateRequest(request); setDefaultResponseHeaders(request, response); ResourceProvider resourceProvider = getResourceProvider(requestedPath); if (resourceProvider != null) { resourceProvider.load(requestedPath, request, response); } else { handleDirectoryIndex(response, request, requestedPath);
@Test public void shouldLogIOExceptionsSilently() throws Exception { Socket socket = mock(Socket.class); HttpServletResponseImplFactory responseFactory = mock(HttpServletResponseImplFactory.class); when(responseFactory.createFromSocket(socket)).thenThrow(new IOException()); ServerRunnable serverRunnable = new ServerRunnable(socket, mock(ServerConfig.class), mock(HttpServletRequestImplFactory.class), responseFactory, mock(HttpErrorHandlerResolver.class), new PathHelper() ); serverRunnable.run(); verify(socket, times(1)).close(); } }
@Override public void run() { ServiceContainer serviceContainer = new ServiceContainer(serverConfig); try { while (listen) { try { serviceContainer.getThreadPoolExecutor().execute( new ServerRunnable(serverSocket.accept(), serverConfig, serviceContainer.getRequestWrapperFactory(), serviceContainer.getResponseFactory(), serviceContainer.getHttpErrorHandlerResolver(), serviceContainer.getPathHelper())); } catch (IOException e) { if (listen) { LOGGER.log(Level.SEVERE, "Communication error", e); } } } } finally { IOUtilities.closeSilently(serverSocket); serviceContainer.getThreadPoolExecutor().shutdown(); } }
/** * {@inheritDoc} */ @Override public void rejectedExecution(final Runnable r, final ThreadPoolExecutor executor) { if (r instanceof ServerRunnable) { Socket socket = ((ServerRunnable) r).getSocket(); try { (new HttpError503Handler()).serve(responseFactory.createFromSocket(socket)); } catch (IOException e) { } finally { IOUtilities.closeSilently(socket); } } } }