source: trunk/autoquest-httpmonitor/src/main/java/de/ugoe/cs/autoquest/httpmonitor/proxy/ExchangeListener.java @ 1374

Last change on this file since 1374 was 1374, checked in by pharms, 10 years ago

Initial import.

File size: 9.9 KB
Line 
1//   Copyright 2012 Georg-August-Universität Göttingen, Germany
2//
3//   Licensed under the Apache License, Version 2.0 (the "License");
4//   you may not use this file except in compliance with the License.
5//   You may obtain a copy of the License at
6//
7//       http://www.apache.org/licenses/LICENSE-2.0
8//
9//   Unless required by applicable law or agreed to in writing, software
10//   distributed under the License is distributed on an "AS IS" BASIS,
11//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//   See the License for the specific language governing permissions and
13//   limitations under the License.
14
15package de.ugoe.cs.autoquest.httpmonitor.proxy;
16
17import java.math.BigInteger;
18import java.nio.ByteBuffer;
19import java.util.Collection;
20import java.util.Enumeration;
21import java.util.LinkedList;
22import java.util.List;
23import java.util.logging.Level;
24
25import javax.servlet.http.HttpServletRequest;
26import javax.servlet.http.HttpServletResponse;
27
28import de.ugoe.cs.autoquest.httpmonitor.HttpMonitorExchangeHandler;
29import de.ugoe.cs.autoquest.httpmonitor.exchange.Address;
30import de.ugoe.cs.autoquest.httpmonitor.exchange.Content;
31import de.ugoe.cs.autoquest.httpmonitor.exchange.Cookie;
32import de.ugoe.cs.autoquest.httpmonitor.exchange.Cookies;
33import de.ugoe.cs.autoquest.httpmonitor.exchange.Header;
34import de.ugoe.cs.autoquest.httpmonitor.exchange.Headers;
35import de.ugoe.cs.autoquest.httpmonitor.exchange.HttpExchange;
36import de.ugoe.cs.autoquest.httpmonitor.exchange.HttpRequest;
37import de.ugoe.cs.autoquest.httpmonitor.exchange.HttpResponse;
38import de.ugoe.cs.autoquest.httpmonitor.exchange.Method;
39import de.ugoe.cs.autoquest.httpmonitor.exchange.ObjectFactory;
40import de.ugoe.cs.autoquest.httpmonitor.exchange.Protocol;
41import de.ugoe.cs.autoquest.httpmonitor.exchange.Status;
42import de.ugoe.cs.util.console.Console;
43
44/**
45 * <p>
46 * TODO comment
47 * </p>
48 *
49 * @author Patrick Harms
50 */
51class ExchangeListener {
52   
53    /**
54     *
55     */
56    private HttpMonitorExchangeHandler exchangeHandler;
57   
58    /**
59     *
60     */
61    private HttpServletRequest request;
62
63    /**
64     *
65     */
66    private List<ByteBuffer> requestData = new LinkedList<ByteBuffer>();
67   
68    /**
69     *
70     */
71    private HttpServletResponse response;
72
73    /**
74     *
75     */
76    private List<ByteBuffer> responseData = new LinkedList<ByteBuffer>();
77   
78    /**
79     *
80     */
81    private long lastUpdate = System.currentTimeMillis();
82   
83    /**
84     *
85     */
86    ExchangeListener(HttpMonitorExchangeHandler exchangeHandler) {
87        this.exchangeHandler = exchangeHandler;
88    }
89
90    /**
91     *
92     */
93    public void onRequest(HttpServletRequest request) throws IllegalStateException {
94        Console.traceln(Level.FINEST, this + ": onRequest " + request);
95
96        if (request == null) {
97            throw new IllegalArgumentException("request must not be null");
98        }
99
100        lastUpdate = System.currentTimeMillis();
101        this.request = request;
102    }
103
104    /**
105     *
106     */
107    public void onRequestContent(ByteBuffer data) {
108        Console.traceln(Level.FINEST, this + ": onRequestContent " + data);
109
110        if (data == null) {
111            throw new IllegalArgumentException("data must not be null");
112        }
113
114        lastUpdate = System.currentTimeMillis();
115        requestData.add(data);
116    }
117   
118    /**
119     *
120     */
121    public void onResponse(HttpServletResponse response) {
122        Console.traceln(Level.FINEST, this + ": onResponse " + response);
123
124        if (response == null) {
125            throw new IllegalArgumentException("response must not be null");
126        }
127
128        lastUpdate = System.currentTimeMillis();
129        this.response = response;
130    }
131   
132    /**
133     *
134     */
135    public void onResponseContent(ByteBuffer data) {
136        Console.traceln(Level.FINEST, this + ": onResponseContent " + data);
137
138        if (data == null) {
139            throw new IllegalArgumentException("data must not be null");
140        }
141
142        lastUpdate = System.currentTimeMillis();
143        responseData.add(data);
144    }
145   
146    /**
147     *
148     */
149    public void onFinish(Status status) {
150        Console.traceln(Level.FINEST, this + ": onFinish " + status);
151
152        if (status == null) {
153            throw new IllegalArgumentException("status must not be null");
154        }
155
156        lastUpdate = System.currentTimeMillis();
157        sendToExchangeHandler(status);
158    }
159   
160    /**
161     * @return the request
162     */
163    HttpServletRequest getRequest() {
164        return request;
165    }
166
167    /**
168     *
169     */
170    long getLastUpdate() {
171        return lastUpdate;
172    }
173
174    /**
175     *
176     */
177    private void sendToExchangeHandler(Status status) {
178        ObjectFactory eventObjectFactory = new ObjectFactory();
179        HttpExchange exchange = eventObjectFactory.createHttpExchange();
180       
181        exchange.setStatus(status);
182       
183        // the remote address
184        Address address = eventObjectFactory.createAddress();
185        address.setIp(request.getRemoteAddr());
186        address.setHost(request.getRemoteHost());
187        address.setPort(BigInteger.valueOf(request.getRemotePort()));
188        exchange.setSender(address);
189       
190        // the local address
191        address = eventObjectFactory.createAddress();
192        address.setIp(request.getLocalAddr());
193        address.setHost(request.getLocalName());
194        address.setPort(BigInteger.valueOf(request.getLocalPort()));
195        exchange.setReceiver(address);
196       
197        exchange.setRequest(map(request, eventObjectFactory));
198        exchange.setResponse(map(response, eventObjectFactory));
199       
200        exchangeHandler.handleHttpExchange(exchange);
201    }
202
203    /**
204     *
205     */
206    private HttpRequest map(HttpServletRequest request, ObjectFactory eventObjectFactory) {
207        HttpRequest eventRequest = eventObjectFactory.createHttpRequest();
208        eventRequest.setMethod(Method.fromValue(request.getMethod()));
209        eventRequest.setProtocol(Protocol.fromValue(request.getProtocol()));
210        eventRequest.setUrl(request.getRequestURL().toString());
211        eventRequest.setQuery(request.getQueryString());
212       
213        Headers headers = eventObjectFactory.createHeaders();
214        Enumeration<String> headerNames = request.getHeaderNames();
215        while (headerNames.hasMoreElements()) {
216            String headerName = headerNames.nextElement();
217           
218            Enumeration<String> headerValues = request.getHeaders(headerName);
219            while (headerValues.hasMoreElements()) {
220                Header header = eventObjectFactory.createHeader();
221                header.setKey(headerName);
222                header.setValue(headerValues.nextElement());
223                headers.getHeader().add(header);
224            }
225        }
226        eventRequest.setHeaders(headers);
227       
228        if (request.getCookies() != null) {
229            Cookies cookies = eventObjectFactory.createCookies();
230            for (javax.servlet.http.Cookie requestCookie : request.getCookies()) {
231                Cookie cookie = eventObjectFactory.createCookie();
232                cookie.setComment(requestCookie.getComment());
233                cookie.setDomain(requestCookie.getDomain());
234                cookie.setIsHttpOnly(requestCookie.isHttpOnly());
235                cookie.setIsSecure(requestCookie.getSecure());
236                cookie.setMaxAge(BigInteger.valueOf(requestCookie.getMaxAge()));
237                cookie.setName(requestCookie.getName());
238                cookie.setPath(requestCookie.getPath());
239                cookie.setValue(requestCookie.getValue());
240                cookie.setVersion(BigInteger.valueOf(requestCookie.getVersion()));
241                cookies.getCookie().add(cookie);
242            }
243            eventRequest.setCookies(cookies);
244        }
245       
246        eventRequest.setAuthType(request.getAuthType());
247        eventRequest.setRemoteUser(request.getRemoteUser());
248        eventRequest.setRequestedSessionId(request.getRequestedSessionId());
249       
250        if (requestData.size() > 0) {
251            Content content = eventObjectFactory.createContent();
252            content.setEncoding(request.getCharacterEncoding());
253            content.setType(request.getContentType());
254            content.setLength(request.getContentLength());
255            content.setData(createString(requestData));
256            eventRequest.setContent(content);
257        }
258       
259        return eventRequest;
260    }
261
262    /**
263     *
264     */
265    private HttpResponse map(HttpServletResponse response, ObjectFactory eventObjectFactory) {
266        HttpResponse eventResponse = eventObjectFactory.createHttpResponse();
267       
268        eventResponse.setStatus(BigInteger.valueOf(response.getStatus()));
269
270        Headers headers = eventObjectFactory.createHeaders();
271        Collection<String> headerNames = response.getHeaderNames();
272        for (String headerName : headerNames) {
273            Collection<String> headerValues = response.getHeaders(headerName);
274            for (String headerValue : headerValues) {
275                Header header = eventObjectFactory.createHeader();
276                header.setKey(headerName);
277                header.setValue(headerValue);
278                headers.getHeader().add(header);
279            }
280        }
281        eventResponse.setHeaders(headers);
282       
283        if (responseData.size() > 0) {
284            Content content = eventObjectFactory.createContent();
285            content.setEncoding(response.getCharacterEncoding());
286            content.setType(response.getContentType());
287
288            String data = createString(responseData);
289            content.setLength(data.length());
290            content.setData(data);
291           
292            eventResponse.setContent(content);
293        }
294       
295        return eventResponse;
296    }
297
298    /**
299     *
300     */
301    private String createString(List<ByteBuffer> bufferList) {
302        StringBuffer str = new StringBuffer();
303       
304        for (ByteBuffer buffer : bufferList) {
305            while (buffer.hasRemaining()) {
306                str.append((char) buffer.get());
307            }
308        }
309       
310        return str.toString();
311    }
312
313}
Note: See TracBrowser for help on using the repository browser.