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