001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.wicket.protocol.ws.javax;
018
019import java.io.BufferedReader;
020import java.io.IOException;
021import java.io.UnsupportedEncodingException;
022import java.security.Principal;
023import java.util.Collection;
024import java.util.Enumeration;
025import java.util.HashMap;
026import java.util.Iterator;
027import java.util.List;
028import java.util.Locale;
029import java.util.Map;
030import java.util.Set;
031
032import javax.servlet.AsyncContext;
033import javax.servlet.DispatcherType;
034import javax.servlet.RequestDispatcher;
035import javax.servlet.ServletContext;
036import javax.servlet.ServletException;
037import javax.servlet.ServletInputStream;
038import javax.servlet.ServletRequest;
039import javax.servlet.ServletResponse;
040import javax.servlet.http.Cookie;
041import javax.servlet.http.HttpServletRequest;
042import javax.servlet.http.HttpServletResponse;
043import javax.servlet.http.HttpSession;
044import javax.servlet.http.HttpUpgradeHandler;
045import javax.servlet.http.Part;
046import javax.websocket.EndpointConfig;
047import javax.websocket.Session;
048
049import org.apache.wicket.util.string.StringValue;
050
051/**
052 * An artificial HttpServletRequest with data collected from the
053 * available WebSocket Session and from the HandshakeRequest
054 */
055public class JavaxUpgradeHttpRequest implements HttpServletRequest
056{
057        private final HttpSession httpSession;
058        private final String queryString;
059        private final Principal userPrincipal;
060        private final String requestUri;
061        private final Map<String, String[]> parametersMap;
062        private final Map<String, List<String>> headers;
063    private final String contextPath;
064
065        public JavaxUpgradeHttpRequest(final Session session, EndpointConfig endpointConfig)
066        {
067                Map<String, Object> userProperties = session.getUserProperties();
068
069                if (userProperties == null || userProperties.isEmpty())
070                {
071                        // workaround for JBoss Wildfly 8.0.Final
072                        userProperties = endpointConfig.getUserProperties();
073                }
074
075                this.httpSession = (HttpSession) userProperties.get("session");
076                this.headers = (Map<String, List<String>>) userProperties.get("headers");
077                this.queryString = session.getQueryString();
078                this.userPrincipal = session.getUserPrincipal();
079                Object requestURI = session.getRequestURI();
080                this.requestUri = requestURI != null ? requestURI.toString() : "";
081                this.contextPath = httpSession.getServletContext().getContextPath();
082
083                this.parametersMap = new HashMap<>();
084
085                Map<String, List<String>> parameters = session.getRequestParameterMap();
086                if (parameters != null)
087                {
088                        for (Map.Entry<String, List<String>> entry : parameters.entrySet())
089                        {
090                                String name = entry.getKey();
091                                List<String> value = entry.getValue();
092                                parametersMap.put(name, value.toArray(new String[0]));
093                        }
094                }
095        }
096
097        @Override
098        public String getAuthType()
099        {
100                return null;
101        }
102
103        @Override
104        public Cookie[] getCookies()
105        {
106                return new Cookie[0];
107        }
108
109        @Override
110        public long getDateHeader(String name)
111        {
112                String headerValue = getHeader(name);
113                return StringValue.valueOf(headerValue).toLong();
114        }
115
116        @Override
117        public String getHeader(String name)
118        {
119                String value = null;
120                if (headers != null)
121                {
122                        List<String> headerValues = headers.get(name);
123                        if (headerValues != null && !headerValues.isEmpty())
124                        {
125                                value = headerValues.get(0);
126                        }
127                }
128                return value;
129        }
130
131        @Override
132        public Enumeration<String> getHeaders(String name)
133        {
134                Enumeration<String> values = null;
135                if (headers != null)
136                {
137                        List<String> headerValues = headers.get(name);
138                        if (headerValues != null && !headerValues.isEmpty())
139                        {
140                                final Iterator<String> iterator = headerValues.iterator();
141                                values = new Enumeration<String>()
142                                {
143                                        @Override
144                                        public boolean hasMoreElements()
145                                        {
146                                                return iterator.hasNext();
147                                        }
148
149                                        @Override
150                                        public String nextElement()
151                                        {
152                                                return iterator.next();
153                                        }
154                                };
155                        }
156                }
157                return values;
158        }
159
160        @Override
161        public Enumeration<String> getHeaderNames()
162        {
163                Enumeration<String> names = null;
164                if (headers != null)
165                {
166                        Set<String> headerNames = headers.keySet();
167                        if (!headerNames.isEmpty())
168                        {
169                                final Iterator<String> iterator = headerNames.iterator();
170                                names = new Enumeration<String>()
171                                {
172                                        @Override
173                                        public boolean hasMoreElements()
174                                        {
175                                                return iterator.hasNext();
176                                        }
177
178                                        @Override
179                                        public String nextElement()
180                                        {
181                                                return iterator.next();
182                                        }
183                                };
184                        }
185                }
186                return names;
187        }
188
189        @Override
190        public int getIntHeader(String name)
191        {
192                String headerValue = getHeader(name);
193                return StringValue.valueOf(headerValue).toInt();
194        }
195
196        @Override
197        public String getMethod()
198        {
199                return null;
200        }
201
202        @Override
203        public String getPathInfo()
204        {
205                return null;
206        }
207
208        @Override
209        public String getPathTranslated()
210        {
211                return null;
212        }
213
214        @Override
215        public String getContextPath()
216        {
217                return contextPath;
218        }
219
220        @Override
221        public String getQueryString()
222        {
223                return queryString;
224        }
225
226        @Override
227        public String getRemoteUser()
228        {
229                return null;
230        }
231
232        @Override
233        public boolean isUserInRole(String role)
234        {
235                return false;
236        }
237
238        @Override
239        public Principal getUserPrincipal()
240        {
241                return userPrincipal;
242        }
243
244        @Override
245        public String getRequestedSessionId()
246        {
247                return null;
248        }
249
250        @Override
251        public String getRequestURI()
252        {
253                return requestUri;
254        }
255
256        @Override
257        public StringBuffer getRequestURL()
258        {
259                return new StringBuffer(requestUri);
260        }
261
262        @Override
263        public String getServletPath()
264        {
265                return null;
266        }
267
268        @Override
269        public HttpSession getSession(boolean create)
270        {
271                return httpSession;
272        }
273
274        @Override
275        public HttpSession getSession()
276        {
277                return httpSession;
278        }
279
280        @Override
281        public String changeSessionId()
282        {
283                return null;
284        }
285
286        @Override
287        public boolean isRequestedSessionIdValid()
288        {
289                return true;
290        }
291
292        @Override
293        public boolean isRequestedSessionIdFromCookie()
294        {
295                return true;
296        }
297
298        @Override
299        public boolean isRequestedSessionIdFromURL()
300        {
301                return false;
302        }
303
304        @Override
305        public boolean isRequestedSessionIdFromUrl()
306        {
307                return false;
308        }
309
310        @Override
311        public boolean authenticate(HttpServletResponse response) throws IOException, ServletException
312        {
313                return false;
314        }
315
316        @Override
317        public void login(String username, String password) throws ServletException
318        {
319        }
320
321        @Override
322        public void logout() throws ServletException
323        {
324        }
325
326        @Override
327        public Collection<Part> getParts() throws IOException, ServletException
328        {
329                return null;
330        }
331
332        @Override
333        public Part getPart(String name) throws IOException, ServletException
334        {
335                return null;
336        }
337
338        @Override
339        public <T extends HttpUpgradeHandler> T upgrade(Class<T> tClass) throws IOException, ServletException
340        {
341                return null;
342        }
343
344        @Override
345        public Object getAttribute(String name)
346        {
347                return null;
348        }
349
350        @Override
351        public Enumeration<String> getAttributeNames()
352        {
353                return new Enumeration<String>()
354                {
355                        @Override
356                        public boolean hasMoreElements()
357                        {
358                                return false;
359                        }
360
361                        @Override
362                        public String nextElement()
363                        {
364                                return null;
365                        }
366                };
367        }
368
369        @Override
370        public String getCharacterEncoding()
371        {
372                return null;
373        }
374
375        @Override
376        public void setCharacterEncoding(String env) throws UnsupportedEncodingException
377        {
378        }
379
380        @Override
381        public int getContentLength()
382        {
383                return 0;
384        }
385
386        @Override
387        public long getContentLengthLong()
388        {
389                return 0;
390        }
391
392        @Override
393        public String getContentType()
394        {
395                return null;
396        }
397
398        @Override
399        public ServletInputStream getInputStream() throws IOException
400        {
401                return null;
402        }
403
404        @Override
405        public String getParameter(String name)
406        {
407                String[] values = parametersMap.get(name);
408                return values != null ? values[0] : null;
409        }
410
411        @Override
412        public Enumeration<String> getParameterNames()
413        {
414                final Iterator<String> iterator = parametersMap.keySet().iterator();
415                return new Enumeration<>()
416                {
417                        @Override
418                        public boolean hasMoreElements()
419                        {
420                                return iterator.hasNext();
421                        }
422
423                        @Override
424                        public String nextElement()
425                        {
426                                return iterator.next();
427                        }
428                };
429        }
430
431        @Override
432        public String[] getParameterValues(String name)
433        {
434                return parametersMap.get(name);
435        }
436
437        @Override
438        public Map<String, String[]> getParameterMap()
439        {
440                return parametersMap;
441        }
442
443        @Override
444        public String getProtocol()
445        {
446                return null;
447        }
448
449        @Override
450        public String getScheme()
451        {
452                return null;
453        }
454
455        @Override
456        public String getServerName()
457        {
458                return null;
459        }
460
461        @Override
462        public int getServerPort()
463        {
464                return 0;
465        }
466
467        @Override
468        public BufferedReader getReader() throws IOException
469        {
470                return null;
471        }
472
473        @Override
474        public String getRemoteAddr()
475        {
476                return null;
477        }
478
479        @Override
480        public String getRemoteHost()
481        {
482                return null;
483        }
484
485        @Override
486        public void setAttribute(String name, Object o)
487        {
488        }
489
490        @Override
491        public void removeAttribute(String name)
492        {
493        }
494
495        @Override
496        public Locale getLocale()
497        {
498                return null;
499        }
500
501        @Override
502        public Enumeration<Locale> getLocales()
503        {
504                return null;
505        }
506
507        @Override
508        public boolean isSecure()
509        {
510                return false;
511        }
512
513        @Override
514        public RequestDispatcher getRequestDispatcher(String path)
515        {
516                return null;
517        }
518
519        @Override
520        public String getRealPath(String path)
521        {
522                return null;
523        }
524
525        @Override
526        public int getRemotePort()
527        {
528                return 0;
529        }
530
531        @Override
532        public String getLocalName()
533        {
534                return null;
535        }
536
537        @Override
538        public String getLocalAddr()
539        {
540                return null;
541        }
542
543        @Override
544        public int getLocalPort()
545        {
546                return 0;
547        }
548
549        @Override
550        public ServletContext getServletContext()
551        {
552                return null;
553        }
554
555        @Override
556        public AsyncContext startAsync() throws IllegalStateException
557        {
558                return null;
559        }
560
561        @Override
562        public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException
563        {
564                return null;
565        }
566
567        @Override
568        public boolean isAsyncStarted()
569        {
570                return false;
571        }
572
573        @Override
574        public boolean isAsyncSupported()
575        {
576                return false;
577        }
578
579        @Override
580        public AsyncContext getAsyncContext()
581        {
582                return null;
583        }
584
585        @Override
586        public DispatcherType getDispatcherType()
587        {
588                return null;
589        }
590}