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

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

Initial import.

File size: 7.8 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.io.IOException;
18import java.net.URI;
19import java.net.URISyntaxException;
20import java.nio.ByteBuffer;
21import java.util.Iterator;
22
23import javax.servlet.http.HttpServletRequest;
24import javax.servlet.http.HttpServletResponse;
25
26import org.eclipse.jetty.client.api.ContentProvider;
27import org.eclipse.jetty.client.api.Request;
28import org.eclipse.jetty.client.api.Response;
29import org.eclipse.jetty.proxy.ProxyServlet;
30
31import de.ugoe.cs.autoquest.httpmonitor.exchange.Status;
32import de.ugoe.cs.util.console.Console;
33
34/**
35 * <p>
36 * TODO document
37 * the servlet deployed in the web server that receives all client messages and returns the client
38 * java script. The messages are parsed, validated, and forwarded to the provided message listener.
39 * If a message is not valid, it is discarded. If an event in a message is not valid, it is
40 * discarded. Messages are only received via the POST HTTP method. The GET HTTP method is only
41 * implemented for returning the client java script.
42 * </p>
43 *
44 * @author Patrick Harms
45 */
46class HttpMonitoringProxyServlet extends ProxyServlet {
47
48    /**  */
49    private static final long serialVersionUID = 1L;
50
51    /** */
52    private String proxiedServer;
53   
54    /** */
55    private int proxiedPort;
56
57    /** */
58    private ExchangeListenerManager exchangeListenerManager;
59   
60    /**
61     * <p>
62     * initializes the servlet with the message listener to which all events shall be forwarded
63     * </p>
64     *
65     * @param messageListener the message listener that shall receive all client events
66     */
67    HttpMonitoringProxyServlet(String                  proxiedServer,
68                               int                     proxiedPort,
69                               ExchangeListenerManager exchangeListenerManager)
70    {
71        this.proxiedServer = proxiedServer;
72        this.proxiedPort = proxiedPort;
73        this.exchangeListenerManager = exchangeListenerManager;
74    }
75
76    /* (non-Javadoc)
77     * @see org.eclipse.jetty.proxy.ProxyServlet#rewriteURI(javax.servlet.http.HttpServletRequest)
78     */
79    @Override
80    protected URI rewriteURI(HttpServletRequest request) {
81        try {
82            return new URI(request.getScheme(), null, proxiedServer, proxiedPort,
83                           request.getPathTranslated(), request.getQueryString(), null);
84        }
85        catch (URISyntaxException e) {
86            Console.printerrln("could not rewrite URI: " + e);
87            Console.logException(e);
88            return null;
89        }
90    }
91
92    /* (non-Javadoc)
93     * @see org.eclipse.jetty.proxy.ProxyServlet#customizeProxyRequest(org.eclipse.jetty.client.api.Request, javax.servlet.http.HttpServletRequest)
94     */
95    @Override
96    protected void customizeProxyRequest(Request proxyRequest, HttpServletRequest request) {
97        super.customizeProxyRequest(proxyRequest, request);
98       
99        exchangeListenerManager.onRequest(request);
100        proxyRequest.content(new DubbingContentProvider(request, proxyRequest.getContent()));
101    }
102
103    /* (non-Javadoc)
104     * @see org.eclipse.jetty.proxy.ProxyServlet#onResponseContent(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.eclipse.jetty.client.api.Response, byte[], int, int)
105     */
106    @Override
107    protected void onResponseContent(HttpServletRequest  request,
108                                     HttpServletResponse response,
109                                     Response            proxyResponse,
110                                     byte[]              buffer,
111                                     int                 offset,
112                                     int                 length)
113        throws IOException
114    {
115        super.onResponseContent(request, response, proxyResponse, buffer, offset, length);
116       
117        exchangeListenerManager.onResponseContent(request, ByteBuffer.wrap(buffer, offset, length));
118    }
119
120    /* (non-Javadoc)
121     * @see org.eclipse.jetty.proxy.ProxyServlet#onResponseSuccess(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.eclipse.jetty.client.api.Response)
122     */
123    @Override
124    protected void onResponseSuccess(HttpServletRequest  request,
125                                     HttpServletResponse response,
126                                     Response            proxyResponse)
127    {
128        exchangeListenerManager.onResponse(request, response);
129        exchangeListenerManager.onFinish(request, Status.SUCCESS);
130       
131        super.onResponseSuccess(request, response, proxyResponse);
132    }
133
134    /* (non-Javadoc)
135     * @see org.eclipse.jetty.proxy.ProxyServlet#onResponseFailure(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.eclipse.jetty.client.api.Response, java.lang.Throwable)
136     */
137    @Override
138    protected void onResponseFailure(HttpServletRequest  request,
139                                     HttpServletResponse response,
140                                     Response            proxyResponse,
141                                     Throwable           failure)
142    {
143        exchangeListenerManager.onResponse(request, response);
144        exchangeListenerManager.onFinish(request, Status.FAILURE);
145       
146        super.onResponseFailure(request, response, proxyResponse, failure);
147    }
148
149    /**
150     *
151     */
152    private class DubbingContentProvider implements ContentProvider {
153
154        /** */
155        private HttpServletRequest request;
156       
157        /** */
158        private ContentProvider delegate;
159
160        /**
161         *
162         */
163        public DubbingContentProvider(HttpServletRequest request, ContentProvider delegate) {
164            this.request = request;
165            this.delegate = delegate;
166        }
167
168        /* (non-Javadoc)
169         * @see java.lang.Iterable#iterator()
170         */
171        @Override
172        public Iterator<ByteBuffer> iterator() {
173            return new DubbingByteBufferIterator(request, delegate.iterator());
174        }
175
176        /* (non-Javadoc)
177         * @see org.eclipse.jetty.client.api.ContentProvider#getLength()
178         */
179        @Override
180        public long getLength() {
181            return delegate.getLength();
182        }
183
184    }
185
186    /**
187     *
188     */
189    public class DubbingByteBufferIterator implements Iterator<ByteBuffer> {
190
191        /** */
192        private HttpServletRequest request;
193       
194        /** */
195        private Iterator<ByteBuffer> delegate;
196       
197        /**
198         *
199         */
200        public DubbingByteBufferIterator(HttpServletRequest request, Iterator<ByteBuffer> delegate) {
201            this.request = request;
202            this.delegate = delegate;
203        }
204
205        /* (non-Javadoc)
206         * @see java.util.Iterator#hasNext()
207         */
208        @Override
209        public boolean hasNext() {
210            return delegate.hasNext();
211        }
212
213        /* (non-Javadoc)
214         * @see java.util.Iterator#next()
215         */
216        @Override
217        public ByteBuffer next() {
218            ByteBuffer next = delegate.next();
219            exchangeListenerManager.onRequestContent(request, next.duplicate());
220            return next;
221        }
222
223        /* (non-Javadoc)
224         * @see java.util.Iterator#remove()
225         */
226        @Override
227        public void remove() {
228            delegate.remove();
229        }
230
231    }
232
233}
Note: See TracBrowser for help on using the repository browser.