Home | History | Annotate | Download | only in http
      1 /*
      2  * Copyright (C) 2012 Square, Inc.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.squareup.okhttp.internal.http;
     17 
     18 import com.squareup.okhttp.Headers;
     19 import com.squareup.okhttp.Protocol;
     20 import com.squareup.okhttp.Request;
     21 import com.squareup.okhttp.Response;
     22 import com.squareup.okhttp.internal.spdy.Header;
     23 import java.io.IOException;
     24 import java.util.List;
     25 import org.junit.Test;
     26 
     27 import static com.squareup.okhttp.internal.Util.headerEntries;
     28 import static org.junit.Assert.assertEquals;
     29 import static org.junit.Assert.assertNull;
     30 
     31 public final class HeadersTest {
     32   @Test public void parseNameValueBlock() throws IOException {
     33     List<Header> headerBlock = headerEntries(
     34         "cache-control", "no-cache, no-store",
     35         "set-cookie", "Cookie1\u0000Cookie2",
     36         ":status", "200 OK",
     37         ":version", "HTTP/1.1");
     38     Request request = new Request.Builder().url("http://square.com/").build();
     39     Response response =
     40         SpdyTransport.readNameValueBlock(headerBlock, Protocol.SPDY_3).request(request).build();
     41     Headers headers = response.headers();
     42     assertEquals(4, headers.size());
     43     assertEquals("HTTP/1.1 200 OK", response.statusLine());
     44     assertEquals("no-cache, no-store", headers.get("cache-control"));
     45     assertEquals("Cookie2", headers.get("set-cookie"));
     46     assertEquals(Protocol.SPDY_3.name.utf8(), headers.get(OkHeaders.SELECTED_PROTOCOL));
     47     assertEquals(OkHeaders.SELECTED_PROTOCOL, headers.name(0));
     48     assertEquals(Protocol.SPDY_3.name.utf8(), headers.value(0));
     49     assertEquals("cache-control", headers.name(1));
     50     assertEquals("no-cache, no-store", headers.value(1));
     51     assertEquals("set-cookie", headers.name(2));
     52     assertEquals("Cookie1", headers.value(2));
     53     assertEquals("set-cookie", headers.name(3));
     54     assertEquals("Cookie2", headers.value(3));
     55     assertNull(headers.get(":status"));
     56     assertNull(headers.get(":version"));
     57   }
     58 
     59   @Test public void readNameValueBlockDropsForbiddenHeadersSpdy3() throws IOException {
     60     List<Header> headerBlock = headerEntries(
     61         ":status", "200 OK",
     62         ":version", "HTTP/1.1",
     63         "connection", "close");
     64     Request request = new Request.Builder().url("http://square.com/").build();
     65     Response response =
     66         SpdyTransport.readNameValueBlock(headerBlock, Protocol.SPDY_3).request(request).build();
     67     Headers headers = response.headers();
     68     assertEquals(1, headers.size());
     69     assertEquals(OkHeaders.SELECTED_PROTOCOL, headers.name(0));
     70     assertEquals(Protocol.SPDY_3.name.utf8(), headers.value(0));
     71   }
     72 
     73   @Test public void readNameValueBlockDropsForbiddenHeadersHttp2() throws IOException {
     74     List<Header> headerBlock = headerEntries(
     75         ":status", "200 OK",
     76         ":version", "HTTP/1.1",
     77         "connection", "close");
     78     Request request = new Request.Builder().url("http://square.com/").build();
     79     Response response = SpdyTransport.readNameValueBlock(headerBlock, Protocol.HTTP_2)
     80         .request(request).build();
     81     Headers headers = response.headers();
     82     assertEquals(1, headers.size());
     83     assertEquals(OkHeaders.SELECTED_PROTOCOL, headers.name(0));
     84     assertEquals(Protocol.HTTP_2.name.utf8(), headers.value(0));
     85   }
     86 
     87   @Test public void toNameValueBlock() {
     88     Request request = new Request.Builder()
     89         .url("http://square.com/")
     90         .header("cache-control", "no-cache, no-store")
     91         .addHeader("set-cookie", "Cookie1")
     92         .addHeader("set-cookie", "Cookie2")
     93         .header(":status", "200 OK")
     94         .build();
     95     List<Header> headerBlock =
     96         SpdyTransport.writeNameValueBlock(request, Protocol.SPDY_3, "HTTP/1.1");
     97     List<Header> expected = headerEntries(
     98         ":method", "GET",
     99         ":path", "/",
    100         ":version", "HTTP/1.1",
    101         ":host", "square.com",
    102         ":scheme", "http",
    103         "cache-control", "no-cache, no-store",
    104         "set-cookie", "Cookie1\u0000Cookie2",
    105         ":status", "200 OK");
    106     assertEquals(expected, headerBlock);
    107   }
    108 
    109   @Test public void toNameValueBlockDropsForbiddenHeadersSpdy3() {
    110     Request request = new Request.Builder()
    111         .url("http://square.com/")
    112         .header("Connection", "close")
    113         .header("Transfer-Encoding", "chunked")
    114         .build();
    115     List<Header> expected = headerEntries(
    116         ":method", "GET",
    117         ":path", "/",
    118         ":version", "HTTP/1.1",
    119         ":host", "square.com",
    120         ":scheme", "http");
    121     assertEquals(expected, SpdyTransport.writeNameValueBlock(request, Protocol.SPDY_3, "HTTP/1.1"));
    122   }
    123 
    124   @Test public void toNameValueBlockDropsForbiddenHeadersHttp2() {
    125     Request request = new Request.Builder()
    126         .url("http://square.com/")
    127         .header("Connection", "upgrade")
    128         .header("Upgrade", "websocket")
    129         .build();
    130     List<Header> expected = headerEntries(
    131         ":method", "GET",
    132         ":path", "/",
    133         ":authority", "square.com",
    134         ":scheme", "http");
    135     assertEquals(expected,
    136         SpdyTransport.writeNameValueBlock(request, Protocol.HTTP_2, "HTTP/1.1"));
    137   }
    138 }
    139