]> WPIA git - gigi.git/blob - lib/jetty/org/eclipse/jetty/server/handler/RequestLogHandler.java
Merge "Update notes about password security"
[gigi.git] / lib / jetty / org / eclipse / jetty / server / handler / RequestLogHandler.java
1 //
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.
8 //
9 //      The Eclipse Public License is available at
10 //      http://www.eclipse.org/legal/epl-v10.html
11 //
12 //      The Apache License v2.0 is available at
13 //      http://www.opensource.org/licenses/apache2.0.php
14 //
15 //  You may elect to redistribute this code under either of these licenses.
16 //  ========================================================================
17 //
18
19 package org.eclipse.jetty.server.handler;
20
21 import java.io.IOException;
22
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;
29
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;
37
38
39
40 /**
41  * RequestLogHandler.
42  * This handler can be used to wrap an individual context for context logging.
43  *
44  *
45  * @org.apache.xbean.XBean
46  */
47 public class RequestLogHandler extends HandlerWrapper
48 {
49     private static final Logger LOG = Log.getLogger(RequestLogHandler.class);
50     private RequestLog _requestLog;
51     private final AsyncListener _listener = new AsyncListener()
52     {
53         
54         @Override
55         public void onTimeout(AsyncEvent event) throws IOException
56         {
57             
58         }
59         
60         @Override
61         public void onStartAsync(AsyncEvent event) throws IOException
62         {
63             event.getAsyncContext().addListener(this);
64         }
65         
66         @Override
67         public void onError(AsyncEvent event) throws IOException
68         {
69             HttpServletResponse response = (HttpServletResponse)event.getAsyncContext().getResponse();
70             if (!response.isCommitted())
71                 response.setStatus(500);
72             
73         }
74         
75         @Override
76         public void onComplete(AsyncEvent event) throws IOException
77         {
78             AsyncContextState context = (AsyncContextState)event.getAsyncContext();
79             Request request=context.getHttpChannelState().getBaseRequest();
80             Response response=request.getResponse();
81             _requestLog.log(request,response);
82         }
83     };
84
85     /* ------------------------------------------------------------ */
86     /*
87      * @see org.eclipse.jetty.server.server.Handler#handle(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int)
88      */
89     @Override
90     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
91             throws IOException, ServletException
92     {
93         try
94         {
95             super.handle(target, baseRequest, request, response);
96         }
97         catch(Error|IOException|ServletException|RuntimeException e)
98         {
99             if (!response.isCommitted() && !baseRequest.getHttpChannelState().isAsync())
100                 response.setStatus(500);
101             throw e;
102         }
103         finally
104         {
105             if (_requestLog != null && baseRequest.getDispatcherType().equals(DispatcherType.REQUEST))
106             {
107                 if (baseRequest.getHttpChannelState().isAsync())
108                 {
109                     if (baseRequest.getHttpChannelState().isInitial())
110                         baseRequest.getAsyncContext().addListener(_listener);
111                 }
112                 else
113                     _requestLog.log(baseRequest, (Response)response);
114             }
115         }
116     }
117
118     /* ------------------------------------------------------------ */
119     public void setRequestLog(RequestLog requestLog)
120     {
121         updateBean(_requestLog,requestLog);
122         _requestLog=requestLog;
123     }
124
125     /* ------------------------------------------------------------ */
126     public RequestLog getRequestLog()
127     {
128         return _requestLog;
129     }
130     
131     /* ------------------------------------------------------------ */
132     @Override
133     protected void doStart() throws Exception
134     {
135         if (_requestLog==null)
136         {
137             LOG.warn("!RequestLog");
138             _requestLog=new NullRequestLog();
139         }
140         super.doStart();
141     }
142     
143     /* ------------------------------------------------------------ */
144     @Override
145     protected void doStop() throws Exception
146     {
147         super.doStop();
148         if (_requestLog instanceof NullRequestLog)
149             _requestLog=null;
150     }
151
152     /* ------------------------------------------------------------ */
153     /* ------------------------------------------------------------ */
154     /* ------------------------------------------------------------ */
155     private static class NullRequestLog extends AbstractLifeCycle implements RequestLog
156     {
157         @Override
158         public void log(Request request, Response response)
159         {            
160         }
161     }
162 }