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}