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.commons.fileupload2.jakarta.servlet6; 018 019import java.io.BufferedReader; 020import java.io.ByteArrayInputStream; 021import java.io.IOException; 022import java.io.InputStream; 023import java.io.UnsupportedEncodingException; 024import java.security.Principal; 025import java.util.Collection; 026import java.util.Enumeration; 027import java.util.Locale; 028import java.util.Map; 029 030import org.apache.commons.fileupload2.core.AbstractFileUpload; 031 032import jakarta.servlet.AsyncContext; 033import jakarta.servlet.DispatcherType; 034import jakarta.servlet.ReadListener; 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; 048 049public class JakartaMockServletHttpRequest implements HttpServletRequest { 050 051 private static final class MyServletInputStream extends jakarta.servlet.ServletInputStream { 052 053 private final InputStream inputStream; 054 private final int readLimit; 055 056 /** 057 * Creates a new instance, which returns the given streams data. 058 */ 059 public MyServletInputStream(final InputStream inputStream, final int readLimit) { 060 this.inputStream = inputStream; 061 this.readLimit = readLimit; 062 } 063 064 @Override 065 public boolean isFinished() { 066 return false; 067 } 068 069 @Override 070 public boolean isReady() { 071 return false; 072 } 073 074 @Override 075 public int read() throws IOException { 076 return inputStream.read(); 077 } 078 079 @Override 080 public int read(final byte[] b, final int off, final int len) throws IOException { 081 if (readLimit > 0) { 082 return inputStream.read(b, off, Math.min(readLimit, len)); 083 } 084 return inputStream.read(b, off, len); 085 } 086 087 @Override 088 public void setReadListener(final ReadListener readListener) { 089 throw new IllegalStateException("Not implemented"); 090 } 091 092 } 093 094 private final InputStream requestInputStream; 095 096 private long requestLength; 097 098 private final String contentType; 099 100 private int readLimit = -1; 101 102 private final Map<String, String> headers = new java.util.HashMap<>(); 103 104 /** 105 * Creates a new instance with the given request data and content type. 106 */ 107 public JakartaMockServletHttpRequest(final byte[] requestData, final String strContentType) { 108 this(new ByteArrayInputStream(requestData), requestData.length, strContentType); 109 } 110 111 /** 112 * Creates a new instance with the given request data and content type. 113 */ 114 public JakartaMockServletHttpRequest(final InputStream requestData, final long requestLength, final String strContentType) { 115 this.requestInputStream = requestData; 116 this.requestLength = requestLength; 117 this.contentType = strContentType; 118 this.headers.put(AbstractFileUpload.CONTENT_TYPE, strContentType); 119 } 120 121 @Override 122 public boolean authenticate(final HttpServletResponse response) throws IOException, ServletException { 123 return false; 124 } 125 126 @Override 127 public String changeSessionId() { 128 return null; 129 } 130 131 @Override 132 public AsyncContext getAsyncContext() { 133 return null; 134 } 135 136 /** 137 * @see ServletRequest#getAttribute(String) 138 */ 139 @Override 140 public Object getAttribute(final String arg0) { 141 return null; 142 } 143 144 /** 145 * @see ServletRequest#getAttributeNames() 146 */ 147 @Override 148 public Enumeration<String> getAttributeNames() { 149 return null; 150 } 151 152 /** 153 * @see HttpServletRequest#getAuthType() 154 */ 155 @Override 156 public String getAuthType() { 157 return null; 158 } 159 160 /** 161 * @see ServletRequest#getCharacterEncoding() 162 */ 163 @Override 164 public String getCharacterEncoding() { 165 return null; 166 } 167 168 /** 169 * @see ServletRequest#getContentLength() 170 */ 171 @Override 172 public int getContentLength() { 173 return requestInputStream != null ? Math.toIntExact(requestLength) : -1; 174 } 175 176 @Override 177 public long getContentLengthLong() { 178 return getContentLength(); 179 } 180 181 /** 182 * @see ServletRequest#getContentType() 183 */ 184 @Override 185 public String getContentType() { 186 return contentType; 187 } 188 189 /** 190 * @see HttpServletRequest#getContextPath() 191 */ 192 @Override 193 public String getContextPath() { 194 return null; 195 } 196 197 /** 198 * @see HttpServletRequest#getCookies() 199 */ 200 @Override 201 public Cookie[] getCookies() { 202 return null; 203 } 204 205 /** 206 * @see HttpServletRequest#getDateHeader(String) 207 */ 208 @Override 209 public long getDateHeader(final String arg0) { 210 return 0; 211 } 212 213 @Override 214 public DispatcherType getDispatcherType() { 215 return null; 216 } 217 218 /** 219 * @see HttpServletRequest#getHeader(String) 220 */ 221 @Override 222 public String getHeader(final String headerName) { 223 return headers.get(headerName); 224 } 225 226 /** 227 * @see HttpServletRequest#getHeaderNames() 228 */ 229 @Override 230 public Enumeration<String> getHeaderNames() { 231 // todo - implement 232 return null; 233 } 234 235 /** 236 * @see HttpServletRequest#getHeaders(String) 237 */ 238 @Override 239 public Enumeration<String> getHeaders(final String arg0) { 240 // todo - implement 241 return null; 242 } 243 244 /** 245 * @see ServletRequest#getInputStream() 246 */ 247 @Override 248 public ServletInputStream getInputStream() throws IOException { 249 return new MyServletInputStream(requestInputStream, readLimit); 250 } 251 252 /** 253 * @see HttpServletRequest#getIntHeader(String) 254 */ 255 @Override 256 public int getIntHeader(final String arg0) { 257 return 0; 258 } 259 260 /** 261 * @see ServletRequest#getLocalAddr() 262 */ 263 @Override 264 @SuppressWarnings("javadoc") // This is a Servlet 2.4 method 265 public String getLocalAddr() { 266 return null; 267 } 268 269 /** 270 * @see ServletRequest#getLocale() 271 */ 272 @Override 273 public Locale getLocale() { 274 return null; 275 } 276 277 /** 278 * @see ServletRequest#getLocales() 279 */ 280 @Override 281 public Enumeration<Locale> getLocales() { 282 return null; 283 } 284 285 /** 286 * @see ServletRequest#getLocalName() 287 */ 288 @Override 289 @SuppressWarnings("javadoc") // This is a Servlet 2.4 method 290 public String getLocalName() { 291 return null; 292 } 293 294 /** 295 * @see ServletRequest#getLocalPort() 296 */ 297 @Override 298 @SuppressWarnings("javadoc") // This is a Servlet 2.4 method 299 public int getLocalPort() { 300 return 0; 301 } 302 303 /** 304 * @see HttpServletRequest#getMethod() 305 */ 306 @Override 307 public String getMethod() { 308 return null; 309 } 310 311 /** 312 * @see ServletRequest#getParameter(String) 313 */ 314 @Override 315 public String getParameter(final String arg0) { 316 return null; 317 } 318 319 /** 320 * @see ServletRequest#getParameterMap() 321 */ 322 @Override 323 public Map<String, String[]> getParameterMap() { 324 return null; 325 } 326 327 /** 328 * @see ServletRequest#getParameterNames() 329 */ 330 @Override 331 public Enumeration<String> getParameterNames() { 332 return null; 333 } 334 335 /** 336 * @see ServletRequest#getParameterValues(String) 337 */ 338 @Override 339 public String[] getParameterValues(final String arg0) { 340 return null; 341 } 342 343 @Override 344 public Part getPart(final String name) throws IOException, ServletException { 345 return null; 346 } 347 348 @Override 349 public Collection<Part> getParts() throws IOException, ServletException { 350 return null; 351 } 352 353 /** 354 * @see HttpServletRequest#getPathInfo() 355 */ 356 @Override 357 public String getPathInfo() { 358 return null; 359 } 360 361 /** 362 * @see HttpServletRequest#getPathTranslated() 363 */ 364 @Override 365 public String getPathTranslated() { 366 return null; 367 } 368 369 /** 370 * @see ServletRequest#getProtocol() 371 */ 372 @Override 373 public String getProtocol() { 374 return null; 375 } 376 377 @Override 378 public String getProtocolRequestId() { 379 throw new IllegalStateException("Not implemented 6.0.0"); 380 } 381 382 /** 383 * @see HttpServletRequest#getQueryString() 384 */ 385 @Override 386 public String getQueryString() { 387 return null; 388 } 389 390 /** 391 * @see ServletRequest#getReader() 392 */ 393 @Override 394 public BufferedReader getReader() throws IOException { 395 return null; 396 } 397 398 /** 399 * @see ServletRequest#getRemoteAddr() 400 */ 401 @Override 402 public String getRemoteAddr() { 403 return null; 404 } 405 406 /** 407 * @see ServletRequest#getRemoteHost() 408 */ 409 @Override 410 public String getRemoteHost() { 411 return null; 412 } 413 414 /** 415 * @see ServletRequest#getRemotePort() 416 */ 417 @Override 418 @SuppressWarnings("javadoc") // This is a Servlet 2.4 method 419 public int getRemotePort() { 420 return 0; 421 } 422 423 /** 424 * @see HttpServletRequest#getRemoteUser() 425 */ 426 @Override 427 public String getRemoteUser() { 428 return null; 429 } 430 431 /** 432 * @see ServletRequest#getRequestDispatcher(String) 433 */ 434 @Override 435 public RequestDispatcher getRequestDispatcher(final String arg0) { 436 return null; 437 } 438 439 /** 440 * @see HttpServletRequest#getRequestedSessionId() 441 */ 442 @Override 443 public String getRequestedSessionId() { 444 return null; 445 } 446 447 @Override 448 public String getRequestId() { 449 throw new IllegalStateException("Not implemented 6.0.0"); 450 } 451 452 /** 453 * @see HttpServletRequest#getRequestURI() 454 */ 455 @Override 456 public String getRequestURI() { 457 return null; 458 } 459 460 /** 461 * @see HttpServletRequest#getRequestURL() 462 */ 463 @Override 464 public StringBuffer getRequestURL() { 465 return null; 466 } 467 468 /** 469 * @see ServletRequest#getScheme() 470 */ 471 @Override 472 public String getScheme() { 473 return null; 474 } 475 476 /** 477 * @see ServletRequest#getServerName() 478 */ 479 @Override 480 public String getServerName() { 481 return null; 482 } 483 484 /** 485 * @see ServletRequest#getServerPort() 486 */ 487 @Override 488 public int getServerPort() { 489 return 0; 490 } 491 492 @Override 493 public ServletConnection getServletConnection() { 494 throw new IllegalStateException("Not implemented"); 495 } 496 497 @Override 498 public ServletContext getServletContext() { 499 final var session = getSession(); 500 if (session == null) { 501 return null; 502 } 503 return session.getServletContext(); 504 } 505 506 /** 507 * @see HttpServletRequest#getServletPath() 508 */ 509 @Override 510 public String getServletPath() { 511 return null; 512 } 513 514 /** 515 * @see HttpServletRequest#getSession() 516 */ 517 @Override 518 public HttpSession getSession() { 519 return null; 520 } 521 522 /** 523 * @see HttpServletRequest#getSession(boolean) 524 */ 525 @Override 526 public HttpSession getSession(final boolean arg0) { 527 return null; 528 } 529 530 /** 531 * @see HttpServletRequest#getUserPrincipal() 532 */ 533 @Override 534 public Principal getUserPrincipal() { 535 return null; 536 } 537 538 @Override 539 public boolean isAsyncStarted() { 540 return false; 541 } 542 543 @Override 544 public boolean isAsyncSupported() { 545 return false; 546 } 547 548 /** 549 * @see HttpServletRequest#isRequestedSessionIdFromCookie() 550 */ 551 @Override 552 public boolean isRequestedSessionIdFromCookie() { 553 return false; 554 } 555 556 /** 557 * @see HttpServletRequest#isRequestedSessionIdFromURL() 558 */ 559 @Override 560 public boolean isRequestedSessionIdFromURL() { 561 return false; 562 } 563 564 /** 565 * @see HttpServletRequest#isRequestedSessionIdValid() 566 */ 567 @Override 568 public boolean isRequestedSessionIdValid() { 569 return false; 570 } 571 572 /** 573 * @see ServletRequest#isSecure() 574 */ 575 @Override 576 public boolean isSecure() { 577 return false; 578 } 579 580 /** 581 * @see HttpServletRequest#isUserInRole(String) 582 */ 583 @Override 584 public boolean isUserInRole(final String arg0) { 585 return false; 586 } 587 588 @Override 589 public void login(final String username, final String password) throws ServletException { 590 throw new IllegalStateException("Not implemented"); 591 } 592 593 @Override 594 public void logout() throws ServletException { 595 throw new IllegalStateException("Not implemented"); 596 } 597 598 /** 599 * @see ServletRequest#removeAttribute(String) 600 */ 601 @Override 602 public void removeAttribute(final String arg0) { 603 } 604 605 /** 606 * @see ServletRequest#setAttribute(String, Object) 607 */ 608 @Override 609 public void setAttribute(final String arg0, final Object arg1) { 610 } 611 612 /** 613 * @see ServletRequest#setCharacterEncoding(String) 614 */ 615 @Override 616 public void setCharacterEncoding(final String arg0) throws UnsupportedEncodingException { 617 } 618 619 /** 620 * For testing attack scenarios in SizesTest. 621 */ 622 public void setContentLength(final long length) { 623 this.requestLength = length; 624 } 625 626 /** 627 * Sets the read limit. This can be used to limit the number of bytes to read ahead. 628 * 629 * @param readLimit the read limit to use 630 */ 631 public void setReadLimit(final int readLimit) { 632 this.readLimit = readLimit; 633 } 634 635 @Override 636 public AsyncContext startAsync() throws IllegalStateException { 637 throw new IllegalStateException("Not implemented"); 638 } 639 640 @Override 641 public AsyncContext startAsync(final ServletRequest servletRequest, final ServletResponse servletResponse) throws IllegalStateException { 642 throw new IllegalStateException("Not implemented"); 643 } 644 645 @Override 646 public <T extends HttpUpgradeHandler> T upgrade(final Class<T> handlerClass) throws IOException, ServletException { 647 throw new IllegalStateException("Not implemented"); 648 } 649}