001/*
002 * Logback: the reliable, generic, fast and flexible logging framework.
003 * Copyright (C) 1999-2026, QOS.ch. All rights reserved.
004 *
005 * This program and the accompanying materials are dual-licensed under
006 * either the terms of the Eclipse Public License v2.0 as published by
007 * the Eclipse Foundation
008 *
009 *   or (per the licensee's choosing)
010 *
011 * under the terms of the GNU Lesser General Public License version 2.1
012 * as published by the Free Software Foundation.
013 */
014
015package ch.qos.logback.access.jetty;
016
017import ch.qos.logback.access.common.spi.WrappedHttpRequest;
018import jakarta.servlet.AsyncContext;
019import jakarta.servlet.DispatcherType;
020import jakarta.servlet.RequestDispatcher;
021import jakarta.servlet.ServletConnection;
022import jakarta.servlet.ServletContext;
023import jakarta.servlet.ServletException;
024import jakarta.servlet.ServletInputStream;
025import jakarta.servlet.ServletRequest;
026import jakarta.servlet.ServletResponse;
027import jakarta.servlet.http.Cookie;
028import jakarta.servlet.http.HttpServletRequest;
029import jakarta.servlet.http.HttpServletResponse;
030import jakarta.servlet.http.HttpSession;
031import jakarta.servlet.http.HttpUpgradeHandler;
032import jakarta.servlet.http.Part;
033import org.eclipse.jetty.http.HttpCookie;
034import org.eclipse.jetty.http.HttpScheme;
035import org.eclipse.jetty.http.HttpVersion;
036import org.eclipse.jetty.server.Request;
037import org.eclipse.jetty.server.Session;
038import org.eclipse.jetty.util.Fields;
039
040import java.io.BufferedReader;
041import java.io.IOException;
042import java.io.UnsupportedEncodingException;
043import java.security.Principal;
044import java.util.Collection;
045import java.util.Collections;
046import java.util.Enumeration;
047import java.util.HashMap;
048import java.util.List;
049import java.util.Locale;
050import java.util.Map;
051import java.util.Set;
052import java.util.stream.Collectors;
053
054import static ch.qos.logback.access.common.spi.IAccessEvent.NA;
055import static ch.qos.logback.access.jetty.HeaderUtil.buildHeaderMap;
056import static java.nio.charset.StandardCharsets.UTF_8;
057
058public class RequestWrapper implements HttpServletRequest, WrappedHttpRequest {
059
060    static final Cookie[] EMPTY_COOKIE_ARRAY = new Cookie[0];
061    static final String[] EMPTY_STRING_ARRAY = new String[0];
062
063    Request request;
064    StringBuffer requestURL;
065
066    public RequestWrapper(Request request) {
067        this.request = request;
068    }
069
070    @Override
071    public String getAuthType() {
072        return null;
073    }
074
075    @Override
076    public Cookie[] getCookies() {
077        List<HttpCookie> httpCookies = Request.getCookies(request);
078        List<Cookie> cookieList = httpCookies.stream().map(httpCookie -> new Cookie(httpCookie.getName(), httpCookie.getValue())).collect(
079                Collectors.toList());
080
081        return  cookieList.toArray(EMPTY_COOKIE_ARRAY);
082    }
083
084    @Override
085    public long getDateHeader(String name) {
086        return 0;
087    }
088
089    @Override
090    public String getHeader(String name) {
091        return null;
092    }
093
094    @Override
095    public Enumeration<String> getHeaders(String name) {
096        return null;
097    }
098
099    @Override
100    public Enumeration<String> getHeaderNames() {
101
102        return null;
103    }
104
105    @Override
106    public Map<String, String> buildRequestHeaderMap() {
107        return buildHeaderMap(request.getHeaders());
108    }
109
110    @Override
111    public int getIntHeader(String name) {
112        return 0;
113    }
114
115    @Override
116    public String getMethod() {
117        return request.getMethod();
118    }
119
120    @Override
121    public String getPathInfo() {
122        return null;
123    }
124
125    @Override
126    public String getPathTranslated() {
127        return null;
128    }
129
130    @Override
131    public String getContextPath() {
132        return null;
133    }
134
135    @Override
136    public String getQueryString() {
137        return request.getHttpURI().getQuery();
138    }
139
140    @Override
141    public String getRemoteUser() {
142        return null;
143    }
144
145    @Override
146    public boolean isUserInRole(String role) {
147        return false;
148    }
149
150    @Override
151    public Principal getUserPrincipal() {
152        return null;
153    }
154
155    @Override
156    public String getRequestedSessionId() {
157        return null;
158    }
159
160    @Override
161    public String getRequestURI() {
162        return request.getHttpURI().getPath();
163    }
164
165    @Override
166    public StringBuffer getRequestURL() {
167        if (requestURL == null) {
168            String result = request.getHttpURI().asString();
169            requestURL = new StringBuffer(result);
170        }
171        return requestURL;
172    }
173
174    @Override
175    public String getServletPath() {
176        return null;
177    }
178
179    @Override
180    public String getSessionID() {
181        Session session = request.getSession(false);
182        if (session == null) {
183            return NA;
184        } else {
185            return session.getId();
186        }
187    }
188
189    @Override
190    public HttpSession getSession(boolean create) {
191        throw new UnsupportedOperationException();
192    }
193
194    @Override
195    public HttpSession getSession() {
196        throw new UnsupportedOperationException();
197    }
198
199    @Override
200    public String changeSessionId() {
201        throw new UnsupportedOperationException();
202    }
203
204    @Override
205    public boolean isRequestedSessionIdValid() {
206        throw new UnsupportedOperationException();
207    }
208
209    @Override
210    public boolean isRequestedSessionIdFromCookie() {
211        return false;
212    }
213
214    @Override
215    public boolean isRequestedSessionIdFromURL() {
216        throw new UnsupportedOperationException();
217    }
218
219    @Override
220    public boolean authenticate(HttpServletResponse response) throws IOException, ServletException {
221        return false;
222    }
223
224    @Override
225    public void login(String username, String password) throws ServletException {
226
227    }
228
229    @Override
230    public void logout() throws ServletException {
231
232    }
233
234    @Override
235    public Collection<Part> getParts() throws IOException, ServletException {
236        return null;
237    }
238
239    @Override
240    public Part getPart(String name) throws IOException, ServletException {
241        return null;
242    }
243
244    @Override
245    public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException {
246        return null;
247    }
248
249    @Override
250    public Object getAttribute(String name) {
251        return request.getAttribute(name);
252    }
253
254    @Override
255    public Enumeration<String> getAttributeNames() {
256        Set<String> attributeNamesSet = request.getAttributeNameSet();
257        return Collections.enumeration(attributeNamesSet);
258    }
259
260    @Override
261    public String getCharacterEncoding() {
262        return null;
263    }
264
265    @Override
266    public void setCharacterEncoding(String env) throws UnsupportedEncodingException {
267
268    }
269
270    @Override
271    public int getContentLength() {
272        return 0;
273    }
274
275    @Override
276    public long getContentLengthLong() {
277        return 0;
278    }
279
280    @Override
281    public String getContentType() {
282        return null;
283    }
284
285    @Override
286    public ServletInputStream getInputStream() throws IOException {
287        return null;
288    }
289
290    @Override
291    public Map<String, String[]> buildRequestParameterMap() {
292        Map<String, String[]> results = new HashMap<>();
293        Fields allParameters = Request.extractQueryParameters(request, UTF_8);
294        for (Fields.Field field : allParameters) {
295           results.put(field.getName(), field.getValues().toArray(EMPTY_STRING_ARRAY));
296        }
297        return results;
298    }
299
300    @Override
301    public String getParameter(String name) {
302        throw new UnsupportedOperationException();
303    }
304
305    @Override
306    public Enumeration<String> getParameterNames() {
307        throw new UnsupportedOperationException();
308    }
309
310    @Override
311    public String[] getParameterValues(String name) {
312        throw new UnsupportedOperationException();
313    }
314
315    @Override
316    public Map<String, String[]> getParameterMap() {
317        throw new UnsupportedOperationException();
318    }
319
320    @Override
321    public String getProtocol() {
322        return request.getConnectionMetaData().getProtocol();
323    }
324
325    @Override
326    public String getScheme() {
327        return request.getHttpURI().getScheme();
328    }
329
330    @Override
331    public String getServerName() {
332        return Request.getServerName(request);
333    }
334
335    @Override
336    public int getServerPort() {
337        return Request.getServerPort(request);
338    }
339
340    @Override
341    public BufferedReader getReader() throws IOException {
342        return null;
343    }
344
345    @Override
346    public String getRemoteAddr() {
347        return Request.getRemoteAddr(request);
348    }
349
350    @Override
351    public String getRemoteHost() {
352        return Request.getRemoteAddr(request);
353    }
354
355    @Override
356    public void setAttribute(String name, Object o) {
357
358    }
359
360    @Override
361    public void removeAttribute(String name) {
362
363    }
364
365    @Override
366    public Locale getLocale() {
367        return Request.getLocales(request).get(0);
368    }
369
370    @Override
371    public Enumeration<Locale> getLocales() {
372        return Collections.enumeration(Request.getLocales(request));
373    }
374
375    @Override
376    public boolean isSecure() {
377        return HttpScheme.HTTPS.is(request.getHttpURI().getScheme());
378    }
379
380    @Override
381    public RequestDispatcher getRequestDispatcher(String path) {
382        return null;
383    }
384
385    @Override
386    public int getRemotePort() {
387        return Request.getRemotePort(request);
388    }
389
390    @Override
391    public String getLocalName() {
392        return null;
393    }
394
395    @Override
396    public String getLocalAddr() {
397        return Request.getLocalAddr(request);
398    }
399
400    @Override
401    public int getLocalPort() {
402        return Request.getLocalPort(request);
403    }
404
405    @Override
406    public ServletContext getServletContext() {
407        return null;
408    }
409
410    @Override
411    public AsyncContext startAsync() throws IllegalStateException {
412        return null;
413    }
414
415    @Override
416    public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse)
417            throws IllegalStateException {
418        return null;
419    }
420
421    @Override
422    public boolean isAsyncStarted() {
423        return false;
424    }
425
426    @Override
427    public boolean isAsyncSupported() {
428        return false;
429    }
430
431    @Override
432    public AsyncContext getAsyncContext() {
433        return null;
434    }
435
436    @Override
437    public DispatcherType getDispatcherType() {
438        return null;
439    }
440
441    @Override
442    public String getRequestId() {
443        return request.getConnectionMetaData().getId() + "#" + request.getId();
444    }
445
446
447    @Override
448    public String getProtocolRequestId() {
449       HttpVersion httpVersion = request.getConnectionMetaData().getHttpVersion();
450       if(httpVersion == HttpVersion.HTTP_2 || httpVersion == (HttpVersion.HTTP_3)) {
451           return request.getId();
452       } else {
453           return NA;
454       }
455    }
456
457    @Override
458    public ServletConnection getServletConnection() {
459        return null;
460    }
461
462}