package io.myweb.http;
import java.util.*;
public class Headers {
private static final int HEADERS_INITIAL_CAPACITY = 20;
private final List<Header> headerList;
public Headers() {
headerList = new ArrayList<Header>(HEADERS_INITIAL_CAPACITY);
}
public static final class REQUEST {
public static final String ACCEPT = "Accept";
public static final String ACCEPT_CHAR = "Accept-Charset";
public static final String ACCEPT_ENC = "Accept-Encoding";
public static final String ACCEPT_LANG = "Accept-Language";
public static final String ACCEPT_DATE = "Accept-Datetime";
public static final String AUTH = "Authorization";
public static final String CACHE_CTRL = "Cache-Control";
public static final String CONNECTION = "Connection";
public static final String COOKIE = "Cookie";
public static final String CONTENT_LEN = "Content-Length";
public static final String CONTENT_MD5 = "Content-MD5";
public static final String CONTENT_TYPE = "Content-Type";
public static final String DATE = "Date";
public static final String EXPECT = "Expect";
public static final String FROM = "From";
public static final String HOST = "Host";
public static final String IF_MATCH = "If-Match";
public static final String IF_MOD_SINCE = "If-Modified-Since";
public static final String IF_NONE_MATCH = "If-None-Match";
public static final String IF_RANGE = "If-Range";
public static final String IF_UNMOD_SINCE = "If-Unmodified-Since";
public static final String MAX_FORWARDS = "Max-Forwards";
public static final String ORIGIN = "Origin";
public static final String PRAGMA = "Pragma";
public static final String PROXY_AUTH = "Proxy-Authorization";
public static final String RANGE = "Range";
public static final String REFERER = "Referer";
public static final String TE = "TE";
public static final String USER_AGENT = "User-Agent";
public static final String UPGRADE = "Upgrade";
public static final String VIA = "Via";
public static final String Warning = "Warning";
}
public static final class RESPONSE {
public static final String ACCESS_CTRL_ORIGIN = "Access-Control-Allow-Origin";
public static final String ACCEPT_RANGES = "Accept-Ranges";
public static final String AGE = "Age";
public static final String ALLOW = "Allow";
public static final String CACHE_CTRL = "Cache-Control";
public static final String CONNECTION = REQUEST.CONNECTION;
public static final String CONTENT_ENC = "Content-Encoding";
public static final String CONTENT_LANG = "Content-Language";
public static final String CONTENT_LEN = REQUEST.CONTENT_LEN;
public static final String CONTENT_LOC = "Content-Location";
public static final String CONTENT_MD5 = REQUEST.CONTENT_MD5;
public static final String CONTENT_DISP = "Content-Disposition";
public static final String CONTENT_RANGE = "Content-Range";
public static final String CONTENT_TYPE = REQUEST.CONTENT_TYPE;
public static final String DATE = REQUEST.DATE;
public static final String ETAG = "ETag";
public static final String EXPIRES = "Expires";
public static final String LAST_MOD = "Last-Modified";
public static final String LINK = "Link";
public static final String LOCATION = "Location";
public static final String P3P = "P3P";
public static final String PRAGMA = REQUEST.PRAGMA;
public static final String PROXY_AUTH = "Proxy-Authenticate";
public static final String REFRESH = "Refresh";
public static final String RETRY_AFTER = "Retry-After";
public static final String SET_COOKIE = "Set-Cookie";
public static final String STATUS = "Status";
public static final String STRICT_TRANS_SEC = "Strict-Transport-Security";
public static final String TRAILER = "Trailer";
public static final String TRANSFER_ENC = "Transfer-Encoding";
public static final String CONTENT_TRANSFER_ENC = "Content-Transfer-Encoding";
public static final String UPGRADE = REQUEST.UPGRADE;
public static final String VARY = "Vary";
public static final String VIA = REQUEST.VIA;
public static final String WARNING = REQUEST.Warning;
public static final String WWW_AUTH = "WWW-Authenticate";
}
public static final class X {
public static final String FRAME_OPTIONS = "X-Frame-Options";
public static final String REQUESTED_WITH = "X-Requested-With";
public static final String DNT = "DNT";
public static final String FWD_FOR = "X-Forwarded-For";
public static final String FWD_PROTO = "X-Forwarded-Proto";
public static final String ATT_DEVICE_ID = "X-ATT-DeviceId";
public static final String WAP_PROFILE = "X-Wap-Profile";
public static final String PK_PINS = "Public-Key-Pins";
public static final String XSS_PROTECT = "X-XSS-Protection";
public static final String CSP = "X-Content-Security-Policy";
public static final String CTO = "X-Content-Type-Options";
public static final String POWERED_BY = "X-Powered-By";
public static final String UA_COMPATIBLE = "X-UA-Compatible";
public static final String MYWEB_ID ="X-Myweb-Request-Id";
}
public static final class Header {
private final String name;
private String value;
public Header(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return name + ": " + value + "\r\n";
}
public static Header parse(String line) {
if (line == null) return null;
String[] splits = line.split(": ", 2);
if (splits.length == 2) {
return new Header(splits[0], splits[1]);
} else return new Headers.Header(splits[0], "");
}
}
public void add(Header h) {
if (h != null) headerList.add(h);
}
public void add(String name, String value) {
add(new Header(name, value));
}
public void update(String name, String value) {
Header header = findFirst(name);
if (header != null) {
if (value == null) remove(header);
else header.setValue(value);
}
else add(name, value);
}
public void setCookie(Cookie cookie) {
add(RESPONSE.SET_COOKIE, cookie.toString());
}
public void remove(Header h) {
headerList.remove(h);
}
public void remove(String name) {
for (Header h : headerList) {
if (h.getName().equals(name)) headerList.remove(h);
}
}
public Header findFirst(String name) {
for (Header h : headerList) {
if (h.getName().equalsIgnoreCase(name)) return h;
}
return null;
}
public String get(String name) {
Header header = findFirst(name);
if (header != null) return header.getValue();
return null;
}
public List<Header> findAll(String name) {
List<Header> vals = new LinkedList<Header>();
for (Header h : headerList) {
if (h.getName().equals(name)) vals.add(h);
}
if (vals.isEmpty()) {
return Collections.emptyList();
}
return Collections.unmodifiableList(vals);
}
public String toString() {
StringBuilder sb = new StringBuilder();
for (Header h : headerList)
sb.append(h.toString());
return sb.toString();
}
public static Headers parse(String lines) {
Headers headers = new Headers();
for (String line : lines.split("\\r\\n")) {
headers.add(Header.parse(line));
}
return headers;
}
}