blob: fd66fdaea2e97b0f6b8da4c7811986c7e2c1d264 [file] [log] [blame]
package com.squareup.okhttp.apache;
import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.MockWebServer;
import com.squareup.okhttp.mockwebserver.RecordedRequest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.zip.GZIPInputStream;
import okio.Buffer;
import okio.GzipSink;
import okio.Okio;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static com.squareup.okhttp.internal.Util.UTF_8;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
public class OkApacheClientTest {
private MockWebServer server;
private OkApacheClient client;
@Before public void setUp() throws IOException {
client = new OkApacheClient();
server = new MockWebServer();
server.start();
}
@After public void tearDown() throws IOException {
server.shutdown();
}
@Test public void success() throws Exception {
server.enqueue(new MockResponse().setBody("Hello, World!"));
HttpGet request = new HttpGet(server.getUrl("/").toURI());
HttpResponse response = client.execute(request);
String actual = EntityUtils.toString(response.getEntity());
assertEquals("Hello, World!", actual);
}
@Test public void redirect() throws Exception {
server.enqueue(new MockResponse().setResponseCode(302).addHeader("Location", "/foo"));
server.enqueue(new MockResponse().setBody("Hello, Redirect!"));
HttpGet request = new HttpGet(server.getUrl("/").toURI());
HttpResponse response = client.execute(request);
String actual = EntityUtils.toString(response.getEntity(), UTF_8);
assertEquals("Hello, Redirect!", actual);
}
@Test public void sessionExpired() throws Exception {
server.enqueue(new MockResponse().setResponseCode(422));
HttpGet request = new HttpGet(server.getUrl("/").toURI());
HttpResponse response = client.execute(request);
assertEquals(422, response.getStatusLine().getStatusCode());
}
@Test public void headers() throws Exception {
server.enqueue(new MockResponse().addHeader("Foo", "Bar"));
server.enqueue(new MockResponse().addHeader("Foo", "Bar").addHeader("Foo", "Baz"));
HttpGet request1 = new HttpGet(server.getUrl("/").toURI());
HttpResponse response1 = client.execute(request1);
Header[] headers1 = response1.getHeaders("Foo");
assertEquals(1, headers1.length);
assertEquals("Bar", headers1[0].getValue());
HttpGet request2 = new HttpGet(server.getUrl("/").toURI());
HttpResponse response2 = client.execute(request2);
Header[] headers2 = response2.getHeaders("Foo");
assertEquals(2, headers2.length);
assertEquals("Bar", headers2[0].getValue());
assertEquals("Baz", headers2[1].getValue());
}
@Test public void postByteEntity() throws Exception {
server.enqueue(new MockResponse());
final HttpPost post = new HttpPost(server.getUrl("/").toURI());
byte[] body = "Hello, world!".getBytes(UTF_8);
post.setEntity(new ByteArrayEntity(body));
client.execute(post);
RecordedRequest request = server.takeRequest();
assertEquals("Hello, world!", request.getBody().readUtf8());
assertEquals(request.getHeader("Content-Length"), "13");
}
@Test public void postInputStreamEntity() throws Exception {
server.enqueue(new MockResponse());
final HttpPost post = new HttpPost(server.getUrl("/").toURI());
byte[] body = "Hello, world!".getBytes(UTF_8);
post.setEntity(new InputStreamEntity(new ByteArrayInputStream(body), body.length));
client.execute(post);
RecordedRequest request = server.takeRequest();
assertEquals("Hello, world!", request.getBody().readUtf8());
assertEquals(request.getHeader("Content-Length"), "13");
}
@Test public void postOverrideContentType() throws Exception {
server.enqueue(new MockResponse());
HttpPost httpPost = new HttpPost();
httpPost.setURI(server.getUrl("/").toURI());
httpPost.addHeader("Content-Type", "application/xml");
httpPost.setEntity(new StringEntity("<yo/>"));
client.execute(httpPost);
RecordedRequest request = server.takeRequest();
assertEquals(request.getHeader("Content-Type"), "application/xml");
}
@Test public void contentType() throws Exception {
server.enqueue(new MockResponse().setBody("<html><body><h1>Hello, World!</h1></body></html>")
.setHeader("Content-Type", "text/html"));
server.enqueue(new MockResponse().setBody("{\"Message\": { \"text\": \"Hello, World!\" } }")
.setHeader("Content-Type", "application/json"));
server.enqueue(new MockResponse().setBody("Hello, World!"));
HttpGet request1 = new HttpGet(server.getUrl("/").toURI());
HttpResponse response1 = client.execute(request1);
Header[] headers1 = response1.getHeaders("Content-Type");
assertEquals(1, headers1.length);
assertEquals("text/html", headers1[0].getValue());
assertNotNull(response1.getEntity().getContentType());
assertEquals("text/html", response1.getEntity().getContentType().getValue());
HttpGet request2 = new HttpGet(server.getUrl("/").toURI());
HttpResponse response2 = client.execute(request2);
Header[] headers2 = response2.getHeaders("Content-Type");
assertEquals(1, headers2.length);
assertEquals("application/json", headers2[0].getValue());
assertNotNull(response2.getEntity().getContentType());
assertEquals("application/json", response2.getEntity().getContentType().getValue());
HttpGet request3 = new HttpGet(server.getUrl("/").toURI());
HttpResponse response3 = client.execute(request3);
Header[] headers3 = response3.getHeaders("Content-Type");
assertEquals(0, headers3.length);
assertNull(response3.getEntity().getContentType());
}
@Test public void contentTypeIsCaseInsensitive() throws URISyntaxException, IOException {
server.enqueue(new MockResponse().setBody("{\"Message\": { \"text\": \"Hello, World!\" } }")
.setHeader("cONTENT-tYPE", "application/json"));
HttpGet request = new HttpGet(server.getUrl("/").toURI());
HttpResponse response = client.execute(request);
assertEquals("application/json", response.getEntity().getContentType().getValue());
}
@Test public void contentEncoding() throws Exception {
String text = "{\"Message\": { \"text\": \"Hello, World!\" } }";
server.enqueue(new MockResponse().setBody(gzip(text))
.setHeader("Content-Encoding", "gzip"));
HttpGet request = new HttpGet(server.getUrl("/").toURI());
request.setHeader("Accept-encoding", "gzip"); // Not transparent gzip.
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
Header[] encodingHeaders = response.getHeaders("Content-Encoding");
assertEquals(1, encodingHeaders.length);
assertEquals("gzip", encodingHeaders[0].getValue());
assertNotNull(entity.getContentEncoding());
assertEquals("gzip", entity.getContentEncoding().getValue());
assertEquals(text, gunzip(entity));
}
@Test public void jsonGzipResponse() throws Exception {
String text = "{\"Message\": { \"text\": \"Hello, World!\" } }";
server.enqueue(new MockResponse().setBody(gzip(text))
.setHeader("Content-Encoding", "gzip")
.setHeader("Content-Type", "application/json"));
HttpGet request1 = new HttpGet(server.getUrl("/").toURI());
request1.setHeader("Accept-encoding", "gzip"); // Not transparent gzip.
HttpResponse response = client.execute(request1);
HttpEntity entity = response.getEntity();
Header[] encodingHeaders = response.getHeaders("Content-Encoding");
assertEquals(1, encodingHeaders.length);
assertEquals("gzip", encodingHeaders[0].getValue());
assertNotNull(entity.getContentEncoding());
assertEquals("gzip", entity.getContentEncoding().getValue());
Header[] typeHeaders = response.getHeaders("Content-Type");
assertEquals(1, typeHeaders.length);
assertEquals("application/json", typeHeaders[0].getValue());
assertNotNull(entity.getContentType());
assertEquals("application/json", entity.getContentType().getValue());
assertEquals(text, gunzip(entity));
}
@Test public void jsonTransparentGzipResponse() throws Exception {
String text = "{\"Message\": { \"text\": \"Hello, World!\" } }";
server.enqueue(new MockResponse().setBody(gzip(text))
.setHeader("Content-Encoding", "gzip")
.setHeader("Content-Type", "application/json"));
HttpGet request = new HttpGet(server.getUrl("/").toURI());
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
// Expecting transparent gzip response by not adding header "Accept-encoding: gzip"
Header[] encodingHeaders = response.getHeaders("Content-Encoding");
assertEquals(0, encodingHeaders.length);
assertNull(entity.getContentEncoding());
// Content length should be absent.
Header[] lengthHeaders = response.getHeaders("Content-Length");
assertEquals(0, lengthHeaders.length);
assertEquals(-1, entity.getContentLength());
Header[] typeHeaders = response.getHeaders("Content-Type");
assertEquals(1, typeHeaders.length);
assertEquals("application/json", typeHeaders[0].getValue());
assertNotNull(entity.getContentType());
assertEquals("application/json", entity.getContentType().getValue());
assertEquals(text, EntityUtils.toString(entity, UTF_8));
}
private static Buffer gzip(String body) throws IOException {
Buffer buffer = new Buffer();
Okio.buffer(new GzipSink(buffer)).writeUtf8(body).close();
return buffer;
}
private static String gunzip(HttpEntity body) throws IOException {
InputStream in = new GZIPInputStream(body.getContent());
Buffer buffer = new Buffer();
byte[] temp = new byte[1024];
int read;
while ((read = in.read(temp)) != -1) {
buffer.write(temp, 0, read);
}
return buffer.readUtf8();
}
}