package com.koushikdutta.async.http.spdy; import java.util.Locale; /** HTTP header: the name is an ASCII string, but the value can be UTF-8. */ final class Header { // Special header names defined in the SPDY and HTTP/2 specs. public static final ByteString RESPONSE_STATUS = ByteString.encodeUtf8(":status"); public static final ByteString TARGET_METHOD = ByteString.encodeUtf8(":method"); public static final ByteString TARGET_PATH = ByteString.encodeUtf8(":path"); public static final ByteString TARGET_SCHEME = ByteString.encodeUtf8(":scheme"); public static final ByteString TARGET_AUTHORITY = ByteString.encodeUtf8(":authority"); // HTTP/2 public static final ByteString TARGET_HOST = ByteString.encodeUtf8(":host"); // spdy/3 public static final ByteString VERSION = ByteString.encodeUtf8(":version"); // spdy/3 /** Name in case-insensitive ASCII encoding. */ public final ByteString name; /** Value in UTF-8 encoding. */ public final ByteString value; final int hpackSize; // TODO: search for toLowerCase and consider moving logic here. public Header(String name, String value) { this(ByteString.encodeUtf8(name), ByteString.encodeUtf8(value)); } public Header(ByteString name, String value) { this(name, ByteString.encodeUtf8(value)); } public Header(ByteString name, ByteString value) { this.name = name; this.value = value; this.hpackSize = 32 + name.size() + value.size(); } @Override public boolean equals(Object other) { if (other instanceof Header) { Header that = (Header) other; return this.name.equals(that.name) && this.value.equals(that.value); } return false; } @Override public int hashCode() { int result = 17; result = 31 * result + name.hashCode(); result = 31 * result + value.hashCode(); return result; } @Override public String toString() { return String.format(Locale.ENGLISH, "%s: %s", name.utf8(), value.utf8()); } }