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