boolean processRequest()

in wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java [143:256]


	boolean processRequest(ServletRequest request, final ServletResponse response,
		final FilterChain chain) throws IOException, ServletException
	{
		final ThreadContext previousThreadContext = ThreadContext.detach();

		// Assume we are able to handle the request
		boolean res = true;

		final ClassLoader previousClassLoader = Thread.currentThread().getContextClassLoader();
		final ClassLoader newClassLoader = getClassLoader();

		HttpServletRequest httpServletRequest = (HttpServletRequest)request;
		HttpServletResponse httpServletResponse = (HttpServletResponse)response;

		boolean ioExceptionOccurred = false;
		try
		{
			if (previousClassLoader != newClassLoader)
			{
				Thread.currentThread().setContextClassLoader(newClassLoader);
			}

			// Make sure getFilterPath() gets called before checkIfRedirectRequired()
			String filterPath = getFilterPath(httpServletRequest);

			if (filterPath == null)
			{
				throw new IllegalStateException("filter path was not configured");
			}

			if (shouldIgnorePath(httpServletRequest))
			{
				log.debug("Ignoring request {}", httpServletRequest.getRequestURL());
				if (chain != null)
				{
					// invoke next filter from within Wicket context
					chain.doFilter(request, response);
				}
				return false;
			}

			if ("OPTIONS".equalsIgnoreCase(httpServletRequest.getMethod()))
			{
				// handle the OPTIONS request outside of normal request processing.
				// wicket pages normally only support GET and POST methods, but resources and
				// special pages acting like REST clients can also support other methods, so
				// we include them all.
				httpServletResponse.setStatus(HttpServletResponse.SC_OK);
				httpServletResponse.setHeader("Allow",
					"GET,POST,OPTIONS,PUT,HEAD,PATCH,DELETE,TRACE");
				httpServletResponse.setHeader("Content-Length", "0");
				return true;
			}

			String redirectURL = checkIfRedirectRequired(httpServletRequest);
			if (redirectURL == null)
			{
				// No redirect; process the request
				ThreadContext.setApplication(application);

				WebRequest webRequest = application.createWebRequest(httpServletRequest, filterPath);
				WebResponse webResponse = application.createWebResponse(webRequest,
					httpServletResponse);

				RequestCycle requestCycle = application.createRequestCycle(webRequest, webResponse);
				res = processRequestCycle(requestCycle, webResponse, httpServletRequest,
					httpServletResponse, chain);
			}
			else
			{
				if (Strings.isEmpty(httpServletRequest.getQueryString()) == false)
				{
					redirectURL += "?" + httpServletRequest.getQueryString();
				}

				// send redirect - this will discard POST parameters if the request is POST
				// - still better than getting an error because of lacking trailing slash
				httpServletResponse.sendRedirect(httpServletResponse.encodeRedirectURL(redirectURL));
			}
		}
		catch (IOException e)
		{
			ioExceptionOccurred = true;
			throw e;
		}
		catch (ResponseIOException e)
		{
			ioExceptionOccurred = true;
			throw e.getCause();
		}
		finally
		{
			ThreadContext.restore(previousThreadContext);

			if (newClassLoader != previousClassLoader)
			{
				Thread.currentThread().setContextClassLoader(previousClassLoader);
			}

			if (!ioExceptionOccurred && response.isCommitted() &&
				!httpServletRequest.isAsyncStarted())
			{
				try
				{
					response.flushBuffer();
				}
				catch (ResponseIOException e)
				{
					throw e.getCause();
				}
			}
		}
		return res;
	}