/* * Copyright (C) 2014 Square, Inc. * * Licensed 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 okhttp3.internal.http2; import okhttp3.internal.Util; import okio.ByteString; /** HTTP header: the name is an ASCII string, but the value can be UTF-8. */ public final class Header { // Special header names defined in HTTP/2 spec. public static final ByteString PSEUDO_PREFIX = ByteString.encodeUtf8(":"); 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"); /** 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 Util.format("%s: %s", name.utf8(), value.utf8()); } }