package org.openstack.atlas.api.filters.wrappers; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.util.List; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.Set; import java.util.HashSet; import java.util.Map; import java.util.HashMap; public class HeadersRequestWrapper extends HttpServletRequestWrapper { private Map<String, List<String>> headerMap; private Set<String> overriddenHeaders; public HeadersRequestWrapper(HttpServletRequest request) { super(request); headerMap = new HashMap<String, List<String>>(); overriddenHeaders = new HashSet<String>(); } public boolean overideHeader(String headerName) { return overriddenHeaders.add(headerName); } public boolean unoverideHeader(String headerName) { return overriddenHeaders.remove(headerName); } public void addHeader(String headerName, String value) { if (headerMap.containsKey(headerName)) { headerMap.get(headerName).add(value); } else { List<String> values = new ArrayList<String>(); values.add(value); headerMap.put(headerName, values); } } @Override public Enumeration<String> getHeaderNames() { HttpServletRequest request = (HttpServletRequest) this.getRequest(); Set<String> allHeaderNames = new HashSet<String>(); Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { allHeaderNames.add(headerNames.nextElement()); } for (String headerName : headerMap.keySet()) { allHeaderNames.add(headerName); } return Collections.enumeration(allHeaderNames); } @Override public String getHeader(String name) { List<String> valuestrings; if ((valuestrings = headerMap.get("" + name)) != null) { return valuestrings.get(0).split(",")[0]; } else { if (overriddenHeaders.contains(name)) { return null; // This header was overidden so don't attempt to fetch the original header } else { return ((HttpServletRequest) getRequest()).getHeader(name); } } } @Override public Enumeration<String> getHeaders(String name) { Enumeration<String> parentHeaders = super.getHeaders(name); List<String> values = new ArrayList<String>(); if (!overriddenHeaders.contains(name)) { // this header was overidden so we are ignoreing the original header with this name while (parentHeaders.hasMoreElements()) { values.add(parentHeaders.nextElement()); } } if (headerMap.containsKey(name)) { List<String> valueList = headerMap.get(name); for (String s : valueList) { String[] splitValues = s.split(","); Collections.addAll(values, splitValues); } } return Collections.enumeration(values); } public Map<String, List<String>> getHeaderMap() { return headerMap; } public void setHeaderMap(Map<String, List<String>> headerMap) { this.headerMap = headerMap; } public Set<String> getOverriddenHeaders() { return overriddenHeaders; } public void setOverriddenHeaders(Set<String> overridenHeaders) { this.overriddenHeaders = overridenHeaders; } }