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
70 }
71
72 @Override
73 public void onComplete(AsyncEvent event) throws IOException
74 {
75 AsyncContextState context = (AsyncContextState)event.getAsyncContext();
76 Request request=context.getHttpChannelState().getBaseRequest();
77 Response response=request.getResponse();
78 _requestLog.log(request,response);
79 }
80 };
81
82
83
84
85
86 @Override
87 public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
88 throws IOException, ServletException
89 {
90 try
91 {
92 super.handle(target, baseRequest, request, response);
93 }
94 finally
95 {
96 if (_requestLog != null && baseRequest.getDispatcherType().equals(DispatcherType.REQUEST))
97 {
98 if (baseRequest.getHttpChannelState().isAsync())
99 {
100 if (baseRequest.getHttpChannelState().isInitial())
101 baseRequest.getAsyncContext().addListener(_listener);
102 }
103 else
104 _requestLog.log(baseRequest, (Response)response);
105 }
106 }
107 }
108
109
110 public void setRequestLog(RequestLog requestLog)
111 {
112 updateBean(_requestLog,requestLog);
113 _requestLog=requestLog;
114 }
115
116
117 public RequestLog getRequestLog()
118 {
119 return _requestLog;
120 }
121
122
123 @Override
124 protected void doStart() throws Exception
125 {
126 if (_requestLog==null)
127 {
128 LOG.warn("!RequestLog");
129 _requestLog=new NullRequestLog();
130 }
131 super.doStart();
132 }
133
134
135 @Override
136 protected void doStop() throws Exception
137 {
138 super.doStop();
139 if (_requestLog instanceof NullRequestLog)
140 _requestLog=null;
141 }
142
143
144
145
146 private static class NullRequestLog extends AbstractLifeCycle implements RequestLog
147 {
148 @Override
149 public void log(Request request, Response response)
150 {
151 }
152 }
153 }