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}