15f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen/* 25f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Copyright (C) 2010 The Android Open Source Project 35f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * 45f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Licensed under the Apache License, Version 2.0 (the "License"); 55f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * you may not use this file except in compliance with the License. 65f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * You may obtain a copy of the License at 75f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * 85f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * http://www.apache.org/licenses/LICENSE-2.0 95f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * 105f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Unless required by applicable law or agreed to in writing, software 115f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * distributed under the License is distributed on an "AS IS" BASIS, 125f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * See the License for the specific language governing permissions and 145f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * limitations under the License. 155f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 165f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 175f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenpackage coretestutils.http; 185f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 195f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport static coretestutils.http.MockWebServer.ASCII; 205f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 215f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.io.ByteArrayInputStream; 225f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.io.ByteArrayOutputStream; 235f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.io.File; 245f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.io.FileInputStream; 255f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.io.FileNotFoundException; 265f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.io.InputStream; 275f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.io.IOException; 285f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.io.UnsupportedEncodingException; 295f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.util.ArrayList; 305f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.util.HashMap; 315f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.util.List; 325f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport java.util.Map; 335f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 345f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenimport android.util.Log; 355f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 365f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen/** 375f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * A scripted response to be replayed by the mock web server. 385f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 395f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyenpublic class MockResponse { 405f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen private static final byte[] EMPTY_BODY = new byte[0]; 415f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen static final String LOG_TAG = "coretestutils.http.MockResponse"; 425f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 435f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen private String status = "HTTP/1.1 200 OK"; 445f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen private Map<String, String> headers = new HashMap<String, String>(); 455f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen private byte[] body = EMPTY_BODY; 465f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen private boolean closeConnectionAfter = false; 475f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen private String closeConnectionAfterHeader = null; 485f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen private int closeConnectionAfterXBytes = -1; 495f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen private int pauseConnectionAfterXBytes = -1; 505f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen private File bodyExternalFile = null; 515f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 525f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse() { 535f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen addHeader("Content-Length", 0); 545f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 555f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 565f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 575f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Returns the HTTP response line, such as "HTTP/1.1 200 OK". 585f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 595f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public String getStatus() { 605f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return status; 615f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 625f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 635f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse setResponseCode(int code) { 645f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen this.status = "HTTP/1.1 " + code + " OK"; 655f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return this; 665f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 675f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 685f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 695f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Returns the HTTP headers, such as "Content-Length: 0". 705f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 715f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public List<String> getHeaders() { 725f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen List<String> headerStrings = new ArrayList<String>(); 735f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen for (String header : headers.keySet()) { 745f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen headerStrings.add(header + ": " + headers.get(header)); 755f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 765f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return headerStrings; 775f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 785f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 795f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse addHeader(String header, String value) { 805f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen headers.put(header.toLowerCase(), value); 815f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return this; 825f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 835f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 845f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse addHeader(String header, long value) { 855f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return addHeader(header, Long.toString(value)); 865f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 875f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 885f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse removeHeader(String header) { 895f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen headers.remove(header.toLowerCase()); 905f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return this; 915f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 925f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 935f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 945f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Returns true if the body should come from an external file, false otherwise. 955f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 965f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen private boolean bodyIsExternal() { 975f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return bodyExternalFile != null; 985f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 995f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1005f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 1015f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Returns an input stream containing the raw HTTP payload. 1025f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 1035f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public InputStream getBody() { 1045f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen if (bodyIsExternal()) { 1055f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen try { 1065f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return new FileInputStream(bodyExternalFile); 1075f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } catch (FileNotFoundException e) { 1085f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen Log.e(LOG_TAG, "File not found: " + bodyExternalFile.getAbsolutePath()); 1095f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1105f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1115f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return new ByteArrayInputStream(this.body); 1125f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1135f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1145f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse setBody(File body) { 1155f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen addHeader("Content-Length", body.length()); 1165f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen this.bodyExternalFile = body; 1175f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return this; 1185f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1195f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1205f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse setBody(byte[] body) { 1215f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen addHeader("Content-Length", body.length); 1225f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen this.body = body; 1235f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return this; 1245f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1255f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1265f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse setBody(String body) { 1275f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen try { 1285f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return setBody(body.getBytes(ASCII)); 1295f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } catch (UnsupportedEncodingException e) { 1305f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen throw new AssertionError(); 1315f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1325f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1335f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1345f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 1355f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Sets the body as chunked. 1365f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * 1375f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Currently chunked body is not supported for external files as bodies. 1385f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 1395f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse setChunkedBody(byte[] body, int maxChunkSize) throws IOException { 1405f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen addHeader("Transfer-encoding", "chunked"); 1415f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1425f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); 1435f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen int pos = 0; 1445f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen while (pos < body.length) { 1455f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen int chunkSize = Math.min(body.length - pos, maxChunkSize); 1465f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen bytesOut.write(Integer.toHexString(chunkSize).getBytes(ASCII)); 1475f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen bytesOut.write("\r\n".getBytes(ASCII)); 1485f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen bytesOut.write(body, pos, chunkSize); 1495f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen bytesOut.write("\r\n".getBytes(ASCII)); 1505f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen pos += chunkSize; 1515f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1525f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen bytesOut.write("0\r\n".getBytes(ASCII)); 1535f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen this.body = bytesOut.toByteArray(); 1545f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return this; 1555f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1565f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1575f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse setChunkedBody(String body, int maxChunkSize) throws IOException { 1585f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return setChunkedBody(body.getBytes(ASCII), maxChunkSize); 1595f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1605f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1615f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen @Override public String toString() { 1625f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return status; 1635f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1645f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1655f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public boolean shouldCloseConnectionAfter() { 1665f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return closeConnectionAfter; 1675f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1685f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1695f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse setCloseConnectionAfter(boolean closeConnectionAfter) { 1705f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen this.closeConnectionAfter = closeConnectionAfter; 1715f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return this; 1725f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1735f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1745f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 1755f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Sets the header after which sending the server should close the connection. 1765f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 1775f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse setCloseConnectionAfterHeader(String header) { 1785f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen closeConnectionAfterHeader = header; 1795f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen setCloseConnectionAfter(true); 1805f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return this; 1815f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1825f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1835f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 1845f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Returns the header after which sending the server should close the connection. 1855f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 1865f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public String getCloseConnectionAfterHeader() { 1875f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return closeConnectionAfterHeader; 1885f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1895f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 1905f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 1915f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Sets the number of bytes in the body to send before which the server should close the 1925f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * connection. Set to -1 to unset and send the entire body (default). 1935f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 1945f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse setCloseConnectionAfterXBytes(int position) { 1955f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen closeConnectionAfterXBytes = position; 1965f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen setCloseConnectionAfter(true); 1975f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return this; 1985f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 1995f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 2005f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 2015f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Returns the number of bytes in the body to send before which the server should close the 2025f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * connection. Returns -1 if the entire body should be sent (default). 2035f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 2045f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public int getCloseConnectionAfterXBytes() { 2055f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return closeConnectionAfterXBytes; 2065f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 2075f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 2085f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 2095f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Sets the number of bytes in the body to send before which the server should pause the 2105f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * connection (stalls in sending data). Only one pause per response is supported. 2115f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Set to -1 to unset pausing (default). 2125f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 2135f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public MockResponse setPauseConnectionAfterXBytes(int position) { 2145f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen pauseConnectionAfterXBytes = position; 2155f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return this; 2165f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 2175f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 2185f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 2195f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Returns the number of bytes in the body to send before which the server should pause the 2205f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * connection (stalls in sending data). (Returns -1 if it should not pause). 2215f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 2225f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public int getPauseConnectionAfterXBytes() { 2235f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return pauseConnectionAfterXBytes; 2245f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 2255f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 2265f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 2275f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Returns true if this response is flagged to pause the connection mid-stream, false otherwise 2285f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 2295f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public boolean getShouldPause() { 2305f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return (pauseConnectionAfterXBytes != -1); 2315f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 2325f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen 2335f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen /** 2345f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen * Returns true if this response is flagged to close the connection mid-stream, false otherwise 2355f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen */ 2365f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen public boolean getShouldClose() { 2375f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen return (closeConnectionAfterXBytes != -1); 2385f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen } 2395f53bca55b2c9e217dee12bff8ce55e168829783Neal Nguyen} 240