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 import java.io.OutputStream;
23 import java.io.PrintStream;
24 import java.util.Locale;
25
26 import javax.servlet.ServletException;
27 import javax.servlet.http.HttpServletRequest;
28 import javax.servlet.http.HttpServletResponse;
29
30 import org.eclipse.jetty.server.Request;
31 import org.eclipse.jetty.server.Response;
32 import org.eclipse.jetty.util.DateCache;
33 import org.eclipse.jetty.util.RolloverFileOutputStream;
34
35
36
37
38
39
40
41
42
43 public class DebugHandler extends HandlerWrapper
44 {
45 private DateCache _date=new DateCache("HH:mm:ss", Locale.US);
46 private OutputStream _out;
47 private PrintStream _print;
48
49
50
51
52
53 @Override
54 public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
55 throws IOException, ServletException
56 {
57 final Response base_response = baseRequest.getResponse();
58 final Thread thread=Thread.currentThread();
59 final String old_name=thread.getName();
60
61 boolean suspend=false;
62 boolean retry=false;
63 String name=(String)request.getAttribute("org.eclipse.jetty.thread.name");
64 if (name==null)
65 name=old_name+":"+baseRequest.getScheme()+"://"+baseRequest.getLocalAddr()+":"+baseRequest.getLocalPort()+baseRequest.getUri();
66 else
67 retry=true;
68
69 String ex=null;
70 try
71 {
72 long now=System.currentTimeMillis();
73 final String d=_date.format(now);
74 final int ms=(int)(now%1000);
75
76 if (retry)
77 _print.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+" RETRY");
78 else
79 _print.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+" "+baseRequest.getRemoteAddr()+" "+request.getMethod()+" "+baseRequest.getHeader("Cookie")+"; "+baseRequest.getHeader("User-Agent"));
80 thread.setName(name);
81
82 getHandler().handle(target,baseRequest,request,response);
83 }
84 catch(IOException ioe)
85 {
86 ex=ioe.toString();
87 throw ioe;
88 }
89 catch(ServletException se)
90 {
91 ex=se.toString()+":"+se.getCause();
92 throw se;
93 }
94 catch(RuntimeException rte)
95 {
96 ex=rte.toString();
97 throw rte;
98 }
99 catch(Error e)
100 {
101 ex=e.toString();
102 throw e;
103 }
104 finally
105 {
106 thread.setName(old_name);
107 long now=System.currentTimeMillis();
108 final String d=_date.format(now);
109 final int ms=(int)(now%1000);
110 suspend=baseRequest.getHttpChannelState().isSuspended();
111 if (suspend)
112 {
113 request.setAttribute("org.eclipse.jetty.thread.name",name);
114 _print.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+" SUSPEND");
115 }
116 else
117 _print.println(d+(ms>99?".":(ms>9?".0":".00"))+ms+":"+name+" "+base_response.getStatus()+
118 (ex==null?"":("/"+ex))+
119 " "+base_response.getContentType());
120 }
121 }
122
123
124
125
126 @Override
127 protected void doStart() throws Exception
128 {
129 if (_out==null)
130 _out=new RolloverFileOutputStream("./logs/yyyy_mm_dd.debug.log",true);
131 _print=new PrintStream(_out);
132 super.doStart();
133 }
134
135
136
137
138 @Override
139 protected void doStop() throws Exception
140 {
141 super.doStop();
142 _print.close();
143 }
144
145
146
147
148 public OutputStream getOutputStream()
149 {
150 return _out;
151 }
152
153
154
155
156 public void setOutputStream(OutputStream out)
157 {
158 _out = out;
159 }
160 }