1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
42
43
44
45
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
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 }