2 // ========================================================================
3 // Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
15 // You may elect to redistribute this code under either of these licenses.
16 // ========================================================================
19 package org.eclipse.jetty.server.handler;
21 import java.io.IOException;
23 import javax.servlet.AsyncEvent;
24 import javax.servlet.AsyncListener;
25 import javax.servlet.DispatcherType;
26 import javax.servlet.ServletException;
27 import javax.servlet.http.HttpServletRequest;
28 import javax.servlet.http.HttpServletResponse;
30 import org.eclipse.jetty.server.AsyncContextState;
31 import org.eclipse.jetty.server.Request;
32 import org.eclipse.jetty.server.RequestLog;
33 import org.eclipse.jetty.server.Response;
34 import org.eclipse.jetty.util.component.AbstractLifeCycle;
35 import org.eclipse.jetty.util.log.Log;
36 import org.eclipse.jetty.util.log.Logger;
42 * This handler can be used to wrap an individual context for context logging.
45 * @org.apache.xbean.XBean
47 public class RequestLogHandler extends HandlerWrapper
49 private static final Logger LOG = Log.getLogger(RequestLogHandler.class);
50 private RequestLog _requestLog;
51 private final AsyncListener _listener = new AsyncListener()
55 public void onTimeout(AsyncEvent event) throws IOException
61 public void onStartAsync(AsyncEvent event) throws IOException
63 event.getAsyncContext().addListener(this);
67 public void onError(AsyncEvent event) throws IOException
69 HttpServletResponse response = (HttpServletResponse)event.getAsyncContext().getResponse();
70 if (!response.isCommitted())
71 response.setStatus(500);
76 public void onComplete(AsyncEvent event) throws IOException
78 AsyncContextState context = (AsyncContextState)event.getAsyncContext();
79 Request request=context.getHttpChannelState().getBaseRequest();
80 Response response=request.getResponse();
81 _requestLog.log(request,response);
85 /* ------------------------------------------------------------ */
87 * @see org.eclipse.jetty.server.server.Handler#handle(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int)
90 public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
91 throws IOException, ServletException
95 super.handle(target, baseRequest, request, response);
97 catch(Error|IOException|ServletException|RuntimeException e)
99 if (!response.isCommitted() && !baseRequest.getHttpChannelState().isAsync())
100 response.setStatus(500);
105 if (_requestLog != null && baseRequest.getDispatcherType().equals(DispatcherType.REQUEST))
107 if (baseRequest.getHttpChannelState().isAsync())
109 if (baseRequest.getHttpChannelState().isInitial())
110 baseRequest.getAsyncContext().addListener(_listener);
113 _requestLog.log(baseRequest, (Response)response);
118 /* ------------------------------------------------------------ */
119 public void setRequestLog(RequestLog requestLog)
121 updateBean(_requestLog,requestLog);
122 _requestLog=requestLog;
125 /* ------------------------------------------------------------ */
126 public RequestLog getRequestLog()
131 /* ------------------------------------------------------------ */
133 protected void doStart() throws Exception
135 if (_requestLog==null)
137 LOG.warn("!RequestLog");
138 _requestLog=new NullRequestLog();
143 /* ------------------------------------------------------------ */
145 protected void doStop() throws Exception
148 if (_requestLog instanceof NullRequestLog)
152 /* ------------------------------------------------------------ */
153 /* ------------------------------------------------------------ */
154 /* ------------------------------------------------------------ */
155 private static class NullRequestLog extends AbstractLifeCycle implements RequestLog
158 public void log(Request request, Response response)