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