1 package com.squareup.okhttp.internal.spdy; 2 3 import okio.ByteString; 4 5 /** HTTP header: the name is an ASCII string, but the value can be UTF-8. */ 6 public final class Header { 7 // Special header names defined in the SPDY and HTTP/2 specs. 8 public static final ByteString RESPONSE_STATUS = ByteString.encodeUtf8(":status"); 9 public static final ByteString TARGET_METHOD = ByteString.encodeUtf8(":method"); 10 public static final ByteString TARGET_PATH = ByteString.encodeUtf8(":path"); 11 public static final ByteString TARGET_SCHEME = ByteString.encodeUtf8(":scheme"); 12 public static final ByteString TARGET_AUTHORITY = ByteString.encodeUtf8(":authority"); // http/2 13 public static final ByteString TARGET_HOST = ByteString.encodeUtf8(":host"); // spdy/3 14 public static final ByteString VERSION = ByteString.encodeUtf8(":version"); // spdy/3 15 16 /** Name in case-insensitive ASCII encoding. */ 17 public final ByteString name; 18 /** Value in UTF-8 encoding. */ 19 public final ByteString value; 20 final int hpackSize; 21 22 // TODO: search for toLowerCase and consider moving logic here. 23 public Header(String name, String value) { 24 this(ByteString.encodeUtf8(name), ByteString.encodeUtf8(value)); 25 } 26 27 public Header(ByteString name, String value) { 28 this(name, ByteString.encodeUtf8(value)); 29 } 30 31 public Header(ByteString name, ByteString value) { 32 this.name = name; 33 this.value = value; 34 this.hpackSize = 32 + name.size() + value.size(); 35 } 36 37 @Override public boolean equals(Object other) { 38 if (other instanceof Header) { 39 Header that = (Header) other; 40 return this.name.equals(that.name) 41 && this.value.equals(that.value); 42 } 43 return false; 44 } 45 46 @Override public int hashCode() { 47 int result = 17; 48 result = 31 * result + name.hashCode(); 49 result = 31 * result + value.hashCode(); 50 return result; 51 } 52 53 @Override public String toString() { 54 return String.format("%s: %s", name.utf8(), value.utf8()); 55 } 56 } 57