ttomcat-1778514358873.zip-extract/apache-tomcat-11.0.18-src/java/org/apache/tomcat/util/http/ResponseUtil.java

Path
ttomcat-1778514358873.zip-extract/apache-tomcat-11.0.18-src/java/org/apache/tomcat/util/http/ResponseUtil.java
Status
scanned
Type
file
Name
ResponseUtil.java
Extension
.java
Programming language
Java
Mime type
text/x-Algol68
File type
Algol 68 source, ASCII text, with CRLF line terminators
Tag

      
    
Rootfs path

      
    
Size
5772 (5.6 KB)
MD5
a9992abac11a233840e37ae17005b921
SHA1
7d441680edcdf9c1fec8c1e8a81626867245400c
SHA256
bbf89723326af3ba95c195b24a41bfa049a23d61d234fe09526ec8db7aa723ef
SHA512

      
    
SHA1_git
5a01d19240b5ba4ff5b7bd379f5408014e0424ee
Is binary

      
    
Is text
True
Is archive

      
    
Is media

      
    
Is legal

      
    
Is manifest

      
    
Is readme

      
    
Is top level

      
    
Is key file

      
    
ResponseUtil.java | 5.6 KB |

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.tomcat.util.http; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import jakarta.servlet.http.HttpServletResponse; import org.apache.tomcat.util.http.parser.TokenList; public class ResponseUtil { private static final String VARY_HEADER = "vary"; private static final String VARY_ALL = "*"; private ResponseUtil() { // Utility class. Hide default constructor. } public static void addVaryFieldName(MimeHeaders headers, String name) { addVaryFieldName(new HeaderAdapter(headers), name); } public static void addVaryFieldName(HttpServletResponse response, String name) { addVaryFieldName(new ResponseAdapter(response), name); } private static void addVaryFieldName(Adapter adapter, String name) { Collection<String> varyHeaders = adapter.getHeaders(VARY_HEADER); // Short-cut if only * has been set if (varyHeaders.size() == 1 && varyHeaders.iterator().next().trim().equals(VARY_ALL)) { // No need to add an additional field return; } // Short-cut if no headers have been set if (varyHeaders.isEmpty()) { adapter.addHeader(VARY_HEADER, name); return; } // Short-cut if "*" is added if (VARY_ALL.equals(name.trim())) { adapter.setHeader(VARY_HEADER, VARY_ALL); return; } // May be dealing with an application set header, or multiple headers. // Header names overlap so can't use String.contains(). Have to parse // the existing values, check if the new value is already present and // then add it if not. The good news is field names are tokens which // makes parsing simpler. LinkedHashSet<String> fieldNames = new LinkedHashSet<>(); for (String varyHeader : varyHeaders) { StringReader input = new StringReader(varyHeader); try { TokenList.parseTokenList(input, fieldNames); } catch (IOException ignore) { // Should never happen because a StringReader is used. } } if (fieldNames.contains(VARY_ALL)) { // '*' has been added without removing other values. Optimise. adapter.setHeader(VARY_HEADER, VARY_ALL); return; } // Build single header to replace current multiple headers // Replace existing header(s) to ensure any invalid values are removed fieldNames.add(name); StringBuilder varyHeader = new StringBuilder(); Iterator<String> iter = fieldNames.iterator(); // There must be at least one value as one is added just above varyHeader.append(iter.next()); while (iter.hasNext()) { varyHeader.append(','); varyHeader.append(iter.next()); } adapter.setHeader(VARY_HEADER, varyHeader.toString()); } private interface Adapter { Collection<String> getHeaders(String name); void setHeader(String name, String value); void addHeader(String name, String value); } private static final class HeaderAdapter implements Adapter { private final MimeHeaders headers; HeaderAdapter(MimeHeaders headers) { this.headers = headers; } @Override public Collection<String> getHeaders(String name) { Enumeration<String> values = headers.values(name); List<String> result = new ArrayList<>(); while (values.hasMoreElements()) { result.add(values.nextElement()); } return result; } @Override public void setHeader(String name, String value) { headers.setValue(name).setString(value); } @Override public void addHeader(String name, String value) { headers.addValue(name).setString(value); } } private static final class ResponseAdapter implements Adapter { private final HttpServletResponse response; ResponseAdapter(HttpServletResponse response) { this.response = response; } @Override public Collection<String> getHeaders(String name) { return response.getHeaders(name); } @Override public void setHeader(String name, String value) { response.setHeader(name, value); } @Override public void addHeader(String name, String value) { response.addHeader(name, value); } } }
Detected license expression
apache-2.0
Detected license expression (SPDX)
Apache-2.0
Percentage of license text
19.93
Copyrights

      
    
Holders

      
    
Authors

      
    
License detections License expression License expression SPDX
apache_2_0-4bde3f57-78aa-4201-96bf-531cba09e7de apache-2.0 Apache-2.0
URL Start line End line
http://www.apache.org/licenses/LICENSE-2.0 9 9