From 6594b2a8999dce7787010652d6767cf0af1bd491 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@cf848351-439f-e86a-257f-67fa721851d5> Date: Wed, 25 May 2011 05:18:01 +0000 Subject: [PATCH 01/43] Initial directory structure. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@1 cf848351-439f-e86a-257f-67fa721851d5 From 0c4790dafaf6ccf7d8d34d04d24aac65cac910eb Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Wed, 25 May 2011 05:40:16 +0000 Subject: [PATCH 02/43] Initial checkin of MockWebServer. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@2 cf848351-439f-e86a-257f-67fa721851d5 --- COPYING | 202 +++++++ build.xml | 22 + .../google/mockwebserver/MockResponse.java | 146 +++++ .../google/mockwebserver/MockWebServer.java | 503 ++++++++++++++++++ .../google/mockwebserver/RecordedRequest.java | 85 +++ .../google/mockwebserver/SocketPolicy.java | 64 +++ 6 files changed, 1022 insertions(+) create mode 100644 COPYING create mode 100644 build.xml create mode 100644 src/main/java/com/google/mockwebserver/MockResponse.java create mode 100644 src/main/java/com/google/mockwebserver/MockWebServer.java create mode 100644 src/main/java/com/google/mockwebserver/RecordedRequest.java create mode 100644 src/main/java/com/google/mockwebserver/SocketPolicy.java diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/COPYING @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/build.xml b/build.xml new file mode 100644 index 000000000..d058f1f58 --- /dev/null +++ b/build.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/google/mockwebserver/MockResponse.java b/src/main/java/com/google/mockwebserver/MockResponse.java new file mode 100644 index 000000000..5d06275cc --- /dev/null +++ b/src/main/java/com/google/mockwebserver/MockResponse.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2011 Google 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 com.google.mockwebserver; + +import static com.google.mockwebserver.MockWebServer.ASCII; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; + +/** + * A scripted response to be replayed by the mock web server. + */ +public final class MockResponse implements Cloneable { + private static final String EMPTY_BODY_HEADER = "Content-Length: 0"; + private static final String CHUNKED_BODY_HEADER = "Transfer-encoding: chunked"; + private static final byte[] EMPTY_BODY = new byte[0]; + + private String status = "HTTP/1.1 200 OK"; + private List headers = new ArrayList(); + private byte[] body = EMPTY_BODY; + private SocketPolicy socketPolicy = SocketPolicy.KEEP_OPEN; + + public MockResponse() { + headers.add(EMPTY_BODY_HEADER); + } + + @Override public MockResponse clone() { + try { + MockResponse result = (MockResponse) super.clone(); + result.headers = new ArrayList(result.headers); + return result; + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + + /** + * Returns the HTTP response line, such as "HTTP/1.1 200 OK". + */ + public String getStatus() { + return status; + } + + public MockResponse setResponseCode(int code) { + this.status = "HTTP/1.1 " + code + " OK"; + return this; + } + + public MockResponse setStatus(String status) { + this.status = status; + return this; + } + + /** + * Returns the HTTP headers, such as "Content-Length: 0". + */ + public List getHeaders() { + return headers; + } + + public MockResponse clearHeaders() { + headers.clear(); + return this; + } + + public MockResponse addHeader(String header) { + headers.add(header); + return this; + } + + /** + * Returns an input stream containing the raw HTTP payload. + */ + public byte[] getBody() { + return body; + } + + public MockResponse setBody(byte[] body) { + if (this.body == EMPTY_BODY) { + headers.remove(EMPTY_BODY_HEADER); + } + this.headers.add("Content-Length: " + body.length); + this.body = body; + return this; + } + + public MockResponse setBody(String body) { + try { + return setBody(body.getBytes(ASCII)); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(); + } + } + + public MockResponse setChunkedBody(byte[] body, int maxChunkSize) throws IOException { + headers.remove(EMPTY_BODY_HEADER); + headers.add(CHUNKED_BODY_HEADER); + + ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); + int pos = 0; + while (pos < body.length) { + int chunkSize = Math.min(body.length - pos, maxChunkSize); + bytesOut.write(Integer.toHexString(chunkSize).getBytes(ASCII)); + bytesOut.write("\r\n".getBytes(ASCII)); + bytesOut.write(body, pos, chunkSize); + bytesOut.write("\r\n".getBytes(ASCII)); + pos += chunkSize; + } + bytesOut.write("0\r\n\r\n".getBytes(ASCII)); // last chunk + empty trailer + crlf + this.body = bytesOut.toByteArray(); + return this; + } + + public MockResponse setChunkedBody(String body, int maxChunkSize) throws IOException { + return setChunkedBody(body.getBytes(ASCII), maxChunkSize); + } + + public SocketPolicy getSocketPolicy() { + return socketPolicy; + } + + public MockResponse setSocketPolicy(SocketPolicy socketPolicy) { + this.socketPolicy = socketPolicy; + return this; + } + + @Override public String toString() { + return status; + } +} diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java new file mode 100644 index 000000000..a938a2779 --- /dev/null +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -0,0 +1,503 @@ +/* + * Copyright (C) 2011 Google 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 com.google.mockwebserver; + +import static com.google.mockwebserver.SocketPolicy.DISCONNECT_AT_START; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.Proxy; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketException; +import java.net.URL; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +/** + * A scriptable web server. Callers supply canned responses and the server + * replays them upon request in sequence. + */ +public final class MockWebServer { + + static final String ASCII = "US-ASCII"; + + private static final Logger logger = Logger.getLogger(MockWebServer.class.getName()); + private final BlockingQueue requestQueue + = new LinkedBlockingQueue(); + private final BlockingQueue responseQueue + = new LinkedBlockingDeque(); + private final Set openClientSockets + = Collections.newSetFromMap(new ConcurrentHashMap()); + private boolean singleResponse; + private final AtomicInteger requestCount = new AtomicInteger(); + private int bodyLimit = Integer.MAX_VALUE; + private ServerSocket serverSocket; + private SSLSocketFactory sslSocketFactory; + private ExecutorService executor; + private boolean tunnelProxy; + + private int port = -1; + + public int getPort() { + if (port == -1) { + throw new IllegalStateException("Cannot retrieve port before calling play()"); + } + return port; + } + + public String getHostName() { + try { + return InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + throw new AssertionError(); + } + } + + public Proxy toProxyAddress() { + return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(getHostName(), getPort())); + } + + /** + * Returns a URL for connecting to this server. + * + * @param path the request path, such as "/". + */ + public URL getUrl(String path) throws MalformedURLException, UnknownHostException { + return sslSocketFactory != null + ? new URL("https://" + getHostName() + ":" + getPort() + path) + : new URL("http://" + getHostName() + ":" + getPort() + path); + } + + /** + * Sets the number of bytes of the POST body to keep in memory to the given + * limit. + */ + public void setBodyLimit(int maxBodyLength) { + this.bodyLimit = maxBodyLength; + } + + /** + * Serve requests with HTTPS rather than otherwise. + * + * @param tunnelProxy whether to expect the HTTP CONNECT method before + * negotiating TLS. + */ + public void useHttps(SSLSocketFactory sslSocketFactory, boolean tunnelProxy) { + this.sslSocketFactory = sslSocketFactory; + this.tunnelProxy = tunnelProxy; + } + + /** + * Awaits the next HTTP request, removes it, and returns it. Callers should + * use this to verify the request sent was as intended. + */ + public RecordedRequest takeRequest() throws InterruptedException { + return requestQueue.take(); + } + + /** + * Returns the number of HTTP requests received thus far by this server. + * This may exceed the number of HTTP connections when connection reuse is + * in practice. + */ + public int getRequestCount() { + return requestCount.get(); + } + + public void enqueue(MockResponse response) { + responseQueue.add(response.clone()); + } + + /** + * By default, this class processes requests coming in by adding them to a + * queue and serves responses by removing them from another queue. This mode + * is appropriate for correctness testing. + * + *

Serving a single response causes the server to be stateless: requests + * are not enqueued, and responses are not dequeued. This mode is appropriate + * for benchmarking. + */ + public void setSingleResponse(boolean singleResponse) { + this.singleResponse = singleResponse; + } + + /** + * Equivalent to {@code play(0)}. + */ + public void play() throws IOException { + play(0); + } + + /** + * Starts the server, serves all enqueued requests, and shuts the server + * down. + * + * @param port the port to listen to, or 0 for any available port. + * Automated tests should always use port 0 to avoid flakiness when a + * specific port is unavailable. + */ + public void play(int port) throws IOException { + executor = Executors.newCachedThreadPool(); + serverSocket = new ServerSocket(port); + serverSocket.setReuseAddress(true); + + this.port = serverSocket.getLocalPort(); + executor.execute(namedRunnable("MockWebServer-accept-" + port, new Runnable() { + public void run() { + try { + acceptConnections(); + } catch (Throwable e) { + logger.log(Level.WARNING, "MockWebServer connection failed", e); + } + + /* + * This gnarly block of code will release all sockets and + * all thread, even if any close fails. + */ + try { + serverSocket.close(); + } catch (Throwable e) { + logger.log(Level.WARNING, "MockWebServer server socket close failed", e); + } + for (Iterator s = openClientSockets.iterator(); s.hasNext();) { + try { + s.next().close(); + s.remove(); + } catch (Throwable e) { + logger.log(Level.WARNING, "MockWebServer socket close failed", e); + } + } + try { + executor.shutdown(); + } catch (Throwable e) { + logger.log(Level.WARNING, "MockWebServer executor shutdown failed", e); + } + } + + private void acceptConnections() throws Exception { + do { + Socket socket; + try { + socket = serverSocket.accept(); + } catch (SocketException ignored) { + continue; + } + MockResponse peek = responseQueue.peek(); + if (peek != null && peek.getSocketPolicy() == DISCONNECT_AT_START) { + responseQueue.take(); + socket.close(); + } else { + openClientSockets.add(socket); + serveConnection(socket); + } + } while (!responseQueue.isEmpty()); + } + })); + } + + public void shutdown() throws IOException { + if (serverSocket != null) { + serverSocket.close(); // should cause acceptConnections() to break out + } + } + + private void serveConnection(final Socket raw) { + String name = "MockWebServer-" + raw.getRemoteSocketAddress(); + executor.execute(namedRunnable(name, new Runnable() { + int sequenceNumber = 0; + + public void run() { + try { + processConnection(); + } catch (Exception e) { + logger.log(Level.WARNING, "MockWebServer connection failed", e); + } + } + + public void processConnection() throws Exception { + Socket socket; + if (sslSocketFactory != null) { + if (tunnelProxy) { + createTunnel(); + } + socket = sslSocketFactory.createSocket( + raw, raw.getInetAddress().getHostAddress(), raw.getPort(), true); + ((SSLSocket) socket).setUseClientMode(false); + openClientSockets.add(socket); + openClientSockets.remove(raw); + } else { + socket = raw; + } + + InputStream in = new BufferedInputStream(socket.getInputStream()); + OutputStream out = new BufferedOutputStream(socket.getOutputStream()); + + while (!responseQueue.isEmpty() && processOneRequest(in, out, socket)) {} + + if (sequenceNumber == 0) { + logger.warning("MockWebServer connection didn't make a request"); + } + + in.close(); + out.close(); + socket.close(); + if (responseQueue.isEmpty()) { + shutdown(); + } + openClientSockets.remove(socket); + } + + /** + * Respond to CONNECT requests until a SWITCH_TO_SSL_AT_END response + * is dispatched. + */ + private void createTunnel() throws IOException, InterruptedException { + while (true) { + MockResponse connect = responseQueue.peek(); + if (!processOneRequest(raw.getInputStream(), raw.getOutputStream(), raw)) { + throw new IllegalStateException("Tunnel without any CONNECT!"); + } + if (connect.getSocketPolicy() == SocketPolicy.UPGRADE_TO_SSL_AT_END) { + return; + } + } + } + + /** + * Reads a request and writes its response. Returns true if a request + * was processed. + */ + private boolean processOneRequest(InputStream in, OutputStream out, Socket socket) + throws IOException, InterruptedException { + RecordedRequest request = readRequest(in, sequenceNumber); + if (request == null) { + return false; + } + MockResponse response = dispatch(request); + writeResponse(out, response); + if (response.getSocketPolicy() == SocketPolicy.DISCONNECT_AT_END) { + in.close(); + out.close(); + } else if (response.getSocketPolicy() == SocketPolicy.SHUTDOWN_INPUT_AT_END) { + socket.shutdownInput(); + } else if (response.getSocketPolicy() == SocketPolicy.SHUTDOWN_OUTPUT_AT_END) { + socket.shutdownOutput(); + } + sequenceNumber++; + return true; + } + })); + } + + /** + * @param sequenceNumber the index of this request on this connection. + */ + private RecordedRequest readRequest(InputStream in, int sequenceNumber) throws IOException { + String request; + try { + request = readAsciiUntilCrlf(in); + } catch (IOException streamIsClosed) { + return null; // no request because we closed the stream + } + if (request.isEmpty()) { + return null; // no request because the stream is exhausted + } + + List headers = new ArrayList(); + int contentLength = -1; + boolean chunked = false; + String header; + while (!(header = readAsciiUntilCrlf(in)).isEmpty()) { + headers.add(header); + String lowercaseHeader = header.toLowerCase(); + if (contentLength == -1 && lowercaseHeader.startsWith("content-length:")) { + contentLength = Integer.parseInt(header.substring(15).trim()); + } + if (lowercaseHeader.startsWith("transfer-encoding:") && + lowercaseHeader.substring(18).trim().equals("chunked")) { + chunked = true; + } + } + + boolean hasBody = false; + TruncatingOutputStream requestBody = new TruncatingOutputStream(); + List chunkSizes = new ArrayList(); + if (contentLength != -1) { + hasBody = true; + transfer(contentLength, in, requestBody); + } else if (chunked) { + hasBody = true; + while (true) { + int chunkSize = Integer.parseInt(readAsciiUntilCrlf(in).trim(), 16); + if (chunkSize == 0) { + readEmptyLine(in); + break; + } + chunkSizes.add(chunkSize); + transfer(chunkSize, in, requestBody); + readEmptyLine(in); + } + } + + if (request.startsWith("OPTIONS ") || request.startsWith("GET ") + || request.startsWith("HEAD ") || request.startsWith("DELETE ") + || request .startsWith("TRACE ") || request.startsWith("CONNECT ")) { + if (hasBody) { + throw new IllegalArgumentException("Request must not have a body: " + request); + } + } else if (request.startsWith("POST ") || request.startsWith("PUT ")) { + if (!hasBody) { + throw new IllegalArgumentException("Request must have a body: " + request); + } + } else { + throw new UnsupportedOperationException("Unexpected method: " + request); + } + + return new RecordedRequest(request, headers, chunkSizes, + requestBody.numBytesReceived, requestBody.toByteArray(), sequenceNumber); + } + + /** + * Returns a response to satisfy {@code request}. + */ + private MockResponse dispatch(RecordedRequest request) throws InterruptedException { + if (responseQueue.isEmpty()) { + throw new IllegalStateException("Unexpected request: " + request); + } + + // to permit interactive/browser testing, ignore requests for favicons + if (request.getRequestLine().equals("GET /favicon.ico HTTP/1.1")) { + System.out.println("served " + request.getRequestLine()); + return new MockResponse() + .setResponseCode(HttpURLConnection.HTTP_NOT_FOUND); + } + + if (singleResponse) { + return responseQueue.peek(); + } else { + requestCount.incrementAndGet(); + requestQueue.add(request); + return responseQueue.take(); + } + } + + private void writeResponse(OutputStream out, MockResponse response) throws IOException { + out.write((response.getStatus() + "\r\n").getBytes(ASCII)); + for (String header : response.getHeaders()) { + out.write((header + "\r\n").getBytes(ASCII)); + } + out.write(("\r\n").getBytes(ASCII)); + out.write(response.getBody()); + out.flush(); + } + + /** + * Transfer bytes from {@code in} to {@code out} until either {@code length} + * bytes have been transferred or {@code in} is exhausted. + */ + private void transfer(int length, InputStream in, OutputStream out) throws IOException { + byte[] buffer = new byte[1024]; + while (length > 0) { + int count = in.read(buffer, 0, Math.min(buffer.length, length)); + if (count == -1) { + return; + } + out.write(buffer, 0, count); + length -= count; + } + } + + /** + * Returns the text from {@code in} until the next "\r\n", or null if + * {@code in} is exhausted. + */ + private String readAsciiUntilCrlf(InputStream in) throws IOException { + StringBuilder builder = new StringBuilder(); + while (true) { + int c = in.read(); + if (c == '\n' && builder.length() > 0 && builder.charAt(builder.length() - 1) == '\r') { + builder.deleteCharAt(builder.length() - 1); + return builder.toString(); + } else if (c == -1) { + return builder.toString(); + } else { + builder.append((char) c); + } + } + } + + private void readEmptyLine(InputStream in) throws IOException { + String line = readAsciiUntilCrlf(in); + if (!line.isEmpty()) { + throw new IllegalStateException("Expected empty but was: " + line); + } + } + + /** + * An output stream that drops data after bodyLimit bytes. + */ + private class TruncatingOutputStream extends ByteArrayOutputStream { + private int numBytesReceived = 0; + @Override public void write(byte[] buffer, int offset, int len) { + numBytesReceived += len; + super.write(buffer, offset, Math.min(len, bodyLimit - count)); + } + @Override public void write(int oneByte) { + numBytesReceived++; + if (count < bodyLimit) { + super.write(oneByte); + } + } + } + + private static Runnable namedRunnable(final String name, final Runnable runnable) { + return new Runnable() { + public void run() { + String originalName = Thread.currentThread().getName(); + Thread.currentThread().setName(name); + try { + runnable.run(); + } finally { + Thread.currentThread().setName(originalName); + } + } + }; + } +} diff --git a/src/main/java/com/google/mockwebserver/RecordedRequest.java b/src/main/java/com/google/mockwebserver/RecordedRequest.java new file mode 100644 index 000000000..8f0908457 --- /dev/null +++ b/src/main/java/com/google/mockwebserver/RecordedRequest.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2011 Google 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 com.google.mockwebserver; + +import java.util.List; + +/** + * An HTTP request that came into the mock web server. + */ +public final class RecordedRequest { + private final String requestLine; + private final List headers; + private final List chunkSizes; + private final int bodySize; + private final byte[] body; + private final int sequenceNumber; + + RecordedRequest(String requestLine, List headers, List chunkSizes, + int bodySize, byte[] body, int sequenceNumber) { + this.requestLine = requestLine; + this.headers = headers; + this.chunkSizes = chunkSizes; + this.bodySize = bodySize; + this.body = body; + this.sequenceNumber = sequenceNumber; + } + + public String getRequestLine() { + return requestLine; + } + + public List getHeaders() { + return headers; + } + + /** + * Returns the sizes of the chunks of this request's body, or an empty list + * if the request's body was empty or unchunked. + */ + public List getChunkSizes() { + return chunkSizes; + } + + /** + * Returns the total size of the body of this POST request (before + * truncation). + */ + public int getBodySize() { + return bodySize; + } + + /** + * Returns the body of this POST request. This may be truncated. + */ + public byte[] getBody() { + return body; + } + + /** + * Returns the index of this request on its HTTP connection. Since a single + * HTTP connection may serve multiple requests, each request is assigned its + * own sequence number. + */ + public int getSequenceNumber() { + return sequenceNumber; + } + + @Override public String toString() { + return requestLine; + } +} diff --git a/src/main/java/com/google/mockwebserver/SocketPolicy.java b/src/main/java/com/google/mockwebserver/SocketPolicy.java new file mode 100644 index 000000000..d256a45ba --- /dev/null +++ b/src/main/java/com/google/mockwebserver/SocketPolicy.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2011 Google 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 com.google.mockwebserver; + +/** + * What should be done with the incoming socket. + */ +public enum SocketPolicy { + + /** + * Keep the socket open after the response. This is the default HTTP/1.1 + * behavior. + */ + KEEP_OPEN, + + /** + * Close the socket after the response. This is the default HTTP/1.0 + * behavior. + */ + DISCONNECT_AT_END, + + /** + * Wrap the socket with SSL at the completion of this request/response + * pair. Used for CONNECT messages to tunnel SSL over an HTTP proxy. + */ + UPGRADE_TO_SSL_AT_END, + + /** + * Request immediate close of connection without even reading the + * request. + * + *

Use to simulate the real life case of losing connection + * because of bugger SSL server close connection when it seems + * something like a compression method or TLS extension it doesn't + * understand, instead of simply ignoring it like it should. + */ + DISCONNECT_AT_START, + + /** + * Shutdown the socket input after sending the response. For testing bad + * behavior. + */ + SHUTDOWN_INPUT_AT_END, + + /** + * Shutdown the socket output after sending the response. For testing bad + * behavior. + */ + SHUTDOWN_OUTPUT_AT_END +} From 7cabedc08ae38c6e94b88a0b72d3af46899f6882 Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Wed, 25 May 2011 06:07:42 +0000 Subject: [PATCH 03/43] Tests for MockWebServer. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@3 cf848351-439f-e86a-257f-67fa721851d5 --- build.xml | 25 ++++++++++ lib/junit.jar | Bin 0 -> 121070 bytes .../mockwebserver/MockWebServerTest.java | 47 ++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 lib/junit.jar create mode 100644 src/test/java/com/google/mockwebserver/MockWebServerTest.java diff --git a/build.xml b/build.xml index d058f1f58..02ec6ea4e 100644 --- a/build.xml +++ b/build.xml @@ -3,10 +3,19 @@ + + + + + + + + @@ -15,6 +24,22 @@ + + + + + + + + + + + + + + + diff --git a/lib/junit.jar b/lib/junit.jar new file mode 100644 index 0000000000000000000000000000000000000000..674d71e89ea154dbe2e3cd032821c22b39e8fd68 GIT binary patch literal 121070 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 F`9DH82$KK+ literal 0 HcmV?d00001 diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java new file mode 100644 index 000000000..038b838df --- /dev/null +++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2011 Google 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 com.google.mockwebserver; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import junit.framework.TestCase; + +public final class MockWebServerTest extends TestCase { + public void testRegularResponse() throws Exception { + // 1. Enqueue a response. + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("hello world")); + server.play(); + + // 2. Make a request that retrieves that response. + URL url = server.getUrl("/"); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestProperty("Accept-Language", "en-US"); + InputStream in = connection.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode()); + assertEquals("hello world", reader.readLine()); + + // 3. Validate the request. + RecordedRequest request = server.takeRequest(); + assertEquals("GET / HTTP/1.1", request.getRequestLine()); + assertTrue(request.getHeaders().contains("Accept-Language: en-US")); + } +} From 972a2f7556d4c3b759b8a9dca6026a9a819fa0bf Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Wed, 25 May 2011 06:25:22 +0000 Subject: [PATCH 04/43] Test for redirect git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@4 cf848351-439f-e86a-257f-67fa721851d5 --- .../mockwebserver/MockWebServerTest.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java index 038b838df..829f213e6 100644 --- a/src/test/java/com/google/mockwebserver/MockWebServerTest.java +++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java @@ -21,16 +21,26 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.net.URLConnection; import junit.framework.TestCase; public final class MockWebServerTest extends TestCase { + + private MockWebServer server = new MockWebServer(); + + @Override protected void setUp() throws Exception { + super.setUp(); + } + + @Override protected void tearDown() throws Exception { + server.shutdown(); + super.tearDown(); + } + public void testRegularResponse() throws Exception { - // 1. Enqueue a response. - MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("hello world")); server.play(); - // 2. Make a request that retrieves that response. URL url = server.getUrl("/"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Accept-Language", "en-US"); @@ -39,9 +49,27 @@ public final class MockWebServerTest extends TestCase { assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode()); assertEquals("hello world", reader.readLine()); - // 3. Validate the request. RecordedRequest request = server.takeRequest(); assertEquals("GET / HTTP/1.1", request.getRequestLine()); assertTrue(request.getHeaders().contains("Accept-Language: en-US")); } + + public void testRedirect() throws Exception { + server.enqueue(new MockResponse() + .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) + .addHeader("Location: /new-path") + .setBody("This page has moved!")); + server.enqueue(new MockResponse().setBody("This is the new location!")); + server.play(); + + URLConnection connection = server.getUrl("/").openConnection(); + InputStream in = connection.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + assertEquals("This is the new location!", reader.readLine()); + + RecordedRequest first = server.takeRequest(); + assertEquals("GET / HTTP/1.1", first.getRequestLine()); + RecordedRequest redirect = server.takeRequest(); + assertEquals("GET /new-path HTTP/1.1", redirect.getRequestLine()); + } } From 62177b80f051ffa1f0f95c15fd20482db2006b24 Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Wed, 25 May 2011 06:35:43 +0000 Subject: [PATCH 05/43] Add Javadoc git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@5 cf848351-439f-e86a-257f-67fa721851d5 --- build.xml | 7 + javadoc/allclasses-frame.html | 37 ++ javadoc/allclasses-noframe.html | 37 ++ .../google/mockwebserver/MockResponse.html | 582 ++++++++++++++++++ .../google/mockwebserver/MockWebServer.html | 533 ++++++++++++++++ .../google/mockwebserver/RecordedRequest.html | 350 +++++++++++ .../google/mockwebserver/SocketPolicy.html | 411 +++++++++++++ .../google/mockwebserver/package-frame.html | 47 ++ .../google/mockwebserver/package-summary.html | 175 ++++++ .../google/mockwebserver/package-tree.html | 157 +++++ javadoc/constant-values.html | 142 +++++ javadoc/deprecated-list.html | 142 +++++ javadoc/help-doc.html | 209 +++++++ javadoc/index-all.html | 311 ++++++++++ javadoc/index.html | 36 ++ javadoc/overview-tree.html | 159 +++++ javadoc/package-list | 1 + javadoc/resources/inherit.gif | Bin 0 -> 57 bytes javadoc/stylesheet.css | 29 + 19 files changed, 3365 insertions(+) create mode 100644 javadoc/allclasses-frame.html create mode 100644 javadoc/allclasses-noframe.html create mode 100644 javadoc/com/google/mockwebserver/MockResponse.html create mode 100644 javadoc/com/google/mockwebserver/MockWebServer.html create mode 100644 javadoc/com/google/mockwebserver/RecordedRequest.html create mode 100644 javadoc/com/google/mockwebserver/SocketPolicy.html create mode 100644 javadoc/com/google/mockwebserver/package-frame.html create mode 100644 javadoc/com/google/mockwebserver/package-summary.html create mode 100644 javadoc/com/google/mockwebserver/package-tree.html create mode 100644 javadoc/constant-values.html create mode 100644 javadoc/deprecated-list.html create mode 100644 javadoc/help-doc.html create mode 100644 javadoc/index-all.html create mode 100644 javadoc/index.html create mode 100644 javadoc/overview-tree.html create mode 100644 javadoc/package-list create mode 100644 javadoc/resources/inherit.gif create mode 100644 javadoc/stylesheet.css diff --git a/build.xml b/build.xml index 02ec6ea4e..26ba8af57 100644 --- a/build.xml +++ b/build.xml @@ -40,6 +40,13 @@ + + + + + + + diff --git a/javadoc/allclasses-frame.html b/javadoc/allclasses-frame.html new file mode 100644 index 000000000..9e56e3537 --- /dev/null +++ b/javadoc/allclasses-frame.html @@ -0,0 +1,37 @@ + + + + + + +All Classes (MockWebServer) + + + + + + + + + + + +All Classes +
+ + + + + +
MockResponse +
+MockWebServer +
+RecordedRequest +
+SocketPolicy +
+
+ + + diff --git a/javadoc/allclasses-noframe.html b/javadoc/allclasses-noframe.html new file mode 100644 index 000000000..aa2d9b768 --- /dev/null +++ b/javadoc/allclasses-noframe.html @@ -0,0 +1,37 @@ + + + + + + +All Classes (MockWebServer) + + + + + + + + + + + +All Classes +
+ + + + + +
MockResponse +
+MockWebServer +
+RecordedRequest +
+SocketPolicy +
+
+ + + diff --git a/javadoc/com/google/mockwebserver/MockResponse.html b/javadoc/com/google/mockwebserver/MockResponse.html new file mode 100644 index 000000000..fd1495ff2 --- /dev/null +++ b/javadoc/com/google/mockwebserver/MockResponse.html @@ -0,0 +1,582 @@ + + + + + + +MockResponse (MockWebServer) + + + + + + + + + + + + +


+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class MockResponse

+
+java.lang.Object
+  extended by com.google.mockwebserver.MockResponse
+
+
+
All Implemented Interfaces:
java.lang.Cloneable
+
+
+
+
public final class MockResponse
extends java.lang.Object
implements java.lang.Cloneable
+ + +

+A scripted response to be replayed by the mock web server. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
MockResponse() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ MockResponseaddHeader(java.lang.String header) + +
+           
+ MockResponseclearHeaders() + +
+           
+ MockResponseclone() + +
+           
+ byte[]getBody() + +
+          Returns an input stream containing the raw HTTP payload.
+ java.util.List<java.lang.String>getHeaders() + +
+          Returns the HTTP headers, such as "Content-Length: 0".
+ SocketPolicygetSocketPolicy() + +
+           
+ java.lang.StringgetStatus() + +
+          Returns the HTTP response line, such as "HTTP/1.1 200 OK".
+ MockResponsesetBody(byte[] body) + +
+           
+ MockResponsesetBody(java.lang.String body) + +
+           
+ MockResponsesetChunkedBody(byte[] body, + int maxChunkSize) + +
+           
+ MockResponsesetChunkedBody(java.lang.String body, + int maxChunkSize) + +
+           
+ MockResponsesetResponseCode(int code) + +
+           
+ MockResponsesetSocketPolicy(SocketPolicy socketPolicy) + +
+           
+ MockResponsesetStatus(java.lang.String status) + +
+           
+ java.lang.StringtoString() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+MockResponse

+
+public MockResponse()
+
+
+ + + + + + + + +
+Method Detail
+ +

+clone

+
+public MockResponse clone()
+
+
+
Overrides:
clone in class java.lang.Object
+
+
+
+
+
+
+ +

+getStatus

+
+public java.lang.String getStatus()
+
+
Returns the HTTP response line, such as "HTTP/1.1 200 OK". +

+

+
+
+
+
+
+
+
+ +

+setResponseCode

+
+public MockResponse setResponseCode(int code)
+
+
+
+
+
+
+
+
+
+ +

+setStatus

+
+public MockResponse setStatus(java.lang.String status)
+
+
+
+
+
+
+
+
+
+ +

+getHeaders

+
+public java.util.List<java.lang.String> getHeaders()
+
+
Returns the HTTP headers, such as "Content-Length: 0". +

+

+
+
+
+
+
+
+
+ +

+clearHeaders

+
+public MockResponse clearHeaders()
+
+
+
+
+
+
+
+
+
+ +

+addHeader

+
+public MockResponse addHeader(java.lang.String header)
+
+
+
+
+
+
+
+
+
+ +

+getBody

+
+public byte[] getBody()
+
+
Returns an input stream containing the raw HTTP payload. +

+

+
+
+
+
+
+
+
+ +

+setBody

+
+public MockResponse setBody(byte[] body)
+
+
+
+
+
+
+
+
+
+ +

+setBody

+
+public MockResponse setBody(java.lang.String body)
+
+
+
+
+
+
+
+
+
+ +

+setChunkedBody

+
+public MockResponse setChunkedBody(byte[] body,
+                                   int maxChunkSize)
+                            throws java.io.IOException
+
+
+
+
+
+ +
Throws: +
java.io.IOException
+
+
+
+ +

+setChunkedBody

+
+public MockResponse setChunkedBody(java.lang.String body,
+                                   int maxChunkSize)
+                            throws java.io.IOException
+
+
+
+
+
+ +
Throws: +
java.io.IOException
+
+
+
+ +

+getSocketPolicy

+
+public SocketPolicy getSocketPolicy()
+
+
+
+
+
+
+
+
+
+ +

+setSocketPolicy

+
+public MockResponse setSocketPolicy(SocketPolicy socketPolicy)
+
+
+
+
+
+
+
+
+
+ +

+toString

+
+public java.lang.String toString()
+
+
+
Overrides:
toString in class java.lang.Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/com/google/mockwebserver/MockWebServer.html b/javadoc/com/google/mockwebserver/MockWebServer.html new file mode 100644 index 000000000..077449b16 --- /dev/null +++ b/javadoc/com/google/mockwebserver/MockWebServer.html @@ -0,0 +1,533 @@ + + + + + + +MockWebServer (MockWebServer) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class MockWebServer

+
+java.lang.Object
+  extended by com.google.mockwebserver.MockWebServer
+
+
+
+
public final class MockWebServer
extends java.lang.Object
+ + +

+A scriptable web server. Callers supply canned responses and the server + replays them upon request in sequence. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
MockWebServer() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidenqueue(MockResponse response) + +
+           
+ java.lang.StringgetHostName() + +
+           
+ intgetPort() + +
+           
+ intgetRequestCount() + +
+          Returns the number of HTTP requests received thus far by this server.
+ java.net.URLgetUrl(java.lang.String path) + +
+          Returns a URL for connecting to this server.
+ voidplay() + +
+          Equivalent to play(0).
+ voidplay(int port) + +
+          Starts the server, serves all enqueued requests, and shuts the server + down.
+ voidsetBodyLimit(int maxBodyLength) + +
+          Sets the number of bytes of the POST body to keep in memory to the given + limit.
+ voidsetSingleResponse(boolean singleResponse) + +
+          By default, this class processes requests coming in by adding them to a + queue and serves responses by removing them from another queue.
+ voidshutdown() + +
+           
+ RecordedRequesttakeRequest() + +
+          Awaits the next HTTP request, removes it, and returns it.
+ java.net.ProxytoProxyAddress() + +
+           
+ voiduseHttps(javax.net.ssl.SSLSocketFactory sslSocketFactory, + boolean tunnelProxy) + +
+          Serve requests with HTTPS rather than otherwise.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+MockWebServer

+
+public MockWebServer()
+
+
+ + + + + + + + +
+Method Detail
+ +

+getPort

+
+public int getPort()
+
+
+
+
+
+
+ +

+getHostName

+
+public java.lang.String getHostName()
+
+
+
+
+
+
+ +

+toProxyAddress

+
+public java.net.Proxy toProxyAddress()
+
+
+
+
+
+
+ +

+getUrl

+
+public java.net.URL getUrl(java.lang.String path)
+                    throws java.net.MalformedURLException,
+                           java.net.UnknownHostException
+
+
Returns a URL for connecting to this server. +

+

+
Parameters:
path - the request path, such as "/". +
Throws: +
java.net.MalformedURLException +
java.net.UnknownHostException
+
+
+
+ +

+setBodyLimit

+
+public void setBodyLimit(int maxBodyLength)
+
+
Sets the number of bytes of the POST body to keep in memory to the given + limit. +

+

+
+
+
+
+ +

+useHttps

+
+public void useHttps(javax.net.ssl.SSLSocketFactory sslSocketFactory,
+                     boolean tunnelProxy)
+
+
Serve requests with HTTPS rather than otherwise. +

+

+
Parameters:
tunnelProxy - whether to expect the HTTP CONNECT method before + negotiating TLS.
+
+
+
+ +

+takeRequest

+
+public RecordedRequest takeRequest()
+                            throws java.lang.InterruptedException
+
+
Awaits the next HTTP request, removes it, and returns it. Callers should + use this to verify the request sent was as intended. +

+

+ +
Throws: +
java.lang.InterruptedException
+
+
+
+ +

+getRequestCount

+
+public int getRequestCount()
+
+
Returns the number of HTTP requests received thus far by this server. + This may exceed the number of HTTP connections when connection reuse is + in practice. +

+

+
+
+
+
+ +

+enqueue

+
+public void enqueue(MockResponse response)
+
+
+
+
+
+
+ +

+setSingleResponse

+
+public void setSingleResponse(boolean singleResponse)
+
+
By default, this class processes requests coming in by adding them to a + queue and serves responses by removing them from another queue. This mode + is appropriate for correctness testing. + +

Serving a single response causes the server to be stateless: requests + are not enqueued, and responses are not dequeued. This mode is appropriate + for benchmarking. +

+

+
+
+
+
+ +

+play

+
+public void play()
+          throws java.io.IOException
+
+
Equivalent to play(0). +

+

+ +
Throws: +
java.io.IOException
+
+
+
+ +

+play

+
+public void play(int port)
+          throws java.io.IOException
+
+
Starts the server, serves all enqueued requests, and shuts the server + down. +

+

+
Parameters:
port - the port to listen to, or 0 for any available port. + Automated tests should always use port 0 to avoid flakiness when a + specific port is unavailable. +
Throws: +
java.io.IOException
+
+
+
+ +

+shutdown

+
+public void shutdown()
+              throws java.io.IOException
+
+
+ +
Throws: +
java.io.IOException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/com/google/mockwebserver/RecordedRequest.html b/javadoc/com/google/mockwebserver/RecordedRequest.html new file mode 100644 index 000000000..803f265e3 --- /dev/null +++ b/javadoc/com/google/mockwebserver/RecordedRequest.html @@ -0,0 +1,350 @@ + + + + + + +RecordedRequest (MockWebServer) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class RecordedRequest

+
+java.lang.Object
+  extended by com.google.mockwebserver.RecordedRequest
+
+
+
+
public final class RecordedRequest
extends java.lang.Object
+ + +

+An HTTP request that came into the mock web server. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ byte[]getBody() + +
+          Returns the body of this POST request.
+ intgetBodySize() + +
+          Returns the total size of the body of this POST request (before + truncation).
+ java.util.List<java.lang.Integer>getChunkSizes() + +
+          Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked.
+ java.util.List<java.lang.String>getHeaders() + +
+           
+ java.lang.StringgetRequestLine() + +
+           
+ intgetSequenceNumber() + +
+          Returns the index of this request on its HTTP connection.
+ java.lang.StringtoString() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Method Detail
+ +

+getRequestLine

+
+public java.lang.String getRequestLine()
+
+
+
+
+
+
+ +

+getHeaders

+
+public java.util.List<java.lang.String> getHeaders()
+
+
+
+
+
+
+ +

+getChunkSizes

+
+public java.util.List<java.lang.Integer> getChunkSizes()
+
+
Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked. +

+

+
+
+
+
+ +

+getBodySize

+
+public int getBodySize()
+
+
Returns the total size of the body of this POST request (before + truncation). +

+

+
+
+
+
+ +

+getBody

+
+public byte[] getBody()
+
+
Returns the body of this POST request. This may be truncated. +

+

+
+
+
+
+ +

+getSequenceNumber

+
+public int getSequenceNumber()
+
+
Returns the index of this request on its HTTP connection. Since a single + HTTP connection may serve multiple requests, each request is assigned its + own sequence number. +

+

+
+
+
+
+ +

+toString

+
+public java.lang.String toString()
+
+
+
Overrides:
toString in class java.lang.Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/com/google/mockwebserver/SocketPolicy.html b/javadoc/com/google/mockwebserver/SocketPolicy.html new file mode 100644 index 000000000..e25cccfab --- /dev/null +++ b/javadoc/com/google/mockwebserver/SocketPolicy.html @@ -0,0 +1,411 @@ + + + + + + +SocketPolicy (MockWebServer) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Enum SocketPolicy

+
+java.lang.Object
+  extended by java.lang.Enum<SocketPolicy>
+      extended by com.google.mockwebserver.SocketPolicy
+
+
+
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<SocketPolicy>
+
+
+
+
public enum SocketPolicy
extends java.lang.Enum<SocketPolicy>
+ + +

+What should be done with the incoming socket. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+Enum Constant Summary
DISCONNECT_AT_END + +
+          Close the socket after the response.
DISCONNECT_AT_START + +
+          Request immediate close of connection without even reading the + request.
KEEP_OPEN + +
+          Keep the socket open after the response.
SHUTDOWN_INPUT_AT_END + +
+          Shutdown the socket input after sending the response.
SHUTDOWN_OUTPUT_AT_END + +
+          Shutdown the socket output after sending the response.
UPGRADE_TO_SSL_AT_END + +
+          Wrap the socket with SSL at the completion of this request/response + pair.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static SocketPolicyvalueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static SocketPolicy[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+KEEP_OPEN

+
+public static final SocketPolicy KEEP_OPEN
+
+
Keep the socket open after the response. This is the default HTTP/1.1 + behavior. +

+

+
+
+
+ +

+DISCONNECT_AT_END

+
+public static final SocketPolicy DISCONNECT_AT_END
+
+
Close the socket after the response. This is the default HTTP/1.0 + behavior. +

+

+
+
+
+ +

+UPGRADE_TO_SSL_AT_END

+
+public static final SocketPolicy UPGRADE_TO_SSL_AT_END
+
+
Wrap the socket with SSL at the completion of this request/response + pair. Used for CONNECT messages to tunnel SSL over an HTTP proxy. +

+

+
+
+
+ +

+DISCONNECT_AT_START

+
+public static final SocketPolicy DISCONNECT_AT_START
+
+
Request immediate close of connection without even reading the + request. + +

Use to simulate the real life case of losing connection + because of bugger SSL server close connection when it seems + something like a compression method or TLS extension it doesn't + understand, instead of simply ignoring it like it should. +

+

+
+
+
+ +

+SHUTDOWN_INPUT_AT_END

+
+public static final SocketPolicy SHUTDOWN_INPUT_AT_END
+
+
Shutdown the socket input after sending the response. For testing bad + behavior. +

+

+
+
+
+ +

+SHUTDOWN_OUTPUT_AT_END

+
+public static final SocketPolicy SHUTDOWN_OUTPUT_AT_END
+
+
Shutdown the socket output after sending the response. For testing bad + behavior. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static SocketPolicy[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (SocketPolicy c : SocketPolicy.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static SocketPolicy valueOf(java.lang.String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
java.lang.IllegalArgumentException - if this enum type has no constant +with the specified name +
java.lang.NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/com/google/mockwebserver/package-frame.html b/javadoc/com/google/mockwebserver/package-frame.html new file mode 100644 index 000000000..8448c9610 --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-frame.html @@ -0,0 +1,47 @@ + + + + + + +com.google.mockwebserver (MockWebServer) + + + + + + + + + + + +com.google.mockwebserver + + + + +
+Classes  + +
+MockResponse +
+MockWebServer +
+RecordedRequest
+ + + + + + +
+Enums  + +
+SocketPolicy
+ + + + diff --git a/javadoc/com/google/mockwebserver/package-summary.html b/javadoc/com/google/mockwebserver/package-summary.html new file mode 100644 index 000000000..6d09d250b --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-summary.html @@ -0,0 +1,175 @@ + + + + + + +com.google.mockwebserver (MockWebServer) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package com.google.mockwebserver +

+ + + + + + + + + + + + + + + + + +
+Class Summary
MockResponseA scripted response to be replayed by the mock web server.
MockWebServerA scriptable web server.
RecordedRequestAn HTTP request that came into the mock web server.
+  + +

+ + + + + + + + + +
+Enum Summary
SocketPolicyWhat should be done with the incoming socket.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/com/google/mockwebserver/package-tree.html b/javadoc/com/google/mockwebserver/package-tree.html new file mode 100644 index 000000000..be7c256e9 --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-tree.html @@ -0,0 +1,157 @@ + + + + + + +com.google.mockwebserver Class Hierarchy (MockWebServer) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package com.google.mockwebserver +

+
+

+Class Hierarchy +

+ +

+Enum Hierarchy +

+
    +
  • java.lang.Object
      +
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
    +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/constant-values.html b/javadoc/constant-values.html new file mode 100644 index 000000000..bdf6f12e8 --- /dev/null +++ b/javadoc/constant-values.html @@ -0,0 +1,142 @@ + + + + + + +Constant Field Values (MockWebServer) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Constant Field Values

+
+
+Contents
    +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/deprecated-list.html b/javadoc/deprecated-list.html new file mode 100644 index 000000000..e2a274366 --- /dev/null +++ b/javadoc/deprecated-list.html @@ -0,0 +1,142 @@ + + + + + + +Deprecated List (MockWebServer) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Deprecated API

+
+
+Contents
    +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/help-doc.html b/javadoc/help-doc.html new file mode 100644 index 000000000..86fb24b3b --- /dev/null +++ b/javadoc/help-doc.html @@ -0,0 +1,209 @@ + + + + + + +API Help (MockWebServer) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+How This API Document Is Organized

+
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

+Package

+
+ +

+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    +
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
+
+

+Class/Interface

+
+ +

+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description +

    +

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary +

    +

  • Field Detail
  • Constructor Detail
  • Method Detail
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+ +

+Annotation Type

+
+ +

+Each annotation type has its own separate page with the following sections:

    +
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
+
+ +

+Enum

+
+ +

+Each enum has its own separate page with the following sections:

    +
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
+
+

+Tree (Class Hierarchy)

+
+There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    +
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
+
+

+Deprecated API

+
+The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
+

+Index

+
+The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
+

+Prev/Next

+These links take you to the next or previous class, interface, package, or related page.

+Frames/No Frames

+These links show and hide the HTML frames. All pages are available with or without frames. +

+

+Serialized Form

+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. +

+

+Constant Field Values

+The Constant Field Values page lists the static final fields and their values. +

+ + +This help file applies to API documentation generated using the standard doclet. + +
+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/index-all.html b/javadoc/index-all.html new file mode 100644 index 000000000..08a06047d --- /dev/null +++ b/javadoc/index-all.html @@ -0,0 +1,311 @@ + + + + + + +Index (MockWebServer) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C E G M P R S T U V
+

+A

+
+
addHeader(String) - +Method in class com.google.mockwebserver.MockResponse +
  +
+
+

+C

+
+
clearHeaders() - +Method in class com.google.mockwebserver.MockResponse +
  +
clone() - +Method in class com.google.mockwebserver.MockResponse +
  +
com.google.mockwebserver - package com.google.mockwebserver
 
+
+

+E

+
+
enqueue(MockResponse) - +Method in class com.google.mockwebserver.MockWebServer +
  +
+
+

+G

+
+
getBody() - +Method in class com.google.mockwebserver.MockResponse +
Returns an input stream containing the raw HTTP payload. +
getBody() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the body of this POST request. +
getBodySize() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the total size of the body of this POST request (before + truncation). +
getChunkSizes() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked. +
getHeaders() - +Method in class com.google.mockwebserver.MockResponse +
Returns the HTTP headers, such as "Content-Length: 0". +
getHeaders() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getHostName() - +Method in class com.google.mockwebserver.MockWebServer +
  +
getPort() - +Method in class com.google.mockwebserver.MockWebServer +
  +
getRequestCount() - +Method in class com.google.mockwebserver.MockWebServer +
Returns the number of HTTP requests received thus far by this server. +
getRequestLine() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getSequenceNumber() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the index of this request on its HTTP connection. +
getSocketPolicy() - +Method in class com.google.mockwebserver.MockResponse +
  +
getStatus() - +Method in class com.google.mockwebserver.MockResponse +
Returns the HTTP response line, such as "HTTP/1.1 200 OK". +
getUrl(String) - +Method in class com.google.mockwebserver.MockWebServer +
Returns a URL for connecting to this server. +
+
+

+M

+
+
MockResponse - Class in com.google.mockwebserver
A scripted response to be replayed by the mock web server.
MockResponse() - +Constructor for class com.google.mockwebserver.MockResponse +
  +
MockWebServer - Class in com.google.mockwebserver
A scriptable web server.
MockWebServer() - +Constructor for class com.google.mockwebserver.MockWebServer +
  +
+
+

+P

+
+
play() - +Method in class com.google.mockwebserver.MockWebServer +
Equivalent to play(0). +
play(int) - +Method in class com.google.mockwebserver.MockWebServer +
Starts the server, serves all enqueued requests, and shuts the server + down. +
+
+

+R

+
+
RecordedRequest - Class in com.google.mockwebserver
An HTTP request that came into the mock web server.
+
+

+S

+
+
setBody(byte[]) - +Method in class com.google.mockwebserver.MockResponse +
  +
setBody(String) - +Method in class com.google.mockwebserver.MockResponse +
  +
setBodyLimit(int) - +Method in class com.google.mockwebserver.MockWebServer +
Sets the number of bytes of the POST body to keep in memory to the given + limit. +
setChunkedBody(byte[], int) - +Method in class com.google.mockwebserver.MockResponse +
  +
setChunkedBody(String, int) - +Method in class com.google.mockwebserver.MockResponse +
  +
setResponseCode(int) - +Method in class com.google.mockwebserver.MockResponse +
  +
setSingleResponse(boolean) - +Method in class com.google.mockwebserver.MockWebServer +
By default, this class processes requests coming in by adding them to a + queue and serves responses by removing them from another queue. +
setSocketPolicy(SocketPolicy) - +Method in class com.google.mockwebserver.MockResponse +
  +
setStatus(String) - +Method in class com.google.mockwebserver.MockResponse +
  +
shutdown() - +Method in class com.google.mockwebserver.MockWebServer +
  +
SocketPolicy - Enum in com.google.mockwebserver
What should be done with the incoming socket.
+
+

+T

+
+
takeRequest() - +Method in class com.google.mockwebserver.MockWebServer +
Awaits the next HTTP request, removes it, and returns it. +
toProxyAddress() - +Method in class com.google.mockwebserver.MockWebServer +
  +
toString() - +Method in class com.google.mockwebserver.MockResponse +
  +
toString() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
+
+

+U

+
+
useHttps(SSLSocketFactory, boolean) - +Method in class com.google.mockwebserver.MockWebServer +
Serve requests with HTTPS rather than otherwise. +
+
+

+V

+
+
valueOf(String) - +Static method in enum com.google.mockwebserver.SocketPolicy +
Returns the enum constant of this type with the specified name. +
values() - +Static method in enum com.google.mockwebserver.SocketPolicy +
Returns an array containing the constants of this enum type, in +the order they are declared. +
+
+A C E G M P R S T U V + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/index.html b/javadoc/index.html new file mode 100644 index 000000000..de77c3593 --- /dev/null +++ b/javadoc/index.html @@ -0,0 +1,36 @@ + + + + + + +MockWebServer + + + + + + + + +<H2> +Frame Alert</H2> + +<P> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<BR> +Link to<A HREF="com/google/mockwebserver/package-summary.html">Non-frame version.</A> + + + diff --git a/javadoc/overview-tree.html b/javadoc/overview-tree.html new file mode 100644 index 000000000..dfc9e0285 --- /dev/null +++ b/javadoc/overview-tree.html @@ -0,0 +1,159 @@ + + + + + + +Class Hierarchy (MockWebServer) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For All Packages

+
+
+
Package Hierarchies:
com.google.mockwebserver
+
+

+Class Hierarchy +

+ +

+Enum Hierarchy +

+
    +
  • java.lang.Object
      +
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) + +
    +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/javadoc/package-list b/javadoc/package-list new file mode 100644 index 000000000..89508e5d3 --- /dev/null +++ b/javadoc/package-list @@ -0,0 +1 @@ +com.google.mockwebserver diff --git a/javadoc/resources/inherit.gif b/javadoc/resources/inherit.gif new file mode 100644 index 0000000000000000000000000000000000000000..c814867a13deb0ca7ea2156c6ca1d5a03372af7e GIT binary patch literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X literal 0 HcmV?d00001 diff --git a/javadoc/stylesheet.css b/javadoc/stylesheet.css new file mode 100644 index 000000000..6ea9e5161 --- /dev/null +++ b/javadoc/stylesheet.css @@ -0,0 +1,29 @@ +/* Javadoc style sheet */ + +/* Define colors, fonts and other style attributes here to override the defaults */ + +/* Page background color */ +body { background-color: #FFFFFF; color:#000000 } + +/* Headings */ +h1 { font-size: 145% } + +/* Table colors */ +.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ +.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ +.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ + +/* Font used in left-hand frame lists */ +.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } + +/* Navigation bar fonts and colors */ +.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ +.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ +.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} +.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} + +.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} +.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} + From 739cb3ec6c41f58e6b6a75d18c912ad1111f8061 Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Sat, 4 Jun 2011 00:34:50 +0000 Subject: [PATCH 06/43] More interesting example tests git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@6 cf848351-439f-e86a-257f-67fa721851d5 --- .../mockwebserver/MockWebServerTest.java | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java index 829f213e6..353361b92 100644 --- a/src/test/java/com/google/mockwebserver/MockWebServerTest.java +++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java @@ -17,9 +17,11 @@ package com.google.mockwebserver; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; +import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLConnection; import junit.framework.TestCase; @@ -55,12 +57,12 @@ public final class MockWebServerTest extends TestCase { } public void testRedirect() throws Exception { + server.play(); server.enqueue(new MockResponse() .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: /new-path") + .addHeader("Location: " + server.getUrl("/new-path")) .setBody("This page has moved!")); server.enqueue(new MockResponse().setBody("This is the new location!")); - server.play(); URLConnection connection = server.getUrl("/").openConnection(); InputStream in = connection.getInputStream(); @@ -72,4 +74,52 @@ public final class MockWebServerTest extends TestCase { RecordedRequest redirect = server.takeRequest(); assertEquals("GET /new-path HTTP/1.1", redirect.getRequestLine()); } + + public void testNonHexadecimalChunkSize() throws Exception { + server.enqueue(new MockResponse() + .setBody("G\r\nxxxxxxxxxxxxxxxx\r\n0\r\n\r\n") + .clearHeaders() + .addHeader("Transfer-encoding: chunked")); + server.play(); + + URLConnection connection = server.getUrl("/").openConnection(); + InputStream in = connection.getInputStream(); + try { + in.read(); + fail(); + } catch (IOException expected) { + } + } + + public void testResponseTimeout() throws Exception { + server.enqueue(new MockResponse() + .setBody("ABC") + .clearHeaders() + .addHeader("Content-Length: 4")); + server.enqueue(new MockResponse() + .setBody("DEF")); + server.play(); + + URLConnection urlConnection = server.getUrl("/").openConnection(); + urlConnection.setReadTimeout(1000); + InputStream in = urlConnection.getInputStream(); + assertEquals('A', in.read()); + assertEquals('B', in.read()); + assertEquals('C', in.read()); + try { + in.read(); // if Content-Length was accurate, this would return -1 immediately + fail(); + } catch (SocketTimeoutException expected) { + } + + URLConnection urlConnection2 = server.getUrl("/").openConnection(); + InputStream in2 = urlConnection2.getInputStream(); + assertEquals('D', in2.read()); + assertEquals('E', in2.read()); + assertEquals('F', in2.read()); + assertEquals(-1, in2.read()); + + assertEquals(0, server.takeRequest().getSequenceNumber()); + assertEquals(0, server.takeRequest().getSequenceNumber()); + } } From f003d2260df800fa695b73acc0df21b20f5720c4 Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Wed, 14 Dec 2011 21:59:58 +0000 Subject: [PATCH 07/43] Add an API to expose the server's cookie domain. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@10 cf848351-439f-e86a-257f-67fa721851d5 --- .../java/com/google/mockwebserver/MockWebServer.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index a938a2779..ba92458cb 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -105,6 +105,16 @@ public final class MockWebServer { : new URL("http://" + getHostName() + ":" + getPort() + path); } + /** + * Returns a cookie domain for this server. This returns the server's + * non-loopback host name if it is known. Otherwise this returns ".local" + * for this server's loopback name. + */ + public String getCookieDomain() { + String hostName = getHostName(); + return hostName.contains(".") ? hostName : ".local"; + } + /** * Sets the number of bytes of the POST body to keep in memory to the given * limit. From 7bb99fd0bdc60bc5824aadc2b3121f6dded6a143 Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Tue, 20 Dec 2011 01:07:46 +0000 Subject: [PATCH 08/43] Support SSL handshake failures. Also add an API to RecordedRequest to help differentiate between original TLSv1 requests and SSLv3 fallback requests. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@11 cf848351-439f-e86a-257f-67fa721851d5 --- .../google/mockwebserver/MockWebServer.java | 53 ++++++++++++++++--- .../google/mockwebserver/RecordedRequest.java | 20 ++++++- .../google/mockwebserver/SocketPolicy.java | 5 ++ 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index ba92458cb..65f4547f1 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -17,6 +17,7 @@ package com.google.mockwebserver; import static com.google.mockwebserver.SocketPolicy.DISCONNECT_AT_START; +import static com.google.mockwebserver.SocketPolicy.FAIL_HANDSHAKE; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; @@ -33,6 +34,8 @@ import java.net.Socket; import java.net.SocketException; import java.net.URL; import java.net.UnknownHostException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -47,8 +50,11 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; +import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; /** * A scriptable web server. Callers supply canned responses and the server @@ -267,6 +273,11 @@ public final class MockWebServer { if (tunnelProxy) { createTunnel(); } + MockResponse response = responseQueue.peek(); + if (response != null && response.getSocketPolicy() == FAIL_HANDSHAKE) { + processHandshakeFailure(raw, sequenceNumber++); + return; + } socket = sslSocketFactory.createSocket( raw, raw.getInetAddress().getHostAddress(), raw.getPort(), true); ((SSLSocket) socket).setUseClientMode(false); @@ -279,7 +290,7 @@ public final class MockWebServer { InputStream in = new BufferedInputStream(socket.getInputStream()); OutputStream out = new BufferedOutputStream(socket.getOutputStream()); - while (!responseQueue.isEmpty() && processOneRequest(in, out, socket)) {} + while (!responseQueue.isEmpty() && processOneRequest(socket, in, out)) {} if (sequenceNumber == 0) { logger.warning("MockWebServer connection didn't make a request"); @@ -301,7 +312,7 @@ public final class MockWebServer { private void createTunnel() throws IOException, InterruptedException { while (true) { MockResponse connect = responseQueue.peek(); - if (!processOneRequest(raw.getInputStream(), raw.getOutputStream(), raw)) { + if (!processOneRequest(raw, raw.getInputStream(), raw.getOutputStream())) { throw new IllegalStateException("Tunnel without any CONNECT!"); } if (connect.getSocketPolicy() == SocketPolicy.UPGRADE_TO_SSL_AT_END) { @@ -314,9 +325,9 @@ public final class MockWebServer { * Reads a request and writes its response. Returns true if a request * was processed. */ - private boolean processOneRequest(InputStream in, OutputStream out, Socket socket) + private boolean processOneRequest(Socket socket, InputStream in, OutputStream out) throws IOException, InterruptedException { - RecordedRequest request = readRequest(in, sequenceNumber); + RecordedRequest request = readRequest(socket, in, sequenceNumber); if (request == null) { return false; } @@ -336,10 +347,40 @@ public final class MockWebServer { })); } + private void processHandshakeFailure(Socket raw, int sequenceNumber) throws Exception { + responseQueue.take(); + X509TrustManager untrusted = new X509TrustManager() { + @Override public void checkClientTrusted(X509Certificate[] chain, String authType) + throws CertificateException { + throw new CertificateException(); + } + @Override public void checkServerTrusted(X509Certificate[] chain, String authType) { + throw new AssertionError(); + } + @Override public X509Certificate[] getAcceptedIssuers() { + throw new AssertionError(); + } + }; + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, new TrustManager[] { untrusted }, new java.security.SecureRandom()); + SSLSocketFactory sslSocketFactory = context.getSocketFactory(); + SSLSocket socket = (SSLSocket) sslSocketFactory.createSocket( + raw, raw.getInetAddress().getHostAddress(), raw.getPort(), true); + try { + socket.startHandshake(); // we're testing a handshake failure + throw new AssertionError(); + } catch (IOException expected) { + } + socket.close(); + requestCount.incrementAndGet(); + requestQueue.add(new RecordedRequest(null, null, null, -1, null, sequenceNumber, socket)); + } + /** * @param sequenceNumber the index of this request on this connection. */ - private RecordedRequest readRequest(InputStream in, int sequenceNumber) throws IOException { + private RecordedRequest readRequest(Socket socket, InputStream in, int sequenceNumber) + throws IOException { String request; try { request = readAsciiUntilCrlf(in); @@ -401,7 +442,7 @@ public final class MockWebServer { } return new RecordedRequest(request, headers, chunkSizes, - requestBody.numBytesReceived, requestBody.toByteArray(), sequenceNumber); + requestBody.numBytesReceived, requestBody.toByteArray(), sequenceNumber, socket); } /** diff --git a/src/main/java/com/google/mockwebserver/RecordedRequest.java b/src/main/java/com/google/mockwebserver/RecordedRequest.java index 8f0908457..a06c0bccb 100644 --- a/src/main/java/com/google/mockwebserver/RecordedRequest.java +++ b/src/main/java/com/google/mockwebserver/RecordedRequest.java @@ -16,7 +16,9 @@ package com.google.mockwebserver; +import java.net.Socket; import java.util.List; +import javax.net.ssl.SSLSocket; /** * An HTTP request that came into the mock web server. @@ -28,15 +30,23 @@ public final class RecordedRequest { private final int bodySize; private final byte[] body; private final int sequenceNumber; + private final String sslProtocol; RecordedRequest(String requestLine, List headers, List chunkSizes, - int bodySize, byte[] body, int sequenceNumber) { + int bodySize, byte[] body, int sequenceNumber, Socket socket) { this.requestLine = requestLine; this.headers = headers; this.chunkSizes = chunkSizes; this.bodySize = bodySize; this.body = body; this.sequenceNumber = sequenceNumber; + + if (socket instanceof SSLSocket) { + SSLSocket sslSocket = (SSLSocket) socket; + sslProtocol = sslSocket.getSession().getProtocol(); + } else { + sslProtocol = null; + } } public String getRequestLine() { @@ -79,6 +89,14 @@ public final class RecordedRequest { return sequenceNumber; } + /** + * Returns the connection's SSL protocol like {@code TLSv1}, {@code SSLv3}, + * {@code NONE} or null if the connection doesn't use SSL. + */ + public String getSslProtocol() { + return sslProtocol; + } + @Override public String toString() { return requestLine; } diff --git a/src/main/java/com/google/mockwebserver/SocketPolicy.java b/src/main/java/com/google/mockwebserver/SocketPolicy.java index d256a45ba..3a6797b2b 100644 --- a/src/main/java/com/google/mockwebserver/SocketPolicy.java +++ b/src/main/java/com/google/mockwebserver/SocketPolicy.java @@ -50,6 +50,11 @@ public enum SocketPolicy { */ DISCONNECT_AT_START, + /** + * Don't trust the client during the SSL handshake. + */ + FAIL_HANDSHAKE, + /** * Shutdown the socket input after sending the response. For testing bad * behavior. From 4ebac2656c870a090141106ad9ce267d25863301 Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Fri, 27 Jan 2012 21:57:40 +0000 Subject: [PATCH 09/43] Upgrade from ant to maven. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@12 cf848351-439f-e86a-257f-67fa721851d5 --- build.xml | 54 -------------------------------------------- pom.xml | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 54 deletions(-) delete mode 100644 build.xml create mode 100644 pom.xml diff --git a/build.xml b/build.xml deleted file mode 100644 index 26ba8af57..000000000 --- a/build.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..34bd5dcdc --- /dev/null +++ b/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + org.sonatype.oss + oss-parent + 7 + + com.google.mockwebserver + mockwebserver + 20120127 + mockwebserver + http://code.google.com/p/mockwebserver + + code.google.com + http://code.google.com/p/mockwebserver/issues + + 2011 + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + 3.0.4 + + + + junit + junit + 3.8.1 + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + verify + jar-no-fork + + + + + + + scm:svn:https://code.google.com/p/mockwebserver/ + scm:svn:https://code.google.com/p/mockwebserver/ + http://code.google.com/p/mockwebserver/source/browse + + \ No newline at end of file From 263a22e0a6af91ca112ad07969461be3c28ce60e Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Sun, 1 Apr 2012 18:52:44 +0000 Subject: [PATCH 10/43] More header manipulation, limit bytes-per-second. AOSP author: Jeff Sharkey Date: Thu Mar 29 14:04:11 2012 -0700 Add setHeader() and removeHeader() that mutate matching MockResponse headers. Support "bytes-per-second" to throttle response rate. Split request line into components. AOSP Change-Id: I107baa3727ced2d7ddcc5e3cb983f5dc9341dabd git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@13 cf848351-439f-e86a-257f-67fa721851d5 --- .../google/mockwebserver/MockResponse.java | 34 +++++++++++++++++++ .../google/mockwebserver/MockWebServer.java | 19 ++++++++++- .../google/mockwebserver/RecordedRequest.java | 15 ++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/mockwebserver/MockResponse.java b/src/main/java/com/google/mockwebserver/MockResponse.java index 5d06275cc..17e00f32a 100644 --- a/src/main/java/com/google/mockwebserver/MockResponse.java +++ b/src/main/java/com/google/mockwebserver/MockResponse.java @@ -21,6 +21,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; /** @@ -34,6 +35,7 @@ public final class MockResponse implements Cloneable { private String status = "HTTP/1.1 200 OK"; private List headers = new ArrayList(); private byte[] body = EMPTY_BODY; + private int bytesPerSecond = Integer.MAX_VALUE; private SocketPolicy socketPolicy = SocketPolicy.KEEP_OPEN; public MockResponse() { @@ -84,6 +86,26 @@ public final class MockResponse implements Cloneable { return this; } + public MockResponse addHeader(String name, Object value) { + return addHeader(name + ": " + String.valueOf(value)); + } + + public MockResponse setHeader(String name, Object value) { + removeHeader(name); + return addHeader(name, value); + } + + public MockResponse removeHeader(String name) { + name += ": "; + for (Iterator i = headers.iterator(); i.hasNext();) { + String header = i.next(); + if (name.regionMatches(true, 0, header, 0, name.length())) { + i.remove(); + } + } + return this; + } + /** * Returns an input stream containing the raw HTTP payload. */ @@ -140,6 +162,18 @@ public final class MockResponse implements Cloneable { return this; } + public int getBytesPerSecond() { + return bytesPerSecond; + } + + /** + * Set simulated network speed, in bytes per second. + */ + public MockResponse setBytesPerSecond(int bytesPerSecond) { + this.bytesPerSecond = bytesPerSecond; + return this; + } + @Override public String toString() { return status; } diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 65f4547f1..a013d9717 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -341,6 +341,7 @@ public final class MockWebServer { } else if (response.getSocketPolicy() == SocketPolicy.SHUTDOWN_OUTPUT_AT_END) { socket.shutdownOutput(); } + logger.info("Received request: " + request + " and responded: " + response); sequenceNumber++; return true; } @@ -475,8 +476,24 @@ public final class MockWebServer { out.write((header + "\r\n").getBytes(ASCII)); } out.write(("\r\n").getBytes(ASCII)); - out.write(response.getBody()); out.flush(); + + byte[] body = response.getBody(); + int bytesPerSecond = response.getBytesPerSecond(); + + for (int offset = 0; offset < body.length; offset += bytesPerSecond) { + int count = Math.min(body.length - offset, bytesPerSecond); + out.write(body, offset, count); + out.flush(); + + if (offset + count < body.length) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new AssertionError(); + } + } + } } /** diff --git a/src/main/java/com/google/mockwebserver/RecordedRequest.java b/src/main/java/com/google/mockwebserver/RecordedRequest.java index a06c0bccb..8d7dc87ed 100644 --- a/src/main/java/com/google/mockwebserver/RecordedRequest.java +++ b/src/main/java/com/google/mockwebserver/RecordedRequest.java @@ -25,6 +25,8 @@ import javax.net.ssl.SSLSocket; */ public final class RecordedRequest { private final String requestLine; + private final String method; + private final String path; private final List headers; private final List chunkSizes; private final int bodySize; @@ -47,6 +49,11 @@ public final class RecordedRequest { } else { sslProtocol = null; } + + int methodEnd = requestLine.indexOf(' '); + int pathEnd = requestLine.indexOf(' ', methodEnd + 1); + this.method = requestLine.substring(0, methodEnd); + this.path = requestLine.substring(methodEnd + 1, pathEnd); } public String getRequestLine() { @@ -100,4 +107,12 @@ public final class RecordedRequest { @Override public String toString() { return requestLine; } + + public String getMethod() { + return method; + } + + public String getPath() { + return path; + } } From cdf6c30558bc15857a069d981a8fd48662cfb311 Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Sun, 1 Apr 2012 18:53:26 +0000 Subject: [PATCH 11/43] More maven boilerplate. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@14 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pom.xml b/pom.xml index 34bd5dcdc..341ee7cac 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,29 @@ + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + jar + + + + + org.apache.maven.plugins + maven-gpg-plugin + + + sign-artifacts + verify + + sign + + + + From d9f5a075792d4064c62f96d0a411aa55f37e3cbd Mon Sep 17 00:00:00 2001 From: "jessewilson@google.com" Date: Thu, 10 May 2012 17:52:36 +0000 Subject: [PATCH 12/43] Fix NPE in RecordedRequest Constructor Bug 6294000 MockWebServer passes null as the requestLine argument to RecordedRequest sometimes which causes a NPE. Fix RecordedRequest's constructor to allow for null method and path which is parsed from the requestLine argument. This change authored by Brian Muramatsu git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@15 cf848351-439f-e86a-257f-67fa721851d5 --- .../com/google/mockwebserver/RecordedRequest.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/google/mockwebserver/RecordedRequest.java b/src/main/java/com/google/mockwebserver/RecordedRequest.java index 8d7dc87ed..8a11897c1 100644 --- a/src/main/java/com/google/mockwebserver/RecordedRequest.java +++ b/src/main/java/com/google/mockwebserver/RecordedRequest.java @@ -50,10 +50,15 @@ public final class RecordedRequest { sslProtocol = null; } - int methodEnd = requestLine.indexOf(' '); - int pathEnd = requestLine.indexOf(' ', methodEnd + 1); - this.method = requestLine.substring(0, methodEnd); - this.path = requestLine.substring(methodEnd + 1, pathEnd); + if (requestLine != null) { + int methodEnd = requestLine.indexOf(' '); + int pathEnd = requestLine.indexOf(' ', methodEnd + 1); + this.method = requestLine.substring(0, methodEnd); + this.path = requestLine.substring(methodEnd + 1, pathEnd); + } else { + this.method = null; + this.path = null; + } } public String getRequestLine() { @@ -115,4 +120,4 @@ public final class RecordedRequest { public String getPath() { return path; } -} +} \ No newline at end of file From 2b67e7069c8a547210bc78135ef7aec92f598833 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Fri, 27 Jul 2012 22:59:24 +0000 Subject: [PATCH 13/43] Don't exit the server just because the response queue is empty. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@16 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 4 ++-- .../google/mockwebserver/MockWebServer.java | 14 ++++------- .../mockwebserver/MockWebServerTest.java | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 341ee7cac..f513d0c65 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20120127 + 20120727 mockwebserver http://code.google.com/p/mockwebserver @@ -87,4 +87,4 @@ scm:svn:https://code.google.com/p/mockwebserver/ http://code.google.com/p/mockwebserver/source/browse - \ No newline at end of file + diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index a013d9717..5116991d3 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -228,12 +228,12 @@ public final class MockWebServer { } private void acceptConnections() throws Exception { - do { + while (true) { Socket socket; try { socket = serverSocket.accept(); - } catch (SocketException ignored) { - continue; + } catch (SocketException e) { + return; } MockResponse peek = responseQueue.peek(); if (peek != null && peek.getSocketPolicy() == DISCONNECT_AT_START) { @@ -243,7 +243,7 @@ public final class MockWebServer { openClientSockets.add(socket); serveConnection(socket); } - } while (!responseQueue.isEmpty()); + } } })); } @@ -290,7 +290,7 @@ public final class MockWebServer { InputStream in = new BufferedInputStream(socket.getInputStream()); OutputStream out = new BufferedOutputStream(socket.getOutputStream()); - while (!responseQueue.isEmpty() && processOneRequest(socket, in, out)) {} + while (processOneRequest(socket, in, out)) {} if (sequenceNumber == 0) { logger.warning("MockWebServer connection didn't make a request"); @@ -450,10 +450,6 @@ public final class MockWebServer { * Returns a response to satisfy {@code request}. */ private MockResponse dispatch(RecordedRequest request) throws InterruptedException { - if (responseQueue.isEmpty()) { - throw new IllegalStateException("Unexpected request: " + request); - } - // to permit interactive/browser testing, ignore requests for favicons if (request.getRequestLine().equals("GET /favicon.ico HTTP/1.1")) { System.out.println("served " + request.getRequestLine()); diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java index 353361b92..760cee0ac 100644 --- a/src/test/java/com/google/mockwebserver/MockWebServerTest.java +++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java @@ -75,6 +75,29 @@ public final class MockWebServerTest extends TestCase { assertEquals("GET /new-path HTTP/1.1", redirect.getRequestLine()); } + /** + * Test that MockWebServer blocks for a call to enqueue() if a request + * is made before a mock response is ready. + */ + public void testDispatchBlocksWaitingForEnqueue() throws Exception { + server.play(); + + new Thread() { + @Override public void run() { + try { + Thread.sleep(1000); + } catch (InterruptedException ignored) { + } + server.enqueue(new MockResponse().setBody("enqueued in the background")); + } + }.start(); + + URLConnection connection = server.getUrl("/").openConnection(); + InputStream in = connection.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + assertEquals("enqueued in the background", reader.readLine()); + } + public void testNonHexadecimalChunkSize() throws Exception { server.enqueue(new MockResponse() .setBody("G\r\nxxxxxxxxxxxxxxxx\r\n0\r\n\r\n") From e9e2f742d08d767222685b4f0a38c4d5f28121ec Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Tue, 31 Jul 2012 14:39:09 +0000 Subject: [PATCH 14/43] Fix a bug where we were still exiting without an explicit shutdown() git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@17 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- src/main/java/com/google/mockwebserver/MockWebServer.java | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index f513d0c65..feaa33c05 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20120727 + 20120730 mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 5116991d3..75f42cd0f 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -290,7 +290,8 @@ public final class MockWebServer { InputStream in = new BufferedInputStream(socket.getInputStream()); OutputStream out = new BufferedOutputStream(socket.getOutputStream()); - while (processOneRequest(socket, in, out)) {} + while (processOneRequest(socket, in, out)) { + } if (sequenceNumber == 0) { logger.warning("MockWebServer connection didn't make a request"); @@ -299,9 +300,6 @@ public final class MockWebServer { in.close(); out.close(); socket.close(); - if (responseQueue.isEmpty()) { - shutdown(); - } openClientSockets.remove(socket); } From daa9c93ce3b04eb6351719be302f2f5d70296c81 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Tue, 31 Jul 2012 15:32:16 +0000 Subject: [PATCH 15/43] Fix some ergonomic issues in the API. This adds some missing methods and removes some unnecessary exceptions. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@18 cf848351-439f-e86a-257f-67fa721851d5 --- .../google/mockwebserver/MockResponse.java | 83 ++++++++++++++----- .../google/mockwebserver/MockWebServer.java | 17 ++-- .../google/mockwebserver/RecordedRequest.java | 60 ++++++++++++-- .../mockwebserver/MockWebServerTest.java | 61 +++++++++++++- 4 files changed, 183 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/google/mockwebserver/MockResponse.java b/src/main/java/com/google/mockwebserver/MockResponse.java index 17e00f32a..bcc693810 100644 --- a/src/main/java/com/google/mockwebserver/MockResponse.java +++ b/src/main/java/com/google/mockwebserver/MockResponse.java @@ -16,7 +16,6 @@ package com.google.mockwebserver; -import static com.google.mockwebserver.MockWebServer.ASCII; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -24,6 +23,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import static com.google.mockwebserver.MockWebServer.ASCII; + /** * A scripted response to be replayed by the mock web server. */ @@ -38,6 +39,9 @@ public final class MockResponse implements Cloneable { private int bytesPerSecond = Integer.MAX_VALUE; private SocketPolicy socketPolicy = SocketPolicy.KEEP_OPEN; + /** + * Creates a new mock response with an empty body. + */ public MockResponse() { headers.add(EMPTY_BODY_HEADER); } @@ -76,27 +80,46 @@ public final class MockResponse implements Cloneable { return headers; } + /** + * Removes all HTTP headers including any "Content-Length" and + * "Transfer-encoding" headers that were added by default. + */ public MockResponse clearHeaders() { headers.clear(); return this; } + /** + * Adds {@code header} as an HTTP header. For well-formed HTTP {@code + * header} should contain a name followed by a colon and a value. + */ public MockResponse addHeader(String header) { headers.add(header); return this; } + /** + * Adds a new header with the name and value. This may be used to add + * multiple headers with the same name. + */ public MockResponse addHeader(String name, Object value) { return addHeader(name + ": " + String.valueOf(value)); } + /** + * Removes all headers named {@code name}, then adds a new header with the + * name and value. + */ public MockResponse setHeader(String name, Object value) { removeHeader(name); return addHeader(name, value); } + /** + * Removes all headers named {@code name}. + */ public MockResponse removeHeader(String name) { - name += ": "; + name += ":"; for (Iterator i = headers.iterator(); i.hasNext();) { String header = i.next(); if (name.regionMatches(true, 0, header, 0, name.length())) { @@ -107,7 +130,7 @@ public final class MockResponse implements Cloneable { } /** - * Returns an input stream containing the raw HTTP payload. + * Returns the raw HTTP payload. */ public byte[] getBody() { return body; @@ -122,35 +145,54 @@ public final class MockResponse implements Cloneable { return this; } + /** + * Sets the response body to the UTF-8 encoded bytes of {@code body}. + */ public MockResponse setBody(String body) { try { - return setBody(body.getBytes(ASCII)); + return setBody(body.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { throw new AssertionError(); } } - public MockResponse setChunkedBody(byte[] body, int maxChunkSize) throws IOException { + /** + * Sets the response body to {@code body}, chunked every {@code + * maxChunkSize} bytes. + */ + public MockResponse setChunkedBody(byte[] body, int maxChunkSize) { headers.remove(EMPTY_BODY_HEADER); headers.add(CHUNKED_BODY_HEADER); - ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); - int pos = 0; - while (pos < body.length) { - int chunkSize = Math.min(body.length - pos, maxChunkSize); - bytesOut.write(Integer.toHexString(chunkSize).getBytes(ASCII)); - bytesOut.write("\r\n".getBytes(ASCII)); - bytesOut.write(body, pos, chunkSize); - bytesOut.write("\r\n".getBytes(ASCII)); - pos += chunkSize; + try { + ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); + int pos = 0; + while (pos < body.length) { + int chunkSize = Math.min(body.length - pos, maxChunkSize); + bytesOut.write(Integer.toHexString(chunkSize).getBytes(ASCII)); + bytesOut.write("\r\n".getBytes(ASCII)); + bytesOut.write(body, pos, chunkSize); + bytesOut.write("\r\n".getBytes(ASCII)); + pos += chunkSize; + } + bytesOut.write("0\r\n\r\n".getBytes(ASCII)); // last chunk + empty trailer + crlf + this.body = bytesOut.toByteArray(); + return this; + } catch (IOException e) { + throw new AssertionError(); // In-memory I/O doesn't throw IOExceptions. } - bytesOut.write("0\r\n\r\n".getBytes(ASCII)); // last chunk + empty trailer + crlf - this.body = bytesOut.toByteArray(); - return this; } - public MockResponse setChunkedBody(String body, int maxChunkSize) throws IOException { - return setChunkedBody(body.getBytes(ASCII), maxChunkSize); + /** + * Sets the response body to the UTF-8 encoded bytes of {@code body}, + * chunked every {@code maxChunkSize} bytes. + */ + public MockResponse setChunkedBody(String body, int maxChunkSize) { + try { + return setChunkedBody(body.getBytes("UTF-8"), maxChunkSize); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(); + } } public SocketPolicy getSocketPolicy() { @@ -167,7 +209,8 @@ public final class MockResponse implements Cloneable { } /** - * Set simulated network speed, in bytes per second. + * Set simulated network speed, in bytes per second. This applies to the + * response body only; response headers are not throttled. */ public MockResponse setBytesPerSecond(int bytesPerSecond) { this.bytesPerSecond = bytesPerSecond; diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 75f42cd0f..f6d30907d 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -16,8 +16,6 @@ package com.google.mockwebserver; -import static com.google.mockwebserver.SocketPolicy.DISCONNECT_AT_START; -import static com.google.mockwebserver.SocketPolicy.FAIL_HANDSHAKE; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; @@ -56,6 +54,9 @@ import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; +import static com.google.mockwebserver.SocketPolicy.DISCONNECT_AT_START; +import static com.google.mockwebserver.SocketPolicy.FAIL_HANDSHAKE; + /** * A scriptable web server. Callers supply canned responses and the server * replays them upon request in sequence. @@ -105,10 +106,14 @@ public final class MockWebServer { * * @param path the request path, such as "/". */ - public URL getUrl(String path) throws MalformedURLException, UnknownHostException { - return sslSocketFactory != null - ? new URL("https://" + getHostName() + ":" + getPort() + path) - : new URL("http://" + getHostName() + ":" + getPort() + path); + public URL getUrl(String path) { + try { + return sslSocketFactory != null + ? new URL("https://" + getHostName() + ":" + getPort() + path) + : new URL("http://" + getHostName() + ":" + getPort() + path); + } catch (MalformedURLException e) { + throw new AssertionError(e); + } } /** diff --git a/src/main/java/com/google/mockwebserver/RecordedRequest.java b/src/main/java/com/google/mockwebserver/RecordedRequest.java index 8a11897c1..d28e74286 100644 --- a/src/main/java/com/google/mockwebserver/RecordedRequest.java +++ b/src/main/java/com/google/mockwebserver/RecordedRequest.java @@ -16,7 +16,9 @@ package com.google.mockwebserver; +import java.io.UnsupportedEncodingException; import java.net.Socket; +import java.util.ArrayList; import java.util.List; import javax.net.ssl.SSLSocket; @@ -65,10 +67,49 @@ public final class RecordedRequest { return requestLine; } + public String getMethod() { + return method; + } + + public String getPath() { + return path; + } + + /** + * Returns all headers. + */ public List getHeaders() { return headers; } + /** + * Returns the first header named {@code name}, or null if no such header + * exists. + */ + public String getHeader(String name) { + name += ":"; + for (String header : headers) { + if (name.regionMatches(true, 0, header, 0, name.length())) { + return header.substring(name.length()).trim(); + } + } + return null; + } + + /** + * Returns the headers named {@code name}. + */ + public List getHeaders(String name) { + List result = new ArrayList(); + name += ":"; + for (String header : headers) { + if (name.regionMatches(true, 0, header, 0, name.length())) { + result.add(header.substring(name.length()).trim()); + } + } + return result; + } + /** * Returns the sizes of the chunks of this request's body, or an empty list * if the request's body was empty or unchunked. @@ -92,6 +133,17 @@ public final class RecordedRequest { return body; } + /** + * Returns the body of this POST request decoded as a UTF-8 string. + */ + public String getUtf8Body() { + try { + return new String(body, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(); + } + } + /** * Returns the index of this request on its HTTP connection. Since a single * HTTP connection may serve multiple requests, each request is assigned its @@ -112,12 +164,4 @@ public final class RecordedRequest { @Override public String toString() { return requestLine; } - - public String getMethod() { - return method; - } - - public String getPath() { - return path; - } } \ No newline at end of file diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java index 760cee0ac..fbd4c2e44 100644 --- a/src/test/java/com/google/mockwebserver/MockWebServerTest.java +++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java @@ -24,21 +24,74 @@ import java.net.HttpURLConnection; import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLConnection; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import junit.framework.TestCase; public final class MockWebServerTest extends TestCase { private MockWebServer server = new MockWebServer(); - @Override protected void setUp() throws Exception { - super.setUp(); - } - @Override protected void tearDown() throws Exception { server.shutdown(); super.tearDown(); } + public void testRecordedRequestAccessors() { + List headers = Arrays.asList( + "User-Agent: okhttp", + "Cookie: s=square", + "Cookie: a=android", + "X-Whitespace: left", + "X-Whitespace:right ", + "X-Whitespace: both " + ); + List chunkSizes = Collections.emptyList(); + byte[] body = { 'A', 'B', 'C' }; + String requestLine = "GET / HTTP/1.1"; + RecordedRequest request = new RecordedRequest( + requestLine, headers, chunkSizes, body.length, body, 0, null); + assertEquals("s=square", request.getHeader("cookie")); + assertEquals(Arrays.asList("s=square", "a=android"), request.getHeaders("cookie")); + assertEquals("left", request.getHeader("x-whitespace")); + assertEquals(Arrays.asList("left", "right", "both"), request.getHeaders("x-whitespace")); + assertEquals("ABC", request.getUtf8Body()); + } + + public void testDefaultMockResponse() { + MockResponse response = new MockResponse(); + assertEquals(Arrays.asList("Content-Length: 0"), response.getHeaders()); + assertEquals("HTTP/1.1 200 OK", response.getStatus()); + } + + public void testSetBodyAdjustsHeaders() { + MockResponse response = new MockResponse().setBody("ABC"); + assertEquals(Arrays.asList("Content-Length: 3"), response.getHeaders()); + assertTrue(Arrays.equals(response.getBody(), new byte[] { 'A', 'B', 'C' })); + assertEquals("HTTP/1.1 200 OK", response.getStatus()); + } + + public void testMockResponseAddHeader() { + MockResponse response = new MockResponse() + .clearHeaders() + .addHeader("Cookie: s=square") + .addHeader("Cookie", "a=android"); + assertEquals(Arrays.asList("Cookie: s=square", "Cookie: a=android"), + response.getHeaders()); + } + + public void testMockResponseSetHeader() { + MockResponse response = new MockResponse() + .clearHeaders() + .addHeader("Cookie: s=square") + .addHeader("Cookie: a=android") + .addHeader("Cookies: delicious"); + response.setHeader("cookie", "r=robot"); + assertEquals(Arrays.asList("Cookies: delicious", "cookie: r=robot"), + response.getHeaders()); + } + public void testRegularResponse() throws Exception { server.enqueue(new MockResponse().setBody("hello world")); server.play(); From ec1f3e9073439c03b22de4f2314724d6066efb4b Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Tue, 31 Jul 2012 15:37:03 +0000 Subject: [PATCH 16/43] Rebuild Javadoc git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@19 cf848351-439f-e86a-257f-67fa721851d5 --- javadoc/allclasses-frame.html | 37 -- javadoc/allclasses-noframe.html | 37 -- .../google/mockwebserver/MockResponse.html | 582 ------------------ .../google/mockwebserver/MockWebServer.html | 533 ---------------- .../google/mockwebserver/RecordedRequest.html | 350 ----------- .../google/mockwebserver/SocketPolicy.html | 411 ------------- .../google/mockwebserver/package-frame.html | 47 -- .../google/mockwebserver/package-summary.html | 175 ------ .../google/mockwebserver/package-tree.html | 157 ----- javadoc/constant-values.html | 142 ----- javadoc/deprecated-list.html | 142 ----- javadoc/help-doc.html | 209 ------- javadoc/index-all.html | 311 ---------- javadoc/index.html | 36 -- javadoc/overview-tree.html | 159 ----- javadoc/package-list | 1 - javadoc/resources/inherit.gif | Bin 57 -> 0 bytes javadoc/stylesheet.css | 29 - pom.xml | 2 +- 19 files changed, 1 insertion(+), 3359 deletions(-) delete mode 100644 javadoc/allclasses-frame.html delete mode 100644 javadoc/allclasses-noframe.html delete mode 100644 javadoc/com/google/mockwebserver/MockResponse.html delete mode 100644 javadoc/com/google/mockwebserver/MockWebServer.html delete mode 100644 javadoc/com/google/mockwebserver/RecordedRequest.html delete mode 100644 javadoc/com/google/mockwebserver/SocketPolicy.html delete mode 100644 javadoc/com/google/mockwebserver/package-frame.html delete mode 100644 javadoc/com/google/mockwebserver/package-summary.html delete mode 100644 javadoc/com/google/mockwebserver/package-tree.html delete mode 100644 javadoc/constant-values.html delete mode 100644 javadoc/deprecated-list.html delete mode 100644 javadoc/help-doc.html delete mode 100644 javadoc/index-all.html delete mode 100644 javadoc/index.html delete mode 100644 javadoc/overview-tree.html delete mode 100644 javadoc/package-list delete mode 100644 javadoc/resources/inherit.gif delete mode 100644 javadoc/stylesheet.css diff --git a/javadoc/allclasses-frame.html b/javadoc/allclasses-frame.html deleted file mode 100644 index 9e56e3537..000000000 --- a/javadoc/allclasses-frame.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - -All Classes (MockWebServer) - - - - - - - - - - - -All Classes -
- - - - - -
MockResponse -
-MockWebServer -
-RecordedRequest -
-SocketPolicy -
-
- - - diff --git a/javadoc/allclasses-noframe.html b/javadoc/allclasses-noframe.html deleted file mode 100644 index aa2d9b768..000000000 --- a/javadoc/allclasses-noframe.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - -All Classes (MockWebServer) - - - - - - - - - - - -All Classes -
- - - - - -
MockResponse -
-MockWebServer -
-RecordedRequest -
-SocketPolicy -
-
- - - diff --git a/javadoc/com/google/mockwebserver/MockResponse.html b/javadoc/com/google/mockwebserver/MockResponse.html deleted file mode 100644 index fd1495ff2..000000000 --- a/javadoc/com/google/mockwebserver/MockResponse.html +++ /dev/null @@ -1,582 +0,0 @@ - - - - - - -MockResponse (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class MockResponse

-
-java.lang.Object
-  extended by com.google.mockwebserver.MockResponse
-
-
-
All Implemented Interfaces:
java.lang.Cloneable
-
-
-
-
public final class MockResponse
extends java.lang.Object
implements java.lang.Cloneable
- - -

-A scripted response to be replayed by the mock web server. -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
MockResponse() - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- MockResponseaddHeader(java.lang.String header) - -
-           
- MockResponseclearHeaders() - -
-           
- MockResponseclone() - -
-           
- byte[]getBody() - -
-          Returns an input stream containing the raw HTTP payload.
- java.util.List<java.lang.String>getHeaders() - -
-          Returns the HTTP headers, such as "Content-Length: 0".
- SocketPolicygetSocketPolicy() - -
-           
- java.lang.StringgetStatus() - -
-          Returns the HTTP response line, such as "HTTP/1.1 200 OK".
- MockResponsesetBody(byte[] body) - -
-           
- MockResponsesetBody(java.lang.String body) - -
-           
- MockResponsesetChunkedBody(byte[] body, - int maxChunkSize) - -
-           
- MockResponsesetChunkedBody(java.lang.String body, - int maxChunkSize) - -
-           
- MockResponsesetResponseCode(int code) - -
-           
- MockResponsesetSocketPolicy(SocketPolicy socketPolicy) - -
-           
- MockResponsesetStatus(java.lang.String status) - -
-           
- java.lang.StringtoString() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-MockResponse

-
-public MockResponse()
-
-
- - - - - - - - -
-Method Detail
- -

-clone

-
-public MockResponse clone()
-
-
-
Overrides:
clone in class java.lang.Object
-
-
-
-
-
-
- -

-getStatus

-
-public java.lang.String getStatus()
-
-
Returns the HTTP response line, such as "HTTP/1.1 200 OK". -

-

-
-
-
-
-
-
-
- -

-setResponseCode

-
-public MockResponse setResponseCode(int code)
-
-
-
-
-
-
-
-
-
- -

-setStatus

-
-public MockResponse setStatus(java.lang.String status)
-
-
-
-
-
-
-
-
-
- -

-getHeaders

-
-public java.util.List<java.lang.String> getHeaders()
-
-
Returns the HTTP headers, such as "Content-Length: 0". -

-

-
-
-
-
-
-
-
- -

-clearHeaders

-
-public MockResponse clearHeaders()
-
-
-
-
-
-
-
-
-
- -

-addHeader

-
-public MockResponse addHeader(java.lang.String header)
-
-
-
-
-
-
-
-
-
- -

-getBody

-
-public byte[] getBody()
-
-
Returns an input stream containing the raw HTTP payload. -

-

-
-
-
-
-
-
-
- -

-setBody

-
-public MockResponse setBody(byte[] body)
-
-
-
-
-
-
-
-
-
- -

-setBody

-
-public MockResponse setBody(java.lang.String body)
-
-
-
-
-
-
-
-
-
- -

-setChunkedBody

-
-public MockResponse setChunkedBody(byte[] body,
-                                   int maxChunkSize)
-                            throws java.io.IOException
-
-
-
-
-
- -
Throws: -
java.io.IOException
-
-
-
- -

-setChunkedBody

-
-public MockResponse setChunkedBody(java.lang.String body,
-                                   int maxChunkSize)
-                            throws java.io.IOException
-
-
-
-
-
- -
Throws: -
java.io.IOException
-
-
-
- -

-getSocketPolicy

-
-public SocketPolicy getSocketPolicy()
-
-
-
-
-
-
-
-
-
- -

-setSocketPolicy

-
-public MockResponse setSocketPolicy(SocketPolicy socketPolicy)
-
-
-
-
-
-
-
-
-
- -

-toString

-
-public java.lang.String toString()
-
-
-
Overrides:
toString in class java.lang.Object
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/com/google/mockwebserver/MockWebServer.html b/javadoc/com/google/mockwebserver/MockWebServer.html deleted file mode 100644 index 077449b16..000000000 --- a/javadoc/com/google/mockwebserver/MockWebServer.html +++ /dev/null @@ -1,533 +0,0 @@ - - - - - - -MockWebServer (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class MockWebServer

-
-java.lang.Object
-  extended by com.google.mockwebserver.MockWebServer
-
-
-
-
public final class MockWebServer
extends java.lang.Object
- - -

-A scriptable web server. Callers supply canned responses and the server - replays them upon request in sequence. -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
MockWebServer() - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidenqueue(MockResponse response) - -
-           
- java.lang.StringgetHostName() - -
-           
- intgetPort() - -
-           
- intgetRequestCount() - -
-          Returns the number of HTTP requests received thus far by this server.
- java.net.URLgetUrl(java.lang.String path) - -
-          Returns a URL for connecting to this server.
- voidplay() - -
-          Equivalent to play(0).
- voidplay(int port) - -
-          Starts the server, serves all enqueued requests, and shuts the server - down.
- voidsetBodyLimit(int maxBodyLength) - -
-          Sets the number of bytes of the POST body to keep in memory to the given - limit.
- voidsetSingleResponse(boolean singleResponse) - -
-          By default, this class processes requests coming in by adding them to a - queue and serves responses by removing them from another queue.
- voidshutdown() - -
-           
- RecordedRequesttakeRequest() - -
-          Awaits the next HTTP request, removes it, and returns it.
- java.net.ProxytoProxyAddress() - -
-           
- voiduseHttps(javax.net.ssl.SSLSocketFactory sslSocketFactory, - boolean tunnelProxy) - -
-          Serve requests with HTTPS rather than otherwise.
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-MockWebServer

-
-public MockWebServer()
-
-
- - - - - - - - -
-Method Detail
- -

-getPort

-
-public int getPort()
-
-
-
-
-
-
- -

-getHostName

-
-public java.lang.String getHostName()
-
-
-
-
-
-
- -

-toProxyAddress

-
-public java.net.Proxy toProxyAddress()
-
-
-
-
-
-
- -

-getUrl

-
-public java.net.URL getUrl(java.lang.String path)
-                    throws java.net.MalformedURLException,
-                           java.net.UnknownHostException
-
-
Returns a URL for connecting to this server. -

-

-
Parameters:
path - the request path, such as "/". -
Throws: -
java.net.MalformedURLException -
java.net.UnknownHostException
-
-
-
- -

-setBodyLimit

-
-public void setBodyLimit(int maxBodyLength)
-
-
Sets the number of bytes of the POST body to keep in memory to the given - limit. -

-

-
-
-
-
- -

-useHttps

-
-public void useHttps(javax.net.ssl.SSLSocketFactory sslSocketFactory,
-                     boolean tunnelProxy)
-
-
Serve requests with HTTPS rather than otherwise. -

-

-
Parameters:
tunnelProxy - whether to expect the HTTP CONNECT method before - negotiating TLS.
-
-
-
- -

-takeRequest

-
-public RecordedRequest takeRequest()
-                            throws java.lang.InterruptedException
-
-
Awaits the next HTTP request, removes it, and returns it. Callers should - use this to verify the request sent was as intended. -

-

- -
Throws: -
java.lang.InterruptedException
-
-
-
- -

-getRequestCount

-
-public int getRequestCount()
-
-
Returns the number of HTTP requests received thus far by this server. - This may exceed the number of HTTP connections when connection reuse is - in practice. -

-

-
-
-
-
- -

-enqueue

-
-public void enqueue(MockResponse response)
-
-
-
-
-
-
- -

-setSingleResponse

-
-public void setSingleResponse(boolean singleResponse)
-
-
By default, this class processes requests coming in by adding them to a - queue and serves responses by removing them from another queue. This mode - is appropriate for correctness testing. - -

Serving a single response causes the server to be stateless: requests - are not enqueued, and responses are not dequeued. This mode is appropriate - for benchmarking. -

-

-
-
-
-
- -

-play

-
-public void play()
-          throws java.io.IOException
-
-
Equivalent to play(0). -

-

- -
Throws: -
java.io.IOException
-
-
-
- -

-play

-
-public void play(int port)
-          throws java.io.IOException
-
-
Starts the server, serves all enqueued requests, and shuts the server - down. -

-

-
Parameters:
port - the port to listen to, or 0 for any available port. - Automated tests should always use port 0 to avoid flakiness when a - specific port is unavailable. -
Throws: -
java.io.IOException
-
-
-
- -

-shutdown

-
-public void shutdown()
-              throws java.io.IOException
-
-
- -
Throws: -
java.io.IOException
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/com/google/mockwebserver/RecordedRequest.html b/javadoc/com/google/mockwebserver/RecordedRequest.html deleted file mode 100644 index 803f265e3..000000000 --- a/javadoc/com/google/mockwebserver/RecordedRequest.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - -RecordedRequest (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class RecordedRequest

-
-java.lang.Object
-  extended by com.google.mockwebserver.RecordedRequest
-
-
-
-
public final class RecordedRequest
extends java.lang.Object
- - -

-An HTTP request that came into the mock web server. -

- -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- byte[]getBody() - -
-          Returns the body of this POST request.
- intgetBodySize() - -
-          Returns the total size of the body of this POST request (before - truncation).
- java.util.List<java.lang.Integer>getChunkSizes() - -
-          Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked.
- java.util.List<java.lang.String>getHeaders() - -
-           
- java.lang.StringgetRequestLine() - -
-           
- intgetSequenceNumber() - -
-          Returns the index of this request on its HTTP connection.
- java.lang.StringtoString() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Method Detail
- -

-getRequestLine

-
-public java.lang.String getRequestLine()
-
-
-
-
-
-
- -

-getHeaders

-
-public java.util.List<java.lang.String> getHeaders()
-
-
-
-
-
-
- -

-getChunkSizes

-
-public java.util.List<java.lang.Integer> getChunkSizes()
-
-
Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked. -

-

-
-
-
-
- -

-getBodySize

-
-public int getBodySize()
-
-
Returns the total size of the body of this POST request (before - truncation). -

-

-
-
-
-
- -

-getBody

-
-public byte[] getBody()
-
-
Returns the body of this POST request. This may be truncated. -

-

-
-
-
-
- -

-getSequenceNumber

-
-public int getSequenceNumber()
-
-
Returns the index of this request on its HTTP connection. Since a single - HTTP connection may serve multiple requests, each request is assigned its - own sequence number. -

-

-
-
-
-
- -

-toString

-
-public java.lang.String toString()
-
-
-
Overrides:
toString in class java.lang.Object
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/com/google/mockwebserver/SocketPolicy.html b/javadoc/com/google/mockwebserver/SocketPolicy.html deleted file mode 100644 index e25cccfab..000000000 --- a/javadoc/com/google/mockwebserver/SocketPolicy.html +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - -SocketPolicy (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Enum SocketPolicy

-
-java.lang.Object
-  extended by java.lang.Enum<SocketPolicy>
-      extended by com.google.mockwebserver.SocketPolicy
-
-
-
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<SocketPolicy>
-
-
-
-
public enum SocketPolicy
extends java.lang.Enum<SocketPolicy>
- - -

-What should be done with the incoming socket. -

- -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - -
-Enum Constant Summary
DISCONNECT_AT_END - -
-          Close the socket after the response.
DISCONNECT_AT_START - -
-          Request immediate close of connection without even reading the - request.
KEEP_OPEN - -
-          Keep the socket open after the response.
SHUTDOWN_INPUT_AT_END - -
-          Shutdown the socket input after sending the response.
SHUTDOWN_OUTPUT_AT_END - -
-          Shutdown the socket output after sending the response.
UPGRADE_TO_SSL_AT_END - -
-          Wrap the socket with SSL at the completion of this request/response - pair.
-  - - - - - - - - - - - - - - - -
-Method Summary
-static SocketPolicyvalueOf(java.lang.String name) - -
-          Returns the enum constant of this type with the specified name.
-static SocketPolicy[]values() - -
-          Returns an array containing the constants of this enum type, in -the order they are declared.
- - - - - - - -
Methods inherited from class java.lang.Enum
clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
- - - - - - - -
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Enum Constant Detail
- -

-KEEP_OPEN

-
-public static final SocketPolicy KEEP_OPEN
-
-
Keep the socket open after the response. This is the default HTTP/1.1 - behavior. -

-

-
-
-
- -

-DISCONNECT_AT_END

-
-public static final SocketPolicy DISCONNECT_AT_END
-
-
Close the socket after the response. This is the default HTTP/1.0 - behavior. -

-

-
-
-
- -

-UPGRADE_TO_SSL_AT_END

-
-public static final SocketPolicy UPGRADE_TO_SSL_AT_END
-
-
Wrap the socket with SSL at the completion of this request/response - pair. Used for CONNECT messages to tunnel SSL over an HTTP proxy. -

-

-
-
-
- -

-DISCONNECT_AT_START

-
-public static final SocketPolicy DISCONNECT_AT_START
-
-
Request immediate close of connection without even reading the - request. - -

Use to simulate the real life case of losing connection - because of bugger SSL server close connection when it seems - something like a compression method or TLS extension it doesn't - understand, instead of simply ignoring it like it should. -

-

-
-
-
- -

-SHUTDOWN_INPUT_AT_END

-
-public static final SocketPolicy SHUTDOWN_INPUT_AT_END
-
-
Shutdown the socket input after sending the response. For testing bad - behavior. -

-

-
-
-
- -

-SHUTDOWN_OUTPUT_AT_END

-
-public static final SocketPolicy SHUTDOWN_OUTPUT_AT_END
-
-
Shutdown the socket output after sending the response. For testing bad - behavior. -

-

-
-
- - - - - - - - -
-Method Detail
- -

-values

-
-public static SocketPolicy[] values()
-
-
Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
-for (SocketPolicy c : SocketPolicy.values())
-    System.out.println(c);
-
-

-

- -
Returns:
an array containing the constants of this enum type, in -the order they are declared
-
-
-
- -

-valueOf

-
-public static SocketPolicy valueOf(java.lang.String name)
-
-
Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.) -

-

-
Parameters:
name - the name of the enum constant to be returned. -
Returns:
the enum constant with the specified name -
Throws: -
java.lang.IllegalArgumentException - if this enum type has no constant -with the specified name -
java.lang.NullPointerException - if the argument is null
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/com/google/mockwebserver/package-frame.html b/javadoc/com/google/mockwebserver/package-frame.html deleted file mode 100644 index 8448c9610..000000000 --- a/javadoc/com/google/mockwebserver/package-frame.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - -com.google.mockwebserver (MockWebServer) - - - - - - - - - - - -com.google.mockwebserver - - - - -
-Classes  - -
-MockResponse -
-MockWebServer -
-RecordedRequest
- - - - - - -
-Enums  - -
-SocketPolicy
- - - - diff --git a/javadoc/com/google/mockwebserver/package-summary.html b/javadoc/com/google/mockwebserver/package-summary.html deleted file mode 100644 index 6d09d250b..000000000 --- a/javadoc/com/google/mockwebserver/package-summary.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - -com.google.mockwebserver (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.google.mockwebserver -

- - - - - - - - - - - - - - - - - -
-Class Summary
MockResponseA scripted response to be replayed by the mock web server.
MockWebServerA scriptable web server.
RecordedRequestAn HTTP request that came into the mock web server.
-  - -

- - - - - - - - - -
-Enum Summary
SocketPolicyWhat should be done with the incoming socket.
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/com/google/mockwebserver/package-tree.html b/javadoc/com/google/mockwebserver/package-tree.html deleted file mode 100644 index be7c256e9..000000000 --- a/javadoc/com/google/mockwebserver/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - -com.google.mockwebserver Class Hierarchy (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.google.mockwebserver -

-
-

-Class Hierarchy -

- -

-Enum Hierarchy -

-
    -
  • java.lang.Object
      -
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) - -
    -
-
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/constant-values.html b/javadoc/constant-values.html deleted file mode 100644 index bdf6f12e8..000000000 --- a/javadoc/constant-values.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - -Constant Field Values (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Constant Field Values

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/deprecated-list.html b/javadoc/deprecated-list.html deleted file mode 100644 index e2a274366..000000000 --- a/javadoc/deprecated-list.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - -Deprecated List (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Deprecated API

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/help-doc.html b/javadoc/help-doc.html deleted file mode 100644 index 86fb24b3b..000000000 --- a/javadoc/help-doc.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - -API Help (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-How This API Document Is Organized

-
-This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

-Package

-
- -

-Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    -
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
-
-

-Class/Interface

-
- -

-Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    -
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description -

    -

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary -

    -

  • Field Detail
  • Constructor Detail
  • Method Detail
-Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
- -

-Annotation Type

-
- -

-Each annotation type has its own separate page with the following sections:

    -
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
-
- -

-Enum

-
- -

-Each enum has its own separate page with the following sections:

    -
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
-
-

-Tree (Class Hierarchy)

-
-There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    -
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
-
-

-Deprecated API

-
-The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
-

-Index

-
-The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
-

-Prev/Next

-These links take you to the next or previous class, interface, package, or related page.

-Frames/No Frames

-These links show and hide the HTML frames. All pages are available with or without frames. -

-

-Serialized Form

-Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. -

-

-Constant Field Values

-The Constant Field Values page lists the static final fields and their values. -

- - -This help file applies to API documentation generated using the standard doclet. - -
-


- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/index-all.html b/javadoc/index-all.html deleted file mode 100644 index 08a06047d..000000000 --- a/javadoc/index-all.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - -Index (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -A C E G M P R S T U V
-

-A

-
-
addHeader(String) - -Method in class com.google.mockwebserver.MockResponse -
  -
-
-

-C

-
-
clearHeaders() - -Method in class com.google.mockwebserver.MockResponse -
  -
clone() - -Method in class com.google.mockwebserver.MockResponse -
  -
com.google.mockwebserver - package com.google.mockwebserver
 
-
-

-E

-
-
enqueue(MockResponse) - -Method in class com.google.mockwebserver.MockWebServer -
  -
-
-

-G

-
-
getBody() - -Method in class com.google.mockwebserver.MockResponse -
Returns an input stream containing the raw HTTP payload. -
getBody() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the body of this POST request. -
getBodySize() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the total size of the body of this POST request (before - truncation). -
getChunkSizes() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked. -
getHeaders() - -Method in class com.google.mockwebserver.MockResponse -
Returns the HTTP headers, such as "Content-Length: 0". -
getHeaders() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getHostName() - -Method in class com.google.mockwebserver.MockWebServer -
  -
getPort() - -Method in class com.google.mockwebserver.MockWebServer -
  -
getRequestCount() - -Method in class com.google.mockwebserver.MockWebServer -
Returns the number of HTTP requests received thus far by this server. -
getRequestLine() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getSequenceNumber() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the index of this request on its HTTP connection. -
getSocketPolicy() - -Method in class com.google.mockwebserver.MockResponse -
  -
getStatus() - -Method in class com.google.mockwebserver.MockResponse -
Returns the HTTP response line, such as "HTTP/1.1 200 OK". -
getUrl(String) - -Method in class com.google.mockwebserver.MockWebServer -
Returns a URL for connecting to this server. -
-
-

-M

-
-
MockResponse - Class in com.google.mockwebserver
A scripted response to be replayed by the mock web server.
MockResponse() - -Constructor for class com.google.mockwebserver.MockResponse -
  -
MockWebServer - Class in com.google.mockwebserver
A scriptable web server.
MockWebServer() - -Constructor for class com.google.mockwebserver.MockWebServer -
  -
-
-

-P

-
-
play() - -Method in class com.google.mockwebserver.MockWebServer -
Equivalent to play(0). -
play(int) - -Method in class com.google.mockwebserver.MockWebServer -
Starts the server, serves all enqueued requests, and shuts the server - down. -
-
-

-R

-
-
RecordedRequest - Class in com.google.mockwebserver
An HTTP request that came into the mock web server.
-
-

-S

-
-
setBody(byte[]) - -Method in class com.google.mockwebserver.MockResponse -
  -
setBody(String) - -Method in class com.google.mockwebserver.MockResponse -
  -
setBodyLimit(int) - -Method in class com.google.mockwebserver.MockWebServer -
Sets the number of bytes of the POST body to keep in memory to the given - limit. -
setChunkedBody(byte[], int) - -Method in class com.google.mockwebserver.MockResponse -
  -
setChunkedBody(String, int) - -Method in class com.google.mockwebserver.MockResponse -
  -
setResponseCode(int) - -Method in class com.google.mockwebserver.MockResponse -
  -
setSingleResponse(boolean) - -Method in class com.google.mockwebserver.MockWebServer -
By default, this class processes requests coming in by adding them to a - queue and serves responses by removing them from another queue. -
setSocketPolicy(SocketPolicy) - -Method in class com.google.mockwebserver.MockResponse -
  -
setStatus(String) - -Method in class com.google.mockwebserver.MockResponse -
  -
shutdown() - -Method in class com.google.mockwebserver.MockWebServer -
  -
SocketPolicy - Enum in com.google.mockwebserver
What should be done with the incoming socket.
-
-

-T

-
-
takeRequest() - -Method in class com.google.mockwebserver.MockWebServer -
Awaits the next HTTP request, removes it, and returns it. -
toProxyAddress() - -Method in class com.google.mockwebserver.MockWebServer -
  -
toString() - -Method in class com.google.mockwebserver.MockResponse -
  -
toString() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
-
-

-U

-
-
useHttps(SSLSocketFactory, boolean) - -Method in class com.google.mockwebserver.MockWebServer -
Serve requests with HTTPS rather than otherwise. -
-
-

-V

-
-
valueOf(String) - -Static method in enum com.google.mockwebserver.SocketPolicy -
Returns the enum constant of this type with the specified name. -
values() - -Static method in enum com.google.mockwebserver.SocketPolicy -
Returns an array containing the constants of this enum type, in -the order they are declared. -
-
-A C E G M P R S T U V - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/index.html b/javadoc/index.html deleted file mode 100644 index de77c3593..000000000 --- a/javadoc/index.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - -MockWebServer - - - - - - - - -<H2> -Frame Alert</H2> - -<P> -This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. -<BR> -Link to<A HREF="com/google/mockwebserver/package-summary.html">Non-frame version.</A> - - - diff --git a/javadoc/overview-tree.html b/javadoc/overview-tree.html deleted file mode 100644 index dfc9e0285..000000000 --- a/javadoc/overview-tree.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - -Class Hierarchy (MockWebServer) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For All Packages

-
-
-
Package Hierarchies:
com.google.mockwebserver
-
-

-Class Hierarchy -

- -

-Enum Hierarchy -

-
    -
  • java.lang.Object
      -
    • java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable) - -
    -
-
- - - - - - - - - - - - - - - -
- -
- - - -
- - - diff --git a/javadoc/package-list b/javadoc/package-list deleted file mode 100644 index 89508e5d3..000000000 --- a/javadoc/package-list +++ /dev/null @@ -1 +0,0 @@ -com.google.mockwebserver diff --git a/javadoc/resources/inherit.gif b/javadoc/resources/inherit.gif deleted file mode 100644 index c814867a13deb0ca7ea2156c6ca1d5a03372af7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X diff --git a/javadoc/stylesheet.css b/javadoc/stylesheet.css deleted file mode 100644 index 6ea9e5161..000000000 --- a/javadoc/stylesheet.css +++ /dev/null @@ -1,29 +0,0 @@ -/* Javadoc style sheet */ - -/* Define colors, fonts and other style attributes here to override the defaults */ - -/* Page background color */ -body { background-color: #FFFFFF; color:#000000 } - -/* Headings */ -h1 { font-size: 145% } - -/* Table colors */ -.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ -.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ -.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ - -/* Font used in left-hand frame lists */ -.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } - -/* Navigation bar fonts and colors */ -.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ -.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ -.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} -.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} - -.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} -.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} - diff --git a/pom.xml b/pom.xml index feaa33c05..4c7fda362 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20120730 + 20120731 mockwebserver http://code.google.com/p/mockwebserver From abb3ab4f50a99119caf0871fe95234a3e619dc82 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Tue, 31 Jul 2012 15:39:34 +0000 Subject: [PATCH 17/43] New Javadocs. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@20 cf848351-439f-e86a-257f-67fa721851d5 --- javadoc/allclasses-frame.html | 38 + javadoc/allclasses-noframe.html | 38 + .../google/mockwebserver/MockResponse.html | 721 ++++++++++++++++++ .../google/mockwebserver/MockWebServer.html | 554 ++++++++++++++ .../google/mockwebserver/RecordedRequest.html | 481 ++++++++++++ .../google/mockwebserver/SocketPolicy.html | 432 +++++++++++ .../mockwebserver/class-use/MockResponse.html | 293 +++++++ .../class-use/MockWebServer.html | 143 ++++ .../class-use/RecordedRequest.html | 166 ++++ .../mockwebserver/class-use/SocketPolicy.html | 199 +++++ .../google/mockwebserver/package-frame.html | 48 ++ .../google/mockwebserver/package-summary.html | 178 +++++ .../google/mockwebserver/package-tree.html | 160 ++++ .../com/google/mockwebserver/package-use.html | 168 ++++ javadoc/constant-values.html | 145 ++++ javadoc/deprecated-list.html | 145 ++++ javadoc/help-doc.html | 216 ++++++ javadoc/index-all.html | 355 +++++++++ javadoc/index.html | 37 + javadoc/overview-tree.html | 162 ++++ javadoc/package-list | 1 + javadoc/resources/inherit.gif | Bin 0 -> 57 bytes javadoc/stylesheet.css | 29 + 23 files changed, 4709 insertions(+) create mode 100644 javadoc/allclasses-frame.html create mode 100644 javadoc/allclasses-noframe.html create mode 100644 javadoc/com/google/mockwebserver/MockResponse.html create mode 100644 javadoc/com/google/mockwebserver/MockWebServer.html create mode 100644 javadoc/com/google/mockwebserver/RecordedRequest.html create mode 100644 javadoc/com/google/mockwebserver/SocketPolicy.html create mode 100644 javadoc/com/google/mockwebserver/class-use/MockResponse.html create mode 100644 javadoc/com/google/mockwebserver/class-use/MockWebServer.html create mode 100644 javadoc/com/google/mockwebserver/class-use/RecordedRequest.html create mode 100644 javadoc/com/google/mockwebserver/class-use/SocketPolicy.html create mode 100644 javadoc/com/google/mockwebserver/package-frame.html create mode 100644 javadoc/com/google/mockwebserver/package-summary.html create mode 100644 javadoc/com/google/mockwebserver/package-tree.html create mode 100644 javadoc/com/google/mockwebserver/package-use.html create mode 100644 javadoc/constant-values.html create mode 100644 javadoc/deprecated-list.html create mode 100644 javadoc/help-doc.html create mode 100644 javadoc/index-all.html create mode 100644 javadoc/index.html create mode 100644 javadoc/overview-tree.html create mode 100644 javadoc/package-list create mode 100644 javadoc/resources/inherit.gif create mode 100644 javadoc/stylesheet.css diff --git a/javadoc/allclasses-frame.html b/javadoc/allclasses-frame.html new file mode 100644 index 000000000..23792305c --- /dev/null +++ b/javadoc/allclasses-frame.html @@ -0,0 +1,38 @@ + + + + + + + +All Classes (mockwebserver 20120731 API) + + + + + + + + + + + +All Classes +
+ + + + + +
MockResponse +
+MockWebServer +
+RecordedRequest +
+SocketPolicy +
+
+ + + diff --git a/javadoc/allclasses-noframe.html b/javadoc/allclasses-noframe.html new file mode 100644 index 000000000..db23eb0c3 --- /dev/null +++ b/javadoc/allclasses-noframe.html @@ -0,0 +1,38 @@ + + + + + + + +All Classes (mockwebserver 20120731 API) + + + + + + + + + + + +All Classes +
+ + + + + +
MockResponse +
+MockWebServer +
+RecordedRequest +
+SocketPolicy +
+
+ + + diff --git a/javadoc/com/google/mockwebserver/MockResponse.html b/javadoc/com/google/mockwebserver/MockResponse.html new file mode 100644 index 000000000..40ed7b9b6 --- /dev/null +++ b/javadoc/com/google/mockwebserver/MockResponse.html @@ -0,0 +1,721 @@ + + + + + + + +MockResponse (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class MockResponse

+
+java.lang.Object
+  extended by com.google.mockwebserver.MockResponse
+
+
+
All Implemented Interfaces:
Cloneable
+
+
+
+
public final class MockResponse
extends Object
implements Cloneable
+ + +

+A scripted response to be replayed by the mock web server. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
MockResponse() + +
+          Creates a new mock response with an empty body.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ MockResponseaddHeader(String header) + +
+          Adds header as an HTTP header.
+ MockResponseaddHeader(String name, + Object value) + +
+          Adds a new header with the name and value.
+ MockResponseclearHeaders() + +
+          Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default.
+ MockResponseclone() + +
+           
+ byte[]getBody() + +
+          Returns the raw HTTP payload.
+ intgetBytesPerSecond() + +
+           
+ List<String>getHeaders() + +
+          Returns the HTTP headers, such as "Content-Length: 0".
+ SocketPolicygetSocketPolicy() + +
+           
+ StringgetStatus() + +
+          Returns the HTTP response line, such as "HTTP/1.1 200 OK".
+ MockResponseremoveHeader(String name) + +
+          Removes all headers named name.
+ MockResponsesetBody(byte[] body) + +
+           
+ MockResponsesetBody(String body) + +
+          Sets the response body to the UTF-8 encoded bytes of body.
+ MockResponsesetBytesPerSecond(int bytesPerSecond) + +
+          Set simulated network speed, in bytes per second.
+ MockResponsesetChunkedBody(byte[] body, + int maxChunkSize) + +
+          Sets the response body to body, chunked every maxChunkSize bytes.
+ MockResponsesetChunkedBody(String body, + int maxChunkSize) + +
+          Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes.
+ MockResponsesetHeader(String name, + Object value) + +
+          Removes all headers named name, then adds a new header with the + name and value.
+ MockResponsesetResponseCode(int code) + +
+           
+ MockResponsesetSocketPolicy(SocketPolicy socketPolicy) + +
+           
+ MockResponsesetStatus(String status) + +
+           
+ StringtoString() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+MockResponse

+
+public MockResponse()
+
+
Creates a new mock response with an empty body. +

+

+ + + + + + + + +
+Method Detail
+ +

+clone

+
+public MockResponse clone()
+
+
+
Overrides:
clone in class Object
+
+
+
+
+
+
+ +

+getStatus

+
+public String getStatus()
+
+
Returns the HTTP response line, such as "HTTP/1.1 200 OK". +

+

+
+
+
+
+
+
+
+ +

+setResponseCode

+
+public MockResponse setResponseCode(int code)
+
+
+
+
+
+
+
+
+
+ +

+setStatus

+
+public MockResponse setStatus(String status)
+
+
+
+
+
+
+
+
+
+ +

+getHeaders

+
+public List<String> getHeaders()
+
+
Returns the HTTP headers, such as "Content-Length: 0". +

+

+
+
+
+
+
+
+
+ +

+clearHeaders

+
+public MockResponse clearHeaders()
+
+
Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default. +

+

+
+
+
+
+
+
+
+ +

+addHeader

+
+public MockResponse addHeader(String header)
+
+
Adds header as an HTTP header. For well-formed HTTP header should contain a name followed by a colon and a value. +

+

+
+
+
+
+
+
+
+ +

+addHeader

+
+public MockResponse addHeader(String name,
+                              Object value)
+
+
Adds a new header with the name and value. This may be used to add + multiple headers with the same name. +

+

+
+
+
+
+
+
+
+ +

+setHeader

+
+public MockResponse setHeader(String name,
+                              Object value)
+
+
Removes all headers named name, then adds a new header with the + name and value. +

+

+
+
+
+
+
+
+
+ +

+removeHeader

+
+public MockResponse removeHeader(String name)
+
+
Removes all headers named name. +

+

+
+
+
+
+
+
+
+ +

+getBody

+
+public byte[] getBody()
+
+
Returns the raw HTTP payload. +

+

+
+
+
+
+
+
+
+ +

+setBody

+
+public MockResponse setBody(byte[] body)
+
+
+
+
+
+
+
+
+
+ +

+setBody

+
+public MockResponse setBody(String body)
+
+
Sets the response body to the UTF-8 encoded bytes of body. +

+

+
+
+
+
+
+
+
+ +

+setChunkedBody

+
+public MockResponse setChunkedBody(byte[] body,
+                                   int maxChunkSize)
+
+
Sets the response body to body, chunked every maxChunkSize bytes. +

+

+
+
+
+
+
+
+
+ +

+setChunkedBody

+
+public MockResponse setChunkedBody(String body,
+                                   int maxChunkSize)
+
+
Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes. +

+

+
+
+
+
+
+
+
+ +

+getSocketPolicy

+
+public SocketPolicy getSocketPolicy()
+
+
+
+
+
+
+
+
+
+ +

+setSocketPolicy

+
+public MockResponse setSocketPolicy(SocketPolicy socketPolicy)
+
+
+
+
+
+
+
+
+
+ +

+getBytesPerSecond

+
+public int getBytesPerSecond()
+
+
+
+
+
+
+
+
+
+ +

+setBytesPerSecond

+
+public MockResponse setBytesPerSecond(int bytesPerSecond)
+
+
Set simulated network speed, in bytes per second. This applies to the + response body only; response headers are not throttled. +

+

+
+
+
+
+
+
+
+ +

+toString

+
+public String toString()
+
+
+
Overrides:
toString in class Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/MockWebServer.html b/javadoc/com/google/mockwebserver/MockWebServer.html new file mode 100644 index 000000000..d3576780f --- /dev/null +++ b/javadoc/com/google/mockwebserver/MockWebServer.html @@ -0,0 +1,554 @@ + + + + + + + +MockWebServer (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class MockWebServer

+
+java.lang.Object
+  extended by com.google.mockwebserver.MockWebServer
+
+
+
+
public final class MockWebServer
extends Object
+ + +

+A scriptable web server. Callers supply canned responses and the server + replays them upon request in sequence. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
MockWebServer() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidenqueue(MockResponse response) + +
+           
+ StringgetCookieDomain() + +
+          Returns a cookie domain for this server.
+ StringgetHostName() + +
+           
+ intgetPort() + +
+           
+ intgetRequestCount() + +
+          Returns the number of HTTP requests received thus far by this server.
+ URLgetUrl(String path) + +
+          Returns a URL for connecting to this server.
+ voidplay() + +
+          Equivalent to play(0).
+ voidplay(int port) + +
+          Starts the server, serves all enqueued requests, and shuts the server + down.
+ voidsetBodyLimit(int maxBodyLength) + +
+          Sets the number of bytes of the POST body to keep in memory to the given + limit.
+ voidsetSingleResponse(boolean singleResponse) + +
+          By default, this class processes requests coming in by adding them to a + queue and serves responses by removing them from another queue.
+ voidshutdown() + +
+           
+ RecordedRequesttakeRequest() + +
+          Awaits the next HTTP request, removes it, and returns it.
+ ProxytoProxyAddress() + +
+           
+ voiduseHttps(SSLSocketFactory sslSocketFactory, + boolean tunnelProxy) + +
+          Serve requests with HTTPS rather than otherwise.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+MockWebServer

+
+public MockWebServer()
+
+
+ + + + + + + + +
+Method Detail
+ +

+getPort

+
+public int getPort()
+
+
+
+
+
+
+ +

+getHostName

+
+public String getHostName()
+
+
+
+
+
+
+ +

+toProxyAddress

+
+public Proxy toProxyAddress()
+
+
+
+
+
+
+ +

+getUrl

+
+public URL getUrl(String path)
+
+
Returns a URL for connecting to this server. +

+

+
Parameters:
path - the request path, such as "/".
+
+
+
+ +

+getCookieDomain

+
+public String getCookieDomain()
+
+
Returns a cookie domain for this server. This returns the server's + non-loopback host name if it is known. Otherwise this returns ".local" + for this server's loopback name. +

+

+
+
+
+
+ +

+setBodyLimit

+
+public void setBodyLimit(int maxBodyLength)
+
+
Sets the number of bytes of the POST body to keep in memory to the given + limit. +

+

+
+
+
+
+ +

+useHttps

+
+public void useHttps(SSLSocketFactory sslSocketFactory,
+                     boolean tunnelProxy)
+
+
Serve requests with HTTPS rather than otherwise. +

+

+
Parameters:
tunnelProxy - whether to expect the HTTP CONNECT method before + negotiating TLS.
+
+
+
+ +

+takeRequest

+
+public RecordedRequest takeRequest()
+                            throws InterruptedException
+
+
Awaits the next HTTP request, removes it, and returns it. Callers should + use this to verify the request sent was as intended. +

+

+ +
Throws: +
InterruptedException
+
+
+
+ +

+getRequestCount

+
+public int getRequestCount()
+
+
Returns the number of HTTP requests received thus far by this server. + This may exceed the number of HTTP connections when connection reuse is + in practice. +

+

+
+
+
+
+ +

+enqueue

+
+public void enqueue(MockResponse response)
+
+
+
+
+
+
+ +

+setSingleResponse

+
+public void setSingleResponse(boolean singleResponse)
+
+
By default, this class processes requests coming in by adding them to a + queue and serves responses by removing them from another queue. This mode + is appropriate for correctness testing. + +

Serving a single response causes the server to be stateless: requests + are not enqueued, and responses are not dequeued. This mode is appropriate + for benchmarking. +

+

+
+
+
+
+ +

+play

+
+public void play()
+          throws IOException
+
+
Equivalent to play(0). +

+

+ +
Throws: +
IOException
+
+
+
+ +

+play

+
+public void play(int port)
+          throws IOException
+
+
Starts the server, serves all enqueued requests, and shuts the server + down. +

+

+
Parameters:
port - the port to listen to, or 0 for any available port. + Automated tests should always use port 0 to avoid flakiness when a + specific port is unavailable. +
Throws: +
IOException
+
+
+
+ +

+shutdown

+
+public void shutdown()
+              throws IOException
+
+
+ +
Throws: +
IOException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/RecordedRequest.html b/javadoc/com/google/mockwebserver/RecordedRequest.html new file mode 100644 index 000000000..3b4e1f836 --- /dev/null +++ b/javadoc/com/google/mockwebserver/RecordedRequest.html @@ -0,0 +1,481 @@ + + + + + + + +RecordedRequest (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class RecordedRequest

+
+java.lang.Object
+  extended by com.google.mockwebserver.RecordedRequest
+
+
+
+
public final class RecordedRequest
extends Object
+ + +

+An HTTP request that came into the mock web server. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ byte[]getBody() + +
+          Returns the body of this POST request.
+ intgetBodySize() + +
+          Returns the total size of the body of this POST request (before + truncation).
+ List<Integer>getChunkSizes() + +
+          Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked.
+ StringgetHeader(String name) + +
+          Returns the first header named name, or null if no such header + exists.
+ List<String>getHeaders() + +
+          Returns all headers.
+ List<String>getHeaders(String name) + +
+          Returns the headers named name.
+ StringgetMethod() + +
+           
+ StringgetPath() + +
+           
+ StringgetRequestLine() + +
+           
+ intgetSequenceNumber() + +
+          Returns the index of this request on its HTTP connection.
+ StringgetSslProtocol() + +
+          Returns the connection's SSL protocol like TLSv1, SSLv3, + NONE or null if the connection doesn't use SSL.
+ StringgetUtf8Body() + +
+          Returns the body of this POST request decoded as a UTF-8 string.
+ StringtoString() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Method Detail
+ +

+getRequestLine

+
+public String getRequestLine()
+
+
+
+
+
+
+ +

+getMethod

+
+public String getMethod()
+
+
+
+
+
+
+ +

+getPath

+
+public String getPath()
+
+
+
+
+
+
+ +

+getHeaders

+
+public List<String> getHeaders()
+
+
Returns all headers. +

+

+
+
+
+
+ +

+getHeader

+
+public String getHeader(String name)
+
+
Returns the first header named name, or null if no such header + exists. +

+

+
+
+
+
+ +

+getHeaders

+
+public List<String> getHeaders(String name)
+
+
Returns the headers named name. +

+

+
+
+
+
+ +

+getChunkSizes

+
+public List<Integer> getChunkSizes()
+
+
Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked. +

+

+
+
+
+
+ +

+getBodySize

+
+public int getBodySize()
+
+
Returns the total size of the body of this POST request (before + truncation). +

+

+
+
+
+
+ +

+getBody

+
+public byte[] getBody()
+
+
Returns the body of this POST request. This may be truncated. +

+

+
+
+
+
+ +

+getUtf8Body

+
+public String getUtf8Body()
+
+
Returns the body of this POST request decoded as a UTF-8 string. +

+

+
+
+
+
+ +

+getSequenceNumber

+
+public int getSequenceNumber()
+
+
Returns the index of this request on its HTTP connection. Since a single + HTTP connection may serve multiple requests, each request is assigned its + own sequence number. +

+

+
+
+
+
+ +

+getSslProtocol

+
+public String getSslProtocol()
+
+
Returns the connection's SSL protocol like TLSv1, SSLv3, + NONE or null if the connection doesn't use SSL. +

+

+
+
+
+
+ +

+toString

+
+public String toString()
+
+
+
Overrides:
toString in class Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/SocketPolicy.html b/javadoc/com/google/mockwebserver/SocketPolicy.html new file mode 100644 index 000000000..cc0a2cbcf --- /dev/null +++ b/javadoc/com/google/mockwebserver/SocketPolicy.html @@ -0,0 +1,432 @@ + + + + + + + +SocketPolicy (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Enum SocketPolicy

+
+java.lang.Object
+  extended by java.lang.Enum<SocketPolicy>
+      extended by com.google.mockwebserver.SocketPolicy
+
+
+
All Implemented Interfaces:
Serializable, Comparable<SocketPolicy>
+
+
+
+
public enum SocketPolicy
extends Enum<SocketPolicy>
+ + +

+What should be done with the incoming socket. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Enum Constant Summary
DISCONNECT_AT_END + +
+          Close the socket after the response.
DISCONNECT_AT_START + +
+          Request immediate close of connection without even reading the + request.
FAIL_HANDSHAKE + +
+          Don't trust the client during the SSL handshake.
KEEP_OPEN + +
+          Keep the socket open after the response.
SHUTDOWN_INPUT_AT_END + +
+          Shutdown the socket input after sending the response.
SHUTDOWN_OUTPUT_AT_END + +
+          Shutdown the socket output after sending the response.
UPGRADE_TO_SSL_AT_END + +
+          Wrap the socket with SSL at the completion of this request/response + pair.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static SocketPolicyvalueOf(String name) + +
+          Returns the enum constant of this type with the specified name.
+static SocketPolicy[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+KEEP_OPEN

+
+public static final SocketPolicy KEEP_OPEN
+
+
Keep the socket open after the response. This is the default HTTP/1.1 + behavior. +

+

+
+
+
+ +

+DISCONNECT_AT_END

+
+public static final SocketPolicy DISCONNECT_AT_END
+
+
Close the socket after the response. This is the default HTTP/1.0 + behavior. +

+

+
+
+
+ +

+UPGRADE_TO_SSL_AT_END

+
+public static final SocketPolicy UPGRADE_TO_SSL_AT_END
+
+
Wrap the socket with SSL at the completion of this request/response + pair. Used for CONNECT messages to tunnel SSL over an HTTP proxy. +

+

+
+
+
+ +

+DISCONNECT_AT_START

+
+public static final SocketPolicy DISCONNECT_AT_START
+
+
Request immediate close of connection without even reading the + request. + +

Use to simulate the real life case of losing connection + because of bugger SSL server close connection when it seems + something like a compression method or TLS extension it doesn't + understand, instead of simply ignoring it like it should. +

+

+
+
+
+ +

+FAIL_HANDSHAKE

+
+public static final SocketPolicy FAIL_HANDSHAKE
+
+
Don't trust the client during the SSL handshake. +

+

+
+
+
+ +

+SHUTDOWN_INPUT_AT_END

+
+public static final SocketPolicy SHUTDOWN_INPUT_AT_END
+
+
Shutdown the socket input after sending the response. For testing bad + behavior. +

+

+
+
+
+ +

+SHUTDOWN_OUTPUT_AT_END

+
+public static final SocketPolicy SHUTDOWN_OUTPUT_AT_END
+
+
Shutdown the socket output after sending the response. For testing bad + behavior. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static SocketPolicy[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (SocketPolicy c : SocketPolicy.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static SocketPolicy valueOf(String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
IllegalArgumentException - if this enum type has no constant +with the specified name +
NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/MockResponse.html b/javadoc/com/google/mockwebserver/class-use/MockResponse.html new file mode 100644 index 000000000..7b359b4ff --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/MockResponse.html @@ -0,0 +1,293 @@ + + + + + + + +Uses of Class com.google.mockwebserver.MockResponse (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.MockResponse

+
+ + + + + +
+Uses of MockResponse in com.google.mockwebserver
+  +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Methods in com.google.mockwebserver that return MockResponse
+ MockResponseMockResponse.addHeader(String header) + +
+          Adds header as an HTTP header.
+ MockResponseMockResponse.addHeader(String name, + Object value) + +
+          Adds a new header with the name and value.
+ MockResponseMockResponse.clearHeaders() + +
+          Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default.
+ MockResponseMockResponse.clone() + +
+           
+ MockResponseMockResponse.removeHeader(String name) + +
+          Removes all headers named name.
+ MockResponseMockResponse.setBody(byte[] body) + +
+           
+ MockResponseMockResponse.setBody(String body) + +
+          Sets the response body to the UTF-8 encoded bytes of body.
+ MockResponseMockResponse.setBytesPerSecond(int bytesPerSecond) + +
+          Set simulated network speed, in bytes per second.
+ MockResponseMockResponse.setChunkedBody(byte[] body, + int maxChunkSize) + +
+          Sets the response body to body, chunked every maxChunkSize bytes.
+ MockResponseMockResponse.setChunkedBody(String body, + int maxChunkSize) + +
+          Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes.
+ MockResponseMockResponse.setHeader(String name, + Object value) + +
+          Removes all headers named name, then adds a new header with the + name and value.
+ MockResponseMockResponse.setResponseCode(int code) + +
+           
+ MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) + +
+           
+ MockResponseMockResponse.setStatus(String status) + +
+           
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver with parameters of type MockResponse
+ voidMockWebServer.enqueue(MockResponse response) + +
+           
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/MockWebServer.html b/javadoc/com/google/mockwebserver/class-use/MockWebServer.html new file mode 100644 index 000000000..4b46536ce --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/MockWebServer.html @@ -0,0 +1,143 @@ + + + + + + + +Uses of Class com.google.mockwebserver.MockWebServer (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.MockWebServer

+
+No usage of com.google.mockwebserver.MockWebServer +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html b/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html new file mode 100644 index 000000000..4730dcc17 --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html @@ -0,0 +1,166 @@ + + + + + + + +Uses of Class com.google.mockwebserver.RecordedRequest (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.RecordedRequest

+
+ + + + + +
+Uses of RecordedRequest in com.google.mockwebserver
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver that return RecordedRequest
+ RecordedRequestMockWebServer.takeRequest() + +
+          Awaits the next HTTP request, removes it, and returns it.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html b/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html new file mode 100644 index 000000000..51ad90626 --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html @@ -0,0 +1,199 @@ + + + + + + + +Uses of Class com.google.mockwebserver.SocketPolicy (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.SocketPolicy

+
+ + + + + +
+Uses of SocketPolicy in com.google.mockwebserver
+  +

+ + + + + + + + + + + + + + + + + +
Methods in com.google.mockwebserver that return SocketPolicy
+ SocketPolicyMockResponse.getSocketPolicy() + +
+           
+static SocketPolicySocketPolicy.valueOf(String name) + +
+          Returns the enum constant of this type with the specified name.
+static SocketPolicy[]SocketPolicy.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver with parameters of type SocketPolicy
+ MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) + +
+           
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/package-frame.html b/javadoc/com/google/mockwebserver/package-frame.html new file mode 100644 index 000000000..6bc45144d --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-frame.html @@ -0,0 +1,48 @@ + + + + + + + +com.google.mockwebserver (mockwebserver 20120731 API) + + + + + + + + + + + +com.google.mockwebserver + + + + +
+Classes  + +
+MockResponse +
+MockWebServer +
+RecordedRequest
+ + + + + + +
+Enums  + +
+SocketPolicy
+ + + + diff --git a/javadoc/com/google/mockwebserver/package-summary.html b/javadoc/com/google/mockwebserver/package-summary.html new file mode 100644 index 000000000..bce1aba8b --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-summary.html @@ -0,0 +1,178 @@ + + + + + + + +com.google.mockwebserver (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package com.google.mockwebserver +

+ + + + + + + + + + + + + + + + + +
+Class Summary
MockResponseA scripted response to be replayed by the mock web server.
MockWebServerA scriptable web server.
RecordedRequestAn HTTP request that came into the mock web server.
+  + +

+ + + + + + + + + +
+Enum Summary
SocketPolicyWhat should be done with the incoming socket.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/package-tree.html b/javadoc/com/google/mockwebserver/package-tree.html new file mode 100644 index 000000000..62128fd4b --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-tree.html @@ -0,0 +1,160 @@ + + + + + + + +com.google.mockwebserver Class Hierarchy (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package com.google.mockwebserver +

+
+

+Class Hierarchy +

+ +

+Enum Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/package-use.html b/javadoc/com/google/mockwebserver/package-use.html new file mode 100644 index 000000000..2850f8b7d --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-use.html @@ -0,0 +1,168 @@ + + + + + + + +Uses of Package com.google.mockwebserver (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Package
com.google.mockwebserver

+
+ + + + + + + + + + + + + + +
+Classes in com.google.mockwebserver used by com.google.mockwebserver
MockResponse + +
+          A scripted response to be replayed by the mock web server.
RecordedRequest + +
+          An HTTP request that came into the mock web server.
SocketPolicy + +
+          What should be done with the incoming socket.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/constant-values.html b/javadoc/constant-values.html new file mode 100644 index 000000000..9774318c2 --- /dev/null +++ b/javadoc/constant-values.html @@ -0,0 +1,145 @@ + + + + + + + +Constant Field Values (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Constant Field Values

+
+
+Contents
    +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/deprecated-list.html b/javadoc/deprecated-list.html new file mode 100644 index 000000000..cbd6b6aa3 --- /dev/null +++ b/javadoc/deprecated-list.html @@ -0,0 +1,145 @@ + + + + + + + +Deprecated List (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Deprecated API

+
+
+Contents
    +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/help-doc.html b/javadoc/help-doc.html new file mode 100644 index 000000000..df4deeaa9 --- /dev/null +++ b/javadoc/help-doc.html @@ -0,0 +1,216 @@ + + + + + + + +API Help (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+How This API Document Is Organized

+
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

+Package

+
+ +

+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    +
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
+
+

+Class/Interface

+
+ +

+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description +

    +

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary +

    +

  • Field Detail
  • Constructor Detail
  • Method Detail
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+ +

+Annotation Type

+
+ +

+Each annotation type has its own separate page with the following sections:

    +
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
+
+ +

+Enum

+
+ +

+Each enum has its own separate page with the following sections:

    +
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
+
+

+Use

+
+Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.
+

+Tree (Class Hierarchy)

+
+There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    +
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
+
+

+Deprecated API

+
+The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
+

+Index

+
+The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
+

+Prev/Next

+These links take you to the next or previous class, interface, package, or related page.

+Frames/No Frames

+These links show and hide the HTML frames. All pages are available with or without frames. +

+

+Serialized Form

+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. +

+

+Constant Field Values

+The Constant Field Values page lists the static final fields and their values. +

+ + +This help file applies to API documentation generated using the standard doclet. + +
+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/index-all.html b/javadoc/index-all.html new file mode 100644 index 000000000..74952c0e6 --- /dev/null +++ b/javadoc/index-all.html @@ -0,0 +1,355 @@ + + + + + + + +Index (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C E G M P R S T U V
+

+A

+
+
addHeader(String) - +Method in class com.google.mockwebserver.MockResponse +
Adds header as an HTTP header. +
addHeader(String, Object) - +Method in class com.google.mockwebserver.MockResponse +
Adds a new header with the name and value. +
+
+

+C

+
+
clearHeaders() - +Method in class com.google.mockwebserver.MockResponse +
Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default. +
clone() - +Method in class com.google.mockwebserver.MockResponse +
  +
com.google.mockwebserver - package com.google.mockwebserver
 
+
+

+E

+
+
enqueue(MockResponse) - +Method in class com.google.mockwebserver.MockWebServer +
  +
+
+

+G

+
+
getBody() - +Method in class com.google.mockwebserver.MockResponse +
Returns the raw HTTP payload. +
getBody() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the body of this POST request. +
getBodySize() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the total size of the body of this POST request (before + truncation). +
getBytesPerSecond() - +Method in class com.google.mockwebserver.MockResponse +
  +
getChunkSizes() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked. +
getCookieDomain() - +Method in class com.google.mockwebserver.MockWebServer +
Returns a cookie domain for this server. +
getHeader(String) - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the first header named name, or null if no such header + exists. +
getHeaders() - +Method in class com.google.mockwebserver.MockResponse +
Returns the HTTP headers, such as "Content-Length: 0". +
getHeaders() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns all headers. +
getHeaders(String) - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the headers named name. +
getHostName() - +Method in class com.google.mockwebserver.MockWebServer +
  +
getMethod() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getPath() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getPort() - +Method in class com.google.mockwebserver.MockWebServer +
  +
getRequestCount() - +Method in class com.google.mockwebserver.MockWebServer +
Returns the number of HTTP requests received thus far by this server. +
getRequestLine() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getSequenceNumber() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the index of this request on its HTTP connection. +
getSocketPolicy() - +Method in class com.google.mockwebserver.MockResponse +
  +
getSslProtocol() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the connection's SSL protocol like TLSv1, SSLv3, + NONE or null if the connection doesn't use SSL. +
getStatus() - +Method in class com.google.mockwebserver.MockResponse +
Returns the HTTP response line, such as "HTTP/1.1 200 OK". +
getUrl(String) - +Method in class com.google.mockwebserver.MockWebServer +
Returns a URL for connecting to this server. +
getUtf8Body() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the body of this POST request decoded as a UTF-8 string. +
+
+

+M

+
+
MockResponse - Class in com.google.mockwebserver
A scripted response to be replayed by the mock web server.
MockResponse() - +Constructor for class com.google.mockwebserver.MockResponse +
Creates a new mock response with an empty body. +
MockWebServer - Class in com.google.mockwebserver
A scriptable web server.
MockWebServer() - +Constructor for class com.google.mockwebserver.MockWebServer +
  +
+
+

+P

+
+
play() - +Method in class com.google.mockwebserver.MockWebServer +
Equivalent to play(0). +
play(int) - +Method in class com.google.mockwebserver.MockWebServer +
Starts the server, serves all enqueued requests, and shuts the server + down. +
+
+

+R

+
+
RecordedRequest - Class in com.google.mockwebserver
An HTTP request that came into the mock web server.
removeHeader(String) - +Method in class com.google.mockwebserver.MockResponse +
Removes all headers named name. +
+
+

+S

+
+
setBody(byte[]) - +Method in class com.google.mockwebserver.MockResponse +
  +
setBody(String) - +Method in class com.google.mockwebserver.MockResponse +
Sets the response body to the UTF-8 encoded bytes of body. +
setBodyLimit(int) - +Method in class com.google.mockwebserver.MockWebServer +
Sets the number of bytes of the POST body to keep in memory to the given + limit. +
setBytesPerSecond(int) - +Method in class com.google.mockwebserver.MockResponse +
Set simulated network speed, in bytes per second. +
setChunkedBody(byte[], int) - +Method in class com.google.mockwebserver.MockResponse +
Sets the response body to body, chunked every maxChunkSize bytes. +
setChunkedBody(String, int) - +Method in class com.google.mockwebserver.MockResponse +
Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes. +
setHeader(String, Object) - +Method in class com.google.mockwebserver.MockResponse +
Removes all headers named name, then adds a new header with the + name and value. +
setResponseCode(int) - +Method in class com.google.mockwebserver.MockResponse +
  +
setSingleResponse(boolean) - +Method in class com.google.mockwebserver.MockWebServer +
By default, this class processes requests coming in by adding them to a + queue and serves responses by removing them from another queue. +
setSocketPolicy(SocketPolicy) - +Method in class com.google.mockwebserver.MockResponse +
  +
setStatus(String) - +Method in class com.google.mockwebserver.MockResponse +
  +
shutdown() - +Method in class com.google.mockwebserver.MockWebServer +
  +
SocketPolicy - Enum in com.google.mockwebserver
What should be done with the incoming socket.
+
+

+T

+
+
takeRequest() - +Method in class com.google.mockwebserver.MockWebServer +
Awaits the next HTTP request, removes it, and returns it. +
toProxyAddress() - +Method in class com.google.mockwebserver.MockWebServer +
  +
toString() - +Method in class com.google.mockwebserver.MockResponse +
  +
toString() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
+
+

+U

+
+
useHttps(SSLSocketFactory, boolean) - +Method in class com.google.mockwebserver.MockWebServer +
Serve requests with HTTPS rather than otherwise. +
+
+

+V

+
+
valueOf(String) - +Static method in enum com.google.mockwebserver.SocketPolicy +
Returns the enum constant of this type with the specified name. +
values() - +Static method in enum com.google.mockwebserver.SocketPolicy +
Returns an array containing the constants of this enum type, in +the order they are declared. +
+
+A C E G M P R S T U V + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/index.html b/javadoc/index.html new file mode 100644 index 000000000..0b68a1c9d --- /dev/null +++ b/javadoc/index.html @@ -0,0 +1,37 @@ + + + + + + + +mockwebserver 20120731 API + + + + + + + + +<H2> +Frame Alert</H2> + +<P> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<BR> +Link to<A HREF="com/google/mockwebserver/package-summary.html">Non-frame version.</A> + + + diff --git a/javadoc/overview-tree.html b/javadoc/overview-tree.html new file mode 100644 index 000000000..34d033984 --- /dev/null +++ b/javadoc/overview-tree.html @@ -0,0 +1,162 @@ + + + + + + + +Class Hierarchy (mockwebserver 20120731 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For All Packages

+
+
+
Package Hierarchies:
com.google.mockwebserver
+
+

+Class Hierarchy +

+ +

+Enum Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/package-list b/javadoc/package-list new file mode 100644 index 000000000..89508e5d3 --- /dev/null +++ b/javadoc/package-list @@ -0,0 +1 @@ +com.google.mockwebserver diff --git a/javadoc/resources/inherit.gif b/javadoc/resources/inherit.gif new file mode 100644 index 0000000000000000000000000000000000000000..c814867a13deb0ca7ea2156c6ca1d5a03372af7e GIT binary patch literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X literal 0 HcmV?d00001 diff --git a/javadoc/stylesheet.css b/javadoc/stylesheet.css new file mode 100644 index 000000000..6ea9e5161 --- /dev/null +++ b/javadoc/stylesheet.css @@ -0,0 +1,29 @@ +/* Javadoc style sheet */ + +/* Define colors, fonts and other style attributes here to override the defaults */ + +/* Page background color */ +body { background-color: #FFFFFF; color:#000000 } + +/* Headings */ +h1 { font-size: 145% } + +/* Table colors */ +.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ +.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ +.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ + +/* Font used in left-hand frame lists */ +.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } + +/* Navigation bar fonts and colors */ +.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ +.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ +.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} +.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} + +.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} +.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} + From b5f749f202192129db468713e642bae99e8d5fbc Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Thu, 2 Aug 2012 00:00:02 +0000 Subject: [PATCH 18/43] Support Froyo. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@21 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- .../google/mockwebserver/MockWebServer.java | 22 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 4c7fda362..35c8d1295 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20120731 + 20120801-SNAPSHOT mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index f6d30907d..7732db163 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -35,15 +35,13 @@ import java.net.UnknownHostException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; -import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.Set; +import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; @@ -69,9 +67,9 @@ public final class MockWebServer { private final BlockingQueue requestQueue = new LinkedBlockingQueue(); private final BlockingQueue responseQueue - = new LinkedBlockingDeque(); - private final Set openClientSockets - = Collections.newSetFromMap(new ConcurrentHashMap()); + = new LinkedBlockingQueue(); + /** All map values are Boolean.TRUE. (Collections.newSetFromMap isn't available in Froyo) */ + private final Map openClientSockets = new ConcurrentHashMap(); private boolean singleResponse; private final AtomicInteger requestCount = new AtomicInteger(); private int bodyLimit = Integer.MAX_VALUE; @@ -217,7 +215,7 @@ public final class MockWebServer { } catch (Throwable e) { logger.log(Level.WARNING, "MockWebServer server socket close failed", e); } - for (Iterator s = openClientSockets.iterator(); s.hasNext();) { + for (Iterator s = openClientSockets.keySet().iterator(); s.hasNext();) { try { s.next().close(); s.remove(); @@ -245,7 +243,7 @@ public final class MockWebServer { responseQueue.take(); socket.close(); } else { - openClientSockets.add(socket); + openClientSockets.put(socket, true); serveConnection(socket); } } @@ -286,7 +284,7 @@ public final class MockWebServer { socket = sslSocketFactory.createSocket( raw, raw.getInetAddress().getHostAddress(), raw.getPort(), true); ((SSLSocket) socket).setUseClientMode(false); - openClientSockets.add(socket); + openClientSockets.put(socket, true); openClientSockets.remove(raw); } else { socket = raw; @@ -391,7 +389,7 @@ public final class MockWebServer { } catch (IOException streamIsClosed) { return null; // no request because we closed the stream } - if (request.isEmpty()) { + if (request.length() == 0) { return null; // no request because the stream is exhausted } @@ -399,7 +397,7 @@ public final class MockWebServer { int contentLength = -1; boolean chunked = false; String header; - while (!(header = readAsciiUntilCrlf(in)).isEmpty()) { + while ((header = readAsciiUntilCrlf(in)).length() != 0) { headers.add(header); String lowercaseHeader = header.toLowerCase(); if (contentLength == -1 && lowercaseHeader.startsWith("content-length:")) { @@ -532,7 +530,7 @@ public final class MockWebServer { private void readEmptyLine(InputStream in) throws IOException { String line = readAsciiUntilCrlf(in); - if (!line.isEmpty()) { + if (line.length() != 0) { throw new IllegalStateException("Expected empty but was: " + line); } } From 57edb21a2a7b53ed9d996c9b7148f7d3bc7fc438 Mon Sep 17 00:00:00 2001 From: "edenman@gmail.com" Date: Fri, 17 Aug 2012 21:39:29 +0000 Subject: [PATCH 19/43] Adding support for custom dispatchers. This allows for non-linear response ordering. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@22 cf848351-439f-e86a-257f-67fa721851d5 --- .../com/google/mockwebserver/Dispatcher.java | 34 ++++++ .../google/mockwebserver/MockWebServer.java | 98 +++++------------ .../google/mockwebserver/QueueDispatcher.java | 51 +++++++++ .../mockwebserver/CustomDispatcherTest.java | 101 ++++++++++++++++++ 4 files changed, 211 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/google/mockwebserver/Dispatcher.java create mode 100644 src/main/java/com/google/mockwebserver/QueueDispatcher.java create mode 100644 src/test/java/com/google/mockwebserver/CustomDispatcherTest.java diff --git a/src/main/java/com/google/mockwebserver/Dispatcher.java b/src/main/java/com/google/mockwebserver/Dispatcher.java new file mode 100644 index 000000000..ae52c99ff --- /dev/null +++ b/src/main/java/com/google/mockwebserver/Dispatcher.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2012 Google 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 com.google.mockwebserver; + +/** + * Handler for mock server requests. + */ +public abstract class Dispatcher { + /** + * Returns a response to satisfy {@code request}. This method can block (for instance, to wait on a CountdownLatch). + */ + public abstract MockResponse dispatch(RecordedRequest request) throws InterruptedException; + + /** + * Returns the socket policy of the next request. Default implementation returns {@link SocketPolicy#KEEP_OPEN}. + * Mischievous implementations can return other values to test HTTP edge cases. + */ + public SocketPolicy peekSocketPolicy() { + return SocketPolicy.KEEP_OPEN; + } +} diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 7732db163..fdf6e31a8 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -16,41 +16,19 @@ package com.google.mockwebserver; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.SocketException; -import java.net.URL; -import java.net.UnknownHostException; +import javax.net.ssl.*; +import java.io.*; +import java.net.*; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; import static com.google.mockwebserver.SocketPolicy.DISCONNECT_AT_START; import static com.google.mockwebserver.SocketPolicy.FAIL_HANDSHAKE; @@ -66,17 +44,15 @@ public final class MockWebServer { private static final Logger logger = Logger.getLogger(MockWebServer.class.getName()); private final BlockingQueue requestQueue = new LinkedBlockingQueue(); - private final BlockingQueue responseQueue - = new LinkedBlockingQueue(); /** All map values are Boolean.TRUE. (Collections.newSetFromMap isn't available in Froyo) */ private final Map openClientSockets = new ConcurrentHashMap(); - private boolean singleResponse; private final AtomicInteger requestCount = new AtomicInteger(); private int bodyLimit = Integer.MAX_VALUE; private ServerSocket serverSocket; private SSLSocketFactory sslSocketFactory; private ExecutorService executor; private boolean tunnelProxy; + private Dispatcher dispatcher = new QueueDispatcher(); private int port = -1; @@ -161,20 +137,7 @@ public final class MockWebServer { } public void enqueue(MockResponse response) { - responseQueue.add(response.clone()); - } - - /** - * By default, this class processes requests coming in by adding them to a - * queue and serves responses by removing them from another queue. This mode - * is appropriate for correctness testing. - * - *

Serving a single response causes the server to be stateless: requests - * are not enqueued, and responses are not dequeued. This mode is appropriate - * for benchmarking. - */ - public void setSingleResponse(boolean singleResponse) { - this.singleResponse = singleResponse; + ((QueueDispatcher)dispatcher).enqueueResponse(response.clone()); } /** @@ -238,9 +201,9 @@ public final class MockWebServer { } catch (SocketException e) { return; } - MockResponse peek = responseQueue.peek(); - if (peek != null && peek.getSocketPolicy() == DISCONNECT_AT_START) { - responseQueue.take(); + final SocketPolicy socketPolicy = dispatcher.peekSocketPolicy(); + if (socketPolicy == DISCONNECT_AT_START) { + dispatchBookkeepingRequest(0, socket); socket.close(); } else { openClientSockets.put(socket, true); @@ -276,8 +239,8 @@ public final class MockWebServer { if (tunnelProxy) { createTunnel(); } - MockResponse response = responseQueue.peek(); - if (response != null && response.getSocketPolicy() == FAIL_HANDSHAKE) { + final SocketPolicy socketPolicy = dispatcher.peekSocketPolicy(); + if (socketPolicy == FAIL_HANDSHAKE) { processHandshakeFailure(raw, sequenceNumber++); return; } @@ -312,11 +275,11 @@ public final class MockWebServer { */ private void createTunnel() throws IOException, InterruptedException { while (true) { - MockResponse connect = responseQueue.peek(); + final SocketPolicy socketPolicy = dispatcher.peekSocketPolicy(); if (!processOneRequest(raw, raw.getInputStream(), raw.getOutputStream())) { throw new IllegalStateException("Tunnel without any CONNECT!"); } - if (connect.getSocketPolicy() == SocketPolicy.UPGRADE_TO_SSL_AT_END) { + if (socketPolicy == SocketPolicy.UPGRADE_TO_SSL_AT_END) { return; } } @@ -332,7 +295,9 @@ public final class MockWebServer { if (request == null) { return false; } - MockResponse response = dispatch(request); + requestCount.incrementAndGet(); + requestQueue.add(request); + MockResponse response = dispatcher.dispatch(request); writeResponse(out, response); if (response.getSocketPolicy() == SocketPolicy.DISCONNECT_AT_END) { in.close(); @@ -350,7 +315,6 @@ public final class MockWebServer { } private void processHandshakeFailure(Socket raw, int sequenceNumber) throws Exception { - responseQueue.take(); X509TrustManager untrusted = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { @@ -374,8 +338,12 @@ public final class MockWebServer { } catch (IOException expected) { } socket.close(); + dispatchBookkeepingRequest(sequenceNumber, socket); + } + + private void dispatchBookkeepingRequest(int sequenceNumber, Socket socket) throws InterruptedException { requestCount.incrementAndGet(); - requestQueue.add(new RecordedRequest(null, null, null, -1, null, sequenceNumber, socket)); + dispatcher.dispatch(new RecordedRequest(null, null, null, -1, null, sequenceNumber, socket)); } /** @@ -447,26 +415,6 @@ public final class MockWebServer { requestBody.numBytesReceived, requestBody.toByteArray(), sequenceNumber, socket); } - /** - * Returns a response to satisfy {@code request}. - */ - private MockResponse dispatch(RecordedRequest request) throws InterruptedException { - // to permit interactive/browser testing, ignore requests for favicons - if (request.getRequestLine().equals("GET /favicon.ico HTTP/1.1")) { - System.out.println("served " + request.getRequestLine()); - return new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_FOUND); - } - - if (singleResponse) { - return responseQueue.peek(); - } else { - requestCount.incrementAndGet(); - requestQueue.add(request); - return responseQueue.take(); - } - } - private void writeResponse(OutputStream out, MockResponse response) throws IOException { out.write((response.getStatus() + "\r\n").getBytes(ASCII)); for (String header : response.getHeaders()) { @@ -535,6 +483,10 @@ public final class MockWebServer { } } + public void setDispatcher(Dispatcher dispatcher) { + this.dispatcher = dispatcher; + } + /** * An output stream that drops data after bodyLimit bytes. */ diff --git a/src/main/java/com/google/mockwebserver/QueueDispatcher.java b/src/main/java/com/google/mockwebserver/QueueDispatcher.java new file mode 100644 index 000000000..6d1e8cfb0 --- /dev/null +++ b/src/main/java/com/google/mockwebserver/QueueDispatcher.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2012 Google 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 com.google.mockwebserver; + +import java.net.HttpURLConnection; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * Default dispatcher that processes a script of responses. Populate the script by calling + * {@link #enqueueResponse(MockResponse)}. + */ +public class QueueDispatcher extends Dispatcher { + private final BlockingQueue responseQueue + = new LinkedBlockingQueue(); + + public MockResponse dispatch(RecordedRequest request) throws InterruptedException { + // to permit interactive/browser testing, ignore requests for favicons + if (request.getRequestLine().equals("GET /favicon.ico HTTP/1.1")) { + System.out.println("served " + request.getRequestLine()); + return new MockResponse() + .setResponseCode(HttpURLConnection.HTTP_NOT_FOUND); + } + + return responseQueue.take(); + } + + @Override + public SocketPolicy peekSocketPolicy() { + final MockResponse peek = responseQueue.peek(); + if (peek == null) return SocketPolicy.KEEP_OPEN; + return peek.getSocketPolicy(); + } + + public void enqueueResponse(MockResponse response) { + responseQueue.add(response); + } +} diff --git a/src/test/java/com/google/mockwebserver/CustomDispatcherTest.java b/src/test/java/com/google/mockwebserver/CustomDispatcherTest.java new file mode 100644 index 000000000..a8f8ac524 --- /dev/null +++ b/src/test/java/com/google/mockwebserver/CustomDispatcherTest.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2012 Google 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 com.google.mockwebserver; + +import junit.framework.TestCase; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; + +public class CustomDispatcherTest extends TestCase { + + private MockWebServer mockWebServer = new MockWebServer(); + + @Override + public void tearDown() throws Exception { + mockWebServer.shutdown(); + } + + public void testSimpleDispatch() throws Exception { + mockWebServer.play(); + final List requestsMade = new ArrayList(); + final Dispatcher dispatcher = new Dispatcher() { + @Override + public MockResponse dispatch(RecordedRequest request) throws InterruptedException { + requestsMade.add(request); + return new MockResponse(); + } + }; + assertEquals(0, requestsMade.size()); + mockWebServer.setDispatcher(dispatcher); + final URL url = mockWebServer.getUrl("/"); + final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.getResponseCode(); // Force the connection to hit the "server". + // Make sure our dispatcher got the request. + assertEquals(1, requestsMade.size()); + } + + public void testOutOfOrderResponses() throws Exception { + AtomicInteger firstResponseCode = new AtomicInteger(); + AtomicInteger secondResponseCode = new AtomicInteger(); + mockWebServer.play(); + final String secondRequest = "/bar"; + final String firstRequest = "/foo"; + final CountDownLatch latch = new CountDownLatch(1); + final Dispatcher dispatcher = new Dispatcher() { + @Override + public MockResponse dispatch(RecordedRequest request) throws InterruptedException { + if (request.getPath().equals(firstRequest)) { + latch.await(); + } + return new MockResponse(); + } + }; + mockWebServer.setDispatcher(dispatcher); + final Thread startsFirst = buildRequestThread(firstRequest, firstResponseCode); + startsFirst.start(); + final Thread endsFirst = buildRequestThread(secondRequest, secondResponseCode); + endsFirst.start(); + endsFirst.join(); + assertEquals(0, firstResponseCode.get()); // First response is still waiting. + assertEquals(200, secondResponseCode.get()); // Second response is done. + latch.countDown(); + startsFirst.join(); + assertEquals(200, firstResponseCode.get()); // And now it's done! + assertEquals(200, secondResponseCode.get()); // (Still done). + } + + private Thread buildRequestThread(final String path, final AtomicInteger responseCode) { + return new Thread(new Runnable() { + @Override + public void run() { + final URL url = mockWebServer.getUrl(path); + final HttpURLConnection conn; + try { + conn = (HttpURLConnection) url.openConnection(); + responseCode.set(conn.getResponseCode()); // Force the connection to hit the "server". + } catch (IOException e) { + } + } + }); + } + +} From a96861224bf566fdc2a31d9f045c8e163a81fcc8 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Mon, 20 Aug 2012 05:03:06 +0000 Subject: [PATCH 20/43] New javadoc git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@23 cf848351-439f-e86a-257f-67fa721851d5 --- javadoc/allclasses-frame.html | 38 - javadoc/allclasses-noframe.html | 38 - .../google/mockwebserver/MockResponse.html | 721 ------------------ .../google/mockwebserver/MockWebServer.html | 554 -------------- .../google/mockwebserver/RecordedRequest.html | 481 ------------ .../google/mockwebserver/SocketPolicy.html | 432 ----------- .../mockwebserver/class-use/MockResponse.html | 293 ------- .../class-use/MockWebServer.html | 143 ---- .../class-use/RecordedRequest.html | 166 ---- .../mockwebserver/class-use/SocketPolicy.html | 199 ----- .../google/mockwebserver/package-frame.html | 48 -- .../google/mockwebserver/package-summary.html | 178 ----- .../google/mockwebserver/package-tree.html | 160 ---- .../com/google/mockwebserver/package-use.html | 168 ---- javadoc/constant-values.html | 145 ---- javadoc/deprecated-list.html | 145 ---- javadoc/help-doc.html | 216 ------ javadoc/index-all.html | 355 --------- javadoc/index.html | 37 - javadoc/overview-tree.html | 162 ---- javadoc/package-list | 1 - javadoc/resources/inherit.gif | Bin 57 -> 0 bytes javadoc/stylesheet.css | 29 - 23 files changed, 4709 deletions(-) delete mode 100644 javadoc/allclasses-frame.html delete mode 100644 javadoc/allclasses-noframe.html delete mode 100644 javadoc/com/google/mockwebserver/MockResponse.html delete mode 100644 javadoc/com/google/mockwebserver/MockWebServer.html delete mode 100644 javadoc/com/google/mockwebserver/RecordedRequest.html delete mode 100644 javadoc/com/google/mockwebserver/SocketPolicy.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/MockResponse.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/MockWebServer.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/RecordedRequest.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/SocketPolicy.html delete mode 100644 javadoc/com/google/mockwebserver/package-frame.html delete mode 100644 javadoc/com/google/mockwebserver/package-summary.html delete mode 100644 javadoc/com/google/mockwebserver/package-tree.html delete mode 100644 javadoc/com/google/mockwebserver/package-use.html delete mode 100644 javadoc/constant-values.html delete mode 100644 javadoc/deprecated-list.html delete mode 100644 javadoc/help-doc.html delete mode 100644 javadoc/index-all.html delete mode 100644 javadoc/index.html delete mode 100644 javadoc/overview-tree.html delete mode 100644 javadoc/package-list delete mode 100644 javadoc/resources/inherit.gif delete mode 100644 javadoc/stylesheet.css diff --git a/javadoc/allclasses-frame.html b/javadoc/allclasses-frame.html deleted file mode 100644 index 23792305c..000000000 --- a/javadoc/allclasses-frame.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - -All Classes (mockwebserver 20120731 API) - - - - - - - - - - - -All Classes -
- - - - - -
MockResponse -
-MockWebServer -
-RecordedRequest -
-SocketPolicy -
-
- - - diff --git a/javadoc/allclasses-noframe.html b/javadoc/allclasses-noframe.html deleted file mode 100644 index db23eb0c3..000000000 --- a/javadoc/allclasses-noframe.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - -All Classes (mockwebserver 20120731 API) - - - - - - - - - - - -All Classes -
- - - - - -
MockResponse -
-MockWebServer -
-RecordedRequest -
-SocketPolicy -
-
- - - diff --git a/javadoc/com/google/mockwebserver/MockResponse.html b/javadoc/com/google/mockwebserver/MockResponse.html deleted file mode 100644 index 40ed7b9b6..000000000 --- a/javadoc/com/google/mockwebserver/MockResponse.html +++ /dev/null @@ -1,721 +0,0 @@ - - - - - - - -MockResponse (mockwebserver 20120731 API) - - - - - - - - - - - - -


- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class MockResponse

-
-java.lang.Object
-  extended by com.google.mockwebserver.MockResponse
-
-
-
All Implemented Interfaces:
Cloneable
-
-
-
-
public final class MockResponse
extends Object
implements Cloneable
- - -

-A scripted response to be replayed by the mock web server. -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
MockResponse() - -
-          Creates a new mock response with an empty body.
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- MockResponseaddHeader(String header) - -
-          Adds header as an HTTP header.
- MockResponseaddHeader(String name, - Object value) - -
-          Adds a new header with the name and value.
- MockResponseclearHeaders() - -
-          Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default.
- MockResponseclone() - -
-           
- byte[]getBody() - -
-          Returns the raw HTTP payload.
- intgetBytesPerSecond() - -
-           
- List<String>getHeaders() - -
-          Returns the HTTP headers, such as "Content-Length: 0".
- SocketPolicygetSocketPolicy() - -
-           
- StringgetStatus() - -
-          Returns the HTTP response line, such as "HTTP/1.1 200 OK".
- MockResponseremoveHeader(String name) - -
-          Removes all headers named name.
- MockResponsesetBody(byte[] body) - -
-           
- MockResponsesetBody(String body) - -
-          Sets the response body to the UTF-8 encoded bytes of body.
- MockResponsesetBytesPerSecond(int bytesPerSecond) - -
-          Set simulated network speed, in bytes per second.
- MockResponsesetChunkedBody(byte[] body, - int maxChunkSize) - -
-          Sets the response body to body, chunked every maxChunkSize bytes.
- MockResponsesetChunkedBody(String body, - int maxChunkSize) - -
-          Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes.
- MockResponsesetHeader(String name, - Object value) - -
-          Removes all headers named name, then adds a new header with the - name and value.
- MockResponsesetResponseCode(int code) - -
-           
- MockResponsesetSocketPolicy(SocketPolicy socketPolicy) - -
-           
- MockResponsesetStatus(String status) - -
-           
- StringtoString() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-MockResponse

-
-public MockResponse()
-
-
Creates a new mock response with an empty body. -

-

- - - - - - - - -
-Method Detail
- -

-clone

-
-public MockResponse clone()
-
-
-
Overrides:
clone in class Object
-
-
-
-
-
-
- -

-getStatus

-
-public String getStatus()
-
-
Returns the HTTP response line, such as "HTTP/1.1 200 OK". -

-

-
-
-
-
-
-
-
- -

-setResponseCode

-
-public MockResponse setResponseCode(int code)
-
-
-
-
-
-
-
-
-
- -

-setStatus

-
-public MockResponse setStatus(String status)
-
-
-
-
-
-
-
-
-
- -

-getHeaders

-
-public List<String> getHeaders()
-
-
Returns the HTTP headers, such as "Content-Length: 0". -

-

-
-
-
-
-
-
-
- -

-clearHeaders

-
-public MockResponse clearHeaders()
-
-
Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default. -

-

-
-
-
-
-
-
-
- -

-addHeader

-
-public MockResponse addHeader(String header)
-
-
Adds header as an HTTP header. For well-formed HTTP header should contain a name followed by a colon and a value. -

-

-
-
-
-
-
-
-
- -

-addHeader

-
-public MockResponse addHeader(String name,
-                              Object value)
-
-
Adds a new header with the name and value. This may be used to add - multiple headers with the same name. -

-

-
-
-
-
-
-
-
- -

-setHeader

-
-public MockResponse setHeader(String name,
-                              Object value)
-
-
Removes all headers named name, then adds a new header with the - name and value. -

-

-
-
-
-
-
-
-
- -

-removeHeader

-
-public MockResponse removeHeader(String name)
-
-
Removes all headers named name. -

-

-
-
-
-
-
-
-
- -

-getBody

-
-public byte[] getBody()
-
-
Returns the raw HTTP payload. -

-

-
-
-
-
-
-
-
- -

-setBody

-
-public MockResponse setBody(byte[] body)
-
-
-
-
-
-
-
-
-
- -

-setBody

-
-public MockResponse setBody(String body)
-
-
Sets the response body to the UTF-8 encoded bytes of body. -

-

-
-
-
-
-
-
-
- -

-setChunkedBody

-
-public MockResponse setChunkedBody(byte[] body,
-                                   int maxChunkSize)
-
-
Sets the response body to body, chunked every maxChunkSize bytes. -

-

-
-
-
-
-
-
-
- -

-setChunkedBody

-
-public MockResponse setChunkedBody(String body,
-                                   int maxChunkSize)
-
-
Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes. -

-

-
-
-
-
-
-
-
- -

-getSocketPolicy

-
-public SocketPolicy getSocketPolicy()
-
-
-
-
-
-
-
-
-
- -

-setSocketPolicy

-
-public MockResponse setSocketPolicy(SocketPolicy socketPolicy)
-
-
-
-
-
-
-
-
-
- -

-getBytesPerSecond

-
-public int getBytesPerSecond()
-
-
-
-
-
-
-
-
-
- -

-setBytesPerSecond

-
-public MockResponse setBytesPerSecond(int bytesPerSecond)
-
-
Set simulated network speed, in bytes per second. This applies to the - response body only; response headers are not throttled. -

-

-
-
-
-
-
-
-
- -

-toString

-
-public String toString()
-
-
-
Overrides:
toString in class Object
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/MockWebServer.html b/javadoc/com/google/mockwebserver/MockWebServer.html deleted file mode 100644 index d3576780f..000000000 --- a/javadoc/com/google/mockwebserver/MockWebServer.html +++ /dev/null @@ -1,554 +0,0 @@ - - - - - - - -MockWebServer (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class MockWebServer

-
-java.lang.Object
-  extended by com.google.mockwebserver.MockWebServer
-
-
-
-
public final class MockWebServer
extends Object
- - -

-A scriptable web server. Callers supply canned responses and the server - replays them upon request in sequence. -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
MockWebServer() - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidenqueue(MockResponse response) - -
-           
- StringgetCookieDomain() - -
-          Returns a cookie domain for this server.
- StringgetHostName() - -
-           
- intgetPort() - -
-           
- intgetRequestCount() - -
-          Returns the number of HTTP requests received thus far by this server.
- URLgetUrl(String path) - -
-          Returns a URL for connecting to this server.
- voidplay() - -
-          Equivalent to play(0).
- voidplay(int port) - -
-          Starts the server, serves all enqueued requests, and shuts the server - down.
- voidsetBodyLimit(int maxBodyLength) - -
-          Sets the number of bytes of the POST body to keep in memory to the given - limit.
- voidsetSingleResponse(boolean singleResponse) - -
-          By default, this class processes requests coming in by adding them to a - queue and serves responses by removing them from another queue.
- voidshutdown() - -
-           
- RecordedRequesttakeRequest() - -
-          Awaits the next HTTP request, removes it, and returns it.
- ProxytoProxyAddress() - -
-           
- voiduseHttps(SSLSocketFactory sslSocketFactory, - boolean tunnelProxy) - -
-          Serve requests with HTTPS rather than otherwise.
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-MockWebServer

-
-public MockWebServer()
-
-
- - - - - - - - -
-Method Detail
- -

-getPort

-
-public int getPort()
-
-
-
-
-
-
- -

-getHostName

-
-public String getHostName()
-
-
-
-
-
-
- -

-toProxyAddress

-
-public Proxy toProxyAddress()
-
-
-
-
-
-
- -

-getUrl

-
-public URL getUrl(String path)
-
-
Returns a URL for connecting to this server. -

-

-
Parameters:
path - the request path, such as "/".
-
-
-
- -

-getCookieDomain

-
-public String getCookieDomain()
-
-
Returns a cookie domain for this server. This returns the server's - non-loopback host name if it is known. Otherwise this returns ".local" - for this server's loopback name. -

-

-
-
-
-
- -

-setBodyLimit

-
-public void setBodyLimit(int maxBodyLength)
-
-
Sets the number of bytes of the POST body to keep in memory to the given - limit. -

-

-
-
-
-
- -

-useHttps

-
-public void useHttps(SSLSocketFactory sslSocketFactory,
-                     boolean tunnelProxy)
-
-
Serve requests with HTTPS rather than otherwise. -

-

-
Parameters:
tunnelProxy - whether to expect the HTTP CONNECT method before - negotiating TLS.
-
-
-
- -

-takeRequest

-
-public RecordedRequest takeRequest()
-                            throws InterruptedException
-
-
Awaits the next HTTP request, removes it, and returns it. Callers should - use this to verify the request sent was as intended. -

-

- -
Throws: -
InterruptedException
-
-
-
- -

-getRequestCount

-
-public int getRequestCount()
-
-
Returns the number of HTTP requests received thus far by this server. - This may exceed the number of HTTP connections when connection reuse is - in practice. -

-

-
-
-
-
- -

-enqueue

-
-public void enqueue(MockResponse response)
-
-
-
-
-
-
- -

-setSingleResponse

-
-public void setSingleResponse(boolean singleResponse)
-
-
By default, this class processes requests coming in by adding them to a - queue and serves responses by removing them from another queue. This mode - is appropriate for correctness testing. - -

Serving a single response causes the server to be stateless: requests - are not enqueued, and responses are not dequeued. This mode is appropriate - for benchmarking. -

-

-
-
-
-
- -

-play

-
-public void play()
-          throws IOException
-
-
Equivalent to play(0). -

-

- -
Throws: -
IOException
-
-
-
- -

-play

-
-public void play(int port)
-          throws IOException
-
-
Starts the server, serves all enqueued requests, and shuts the server - down. -

-

-
Parameters:
port - the port to listen to, or 0 for any available port. - Automated tests should always use port 0 to avoid flakiness when a - specific port is unavailable. -
Throws: -
IOException
-
-
-
- -

-shutdown

-
-public void shutdown()
-              throws IOException
-
-
- -
Throws: -
IOException
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/RecordedRequest.html b/javadoc/com/google/mockwebserver/RecordedRequest.html deleted file mode 100644 index 3b4e1f836..000000000 --- a/javadoc/com/google/mockwebserver/RecordedRequest.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - - - -RecordedRequest (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class RecordedRequest

-
-java.lang.Object
-  extended by com.google.mockwebserver.RecordedRequest
-
-
-
-
public final class RecordedRequest
extends Object
- - -

-An HTTP request that came into the mock web server. -

- -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- byte[]getBody() - -
-          Returns the body of this POST request.
- intgetBodySize() - -
-          Returns the total size of the body of this POST request (before - truncation).
- List<Integer>getChunkSizes() - -
-          Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked.
- StringgetHeader(String name) - -
-          Returns the first header named name, or null if no such header - exists.
- List<String>getHeaders() - -
-          Returns all headers.
- List<String>getHeaders(String name) - -
-          Returns the headers named name.
- StringgetMethod() - -
-           
- StringgetPath() - -
-           
- StringgetRequestLine() - -
-           
- intgetSequenceNumber() - -
-          Returns the index of this request on its HTTP connection.
- StringgetSslProtocol() - -
-          Returns the connection's SSL protocol like TLSv1, SSLv3, - NONE or null if the connection doesn't use SSL.
- StringgetUtf8Body() - -
-          Returns the body of this POST request decoded as a UTF-8 string.
- StringtoString() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Method Detail
- -

-getRequestLine

-
-public String getRequestLine()
-
-
-
-
-
-
- -

-getMethod

-
-public String getMethod()
-
-
-
-
-
-
- -

-getPath

-
-public String getPath()
-
-
-
-
-
-
- -

-getHeaders

-
-public List<String> getHeaders()
-
-
Returns all headers. -

-

-
-
-
-
- -

-getHeader

-
-public String getHeader(String name)
-
-
Returns the first header named name, or null if no such header - exists. -

-

-
-
-
-
- -

-getHeaders

-
-public List<String> getHeaders(String name)
-
-
Returns the headers named name. -

-

-
-
-
-
- -

-getChunkSizes

-
-public List<Integer> getChunkSizes()
-
-
Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked. -

-

-
-
-
-
- -

-getBodySize

-
-public int getBodySize()
-
-
Returns the total size of the body of this POST request (before - truncation). -

-

-
-
-
-
- -

-getBody

-
-public byte[] getBody()
-
-
Returns the body of this POST request. This may be truncated. -

-

-
-
-
-
- -

-getUtf8Body

-
-public String getUtf8Body()
-
-
Returns the body of this POST request decoded as a UTF-8 string. -

-

-
-
-
-
- -

-getSequenceNumber

-
-public int getSequenceNumber()
-
-
Returns the index of this request on its HTTP connection. Since a single - HTTP connection may serve multiple requests, each request is assigned its - own sequence number. -

-

-
-
-
-
- -

-getSslProtocol

-
-public String getSslProtocol()
-
-
Returns the connection's SSL protocol like TLSv1, SSLv3, - NONE or null if the connection doesn't use SSL. -

-

-
-
-
-
- -

-toString

-
-public String toString()
-
-
-
Overrides:
toString in class Object
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/SocketPolicy.html b/javadoc/com/google/mockwebserver/SocketPolicy.html deleted file mode 100644 index cc0a2cbcf..000000000 --- a/javadoc/com/google/mockwebserver/SocketPolicy.html +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - -SocketPolicy (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Enum SocketPolicy

-
-java.lang.Object
-  extended by java.lang.Enum<SocketPolicy>
-      extended by com.google.mockwebserver.SocketPolicy
-
-
-
All Implemented Interfaces:
Serializable, Comparable<SocketPolicy>
-
-
-
-
public enum SocketPolicy
extends Enum<SocketPolicy>
- - -

-What should be done with the incoming socket. -

- -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Enum Constant Summary
DISCONNECT_AT_END - -
-          Close the socket after the response.
DISCONNECT_AT_START - -
-          Request immediate close of connection without even reading the - request.
FAIL_HANDSHAKE - -
-          Don't trust the client during the SSL handshake.
KEEP_OPEN - -
-          Keep the socket open after the response.
SHUTDOWN_INPUT_AT_END - -
-          Shutdown the socket input after sending the response.
SHUTDOWN_OUTPUT_AT_END - -
-          Shutdown the socket output after sending the response.
UPGRADE_TO_SSL_AT_END - -
-          Wrap the socket with SSL at the completion of this request/response - pair.
-  - - - - - - - - - - - - - - - -
-Method Summary
-static SocketPolicyvalueOf(String name) - -
-          Returns the enum constant of this type with the specified name.
-static SocketPolicy[]values() - -
-          Returns an array containing the constants of this enum type, in -the order they are declared.
- - - - - - - -
Methods inherited from class java.lang.Enum
clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
- - - - - - - -
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Enum Constant Detail
- -

-KEEP_OPEN

-
-public static final SocketPolicy KEEP_OPEN
-
-
Keep the socket open after the response. This is the default HTTP/1.1 - behavior. -

-

-
-
-
- -

-DISCONNECT_AT_END

-
-public static final SocketPolicy DISCONNECT_AT_END
-
-
Close the socket after the response. This is the default HTTP/1.0 - behavior. -

-

-
-
-
- -

-UPGRADE_TO_SSL_AT_END

-
-public static final SocketPolicy UPGRADE_TO_SSL_AT_END
-
-
Wrap the socket with SSL at the completion of this request/response - pair. Used for CONNECT messages to tunnel SSL over an HTTP proxy. -

-

-
-
-
- -

-DISCONNECT_AT_START

-
-public static final SocketPolicy DISCONNECT_AT_START
-
-
Request immediate close of connection without even reading the - request. - -

Use to simulate the real life case of losing connection - because of bugger SSL server close connection when it seems - something like a compression method or TLS extension it doesn't - understand, instead of simply ignoring it like it should. -

-

-
-
-
- -

-FAIL_HANDSHAKE

-
-public static final SocketPolicy FAIL_HANDSHAKE
-
-
Don't trust the client during the SSL handshake. -

-

-
-
-
- -

-SHUTDOWN_INPUT_AT_END

-
-public static final SocketPolicy SHUTDOWN_INPUT_AT_END
-
-
Shutdown the socket input after sending the response. For testing bad - behavior. -

-

-
-
-
- -

-SHUTDOWN_OUTPUT_AT_END

-
-public static final SocketPolicy SHUTDOWN_OUTPUT_AT_END
-
-
Shutdown the socket output after sending the response. For testing bad - behavior. -

-

-
-
- - - - - - - - -
-Method Detail
- -

-values

-
-public static SocketPolicy[] values()
-
-
Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
-for (SocketPolicy c : SocketPolicy.values())
-    System.out.println(c);
-
-

-

- -
Returns:
an array containing the constants of this enum type, in -the order they are declared
-
-
-
- -

-valueOf

-
-public static SocketPolicy valueOf(String name)
-
-
Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.) -

-

-
Parameters:
name - the name of the enum constant to be returned. -
Returns:
the enum constant with the specified name -
Throws: -
IllegalArgumentException - if this enum type has no constant -with the specified name -
NullPointerException - if the argument is null
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/MockResponse.html b/javadoc/com/google/mockwebserver/class-use/MockResponse.html deleted file mode 100644 index 7b359b4ff..000000000 --- a/javadoc/com/google/mockwebserver/class-use/MockResponse.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.MockResponse (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.MockResponse

-
- - - - - -
-Uses of MockResponse in com.google.mockwebserver
-  -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Methods in com.google.mockwebserver that return MockResponse
- MockResponseMockResponse.addHeader(String header) - -
-          Adds header as an HTTP header.
- MockResponseMockResponse.addHeader(String name, - Object value) - -
-          Adds a new header with the name and value.
- MockResponseMockResponse.clearHeaders() - -
-          Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default.
- MockResponseMockResponse.clone() - -
-           
- MockResponseMockResponse.removeHeader(String name) - -
-          Removes all headers named name.
- MockResponseMockResponse.setBody(byte[] body) - -
-           
- MockResponseMockResponse.setBody(String body) - -
-          Sets the response body to the UTF-8 encoded bytes of body.
- MockResponseMockResponse.setBytesPerSecond(int bytesPerSecond) - -
-          Set simulated network speed, in bytes per second.
- MockResponseMockResponse.setChunkedBody(byte[] body, - int maxChunkSize) - -
-          Sets the response body to body, chunked every maxChunkSize bytes.
- MockResponseMockResponse.setChunkedBody(String body, - int maxChunkSize) - -
-          Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes.
- MockResponseMockResponse.setHeader(String name, - Object value) - -
-          Removes all headers named name, then adds a new header with the - name and value.
- MockResponseMockResponse.setResponseCode(int code) - -
-           
- MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) - -
-           
- MockResponseMockResponse.setStatus(String status) - -
-           
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver with parameters of type MockResponse
- voidMockWebServer.enqueue(MockResponse response) - -
-           
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/MockWebServer.html b/javadoc/com/google/mockwebserver/class-use/MockWebServer.html deleted file mode 100644 index 4b46536ce..000000000 --- a/javadoc/com/google/mockwebserver/class-use/MockWebServer.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.MockWebServer (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.MockWebServer

-
-No usage of com.google.mockwebserver.MockWebServer -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html b/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html deleted file mode 100644 index 4730dcc17..000000000 --- a/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.RecordedRequest (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.RecordedRequest

-
- - - - - -
-Uses of RecordedRequest in com.google.mockwebserver
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver that return RecordedRequest
- RecordedRequestMockWebServer.takeRequest() - -
-          Awaits the next HTTP request, removes it, and returns it.
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html b/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html deleted file mode 100644 index 51ad90626..000000000 --- a/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.SocketPolicy (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.SocketPolicy

-
- - - - - -
-Uses of SocketPolicy in com.google.mockwebserver
-  -

- - - - - - - - - - - - - - - - - -
Methods in com.google.mockwebserver that return SocketPolicy
- SocketPolicyMockResponse.getSocketPolicy() - -
-           
-static SocketPolicySocketPolicy.valueOf(String name) - -
-          Returns the enum constant of this type with the specified name.
-static SocketPolicy[]SocketPolicy.values() - -
-          Returns an array containing the constants of this enum type, in -the order they are declared.
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver with parameters of type SocketPolicy
- MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) - -
-           
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/package-frame.html b/javadoc/com/google/mockwebserver/package-frame.html deleted file mode 100644 index 6bc45144d..000000000 --- a/javadoc/com/google/mockwebserver/package-frame.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - -com.google.mockwebserver (mockwebserver 20120731 API) - - - - - - - - - - - -com.google.mockwebserver - - - - -
-Classes  - -
-MockResponse -
-MockWebServer -
-RecordedRequest
- - - - - - -
-Enums  - -
-SocketPolicy
- - - - diff --git a/javadoc/com/google/mockwebserver/package-summary.html b/javadoc/com/google/mockwebserver/package-summary.html deleted file mode 100644 index bce1aba8b..000000000 --- a/javadoc/com/google/mockwebserver/package-summary.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - -com.google.mockwebserver (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.google.mockwebserver -

- - - - - - - - - - - - - - - - - -
-Class Summary
MockResponseA scripted response to be replayed by the mock web server.
MockWebServerA scriptable web server.
RecordedRequestAn HTTP request that came into the mock web server.
-  - -

- - - - - - - - - -
-Enum Summary
SocketPolicyWhat should be done with the incoming socket.
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/package-tree.html b/javadoc/com/google/mockwebserver/package-tree.html deleted file mode 100644 index 62128fd4b..000000000 --- a/javadoc/com/google/mockwebserver/package-tree.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - -com.google.mockwebserver Class Hierarchy (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.google.mockwebserver -

-
-

-Class Hierarchy -

- -

-Enum Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/package-use.html b/javadoc/com/google/mockwebserver/package-use.html deleted file mode 100644 index 2850f8b7d..000000000 --- a/javadoc/com/google/mockwebserver/package-use.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - -Uses of Package com.google.mockwebserver (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Package
com.google.mockwebserver

-
- - - - - - - - - - - - - - -
-Classes in com.google.mockwebserver used by com.google.mockwebserver
MockResponse - -
-          A scripted response to be replayed by the mock web server.
RecordedRequest - -
-          An HTTP request that came into the mock web server.
SocketPolicy - -
-          What should be done with the incoming socket.
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/constant-values.html b/javadoc/constant-values.html deleted file mode 100644 index 9774318c2..000000000 --- a/javadoc/constant-values.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - -Constant Field Values (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Constant Field Values

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/deprecated-list.html b/javadoc/deprecated-list.html deleted file mode 100644 index cbd6b6aa3..000000000 --- a/javadoc/deprecated-list.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - -Deprecated List (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Deprecated API

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/help-doc.html b/javadoc/help-doc.html deleted file mode 100644 index df4deeaa9..000000000 --- a/javadoc/help-doc.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - -API Help (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-How This API Document Is Organized

-
-This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

-Package

-
- -

-Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    -
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
-
-

-Class/Interface

-
- -

-Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    -
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description -

    -

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary -

    -

  • Field Detail
  • Constructor Detail
  • Method Detail
-Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
- -

-Annotation Type

-
- -

-Each annotation type has its own separate page with the following sections:

    -
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
-
- -

-Enum

-
- -

-Each enum has its own separate page with the following sections:

    -
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
-
-

-Use

-
-Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.
-

-Tree (Class Hierarchy)

-
-There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    -
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
-
-

-Deprecated API

-
-The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
-

-Index

-
-The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
-

-Prev/Next

-These links take you to the next or previous class, interface, package, or related page.

-Frames/No Frames

-These links show and hide the HTML frames. All pages are available with or without frames. -

-

-Serialized Form

-Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. -

-

-Constant Field Values

-The Constant Field Values page lists the static final fields and their values. -

- - -This help file applies to API documentation generated using the standard doclet. - -
-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/index-all.html b/javadoc/index-all.html deleted file mode 100644 index 74952c0e6..000000000 --- a/javadoc/index-all.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - - -Index (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -A C E G M P R S T U V
-

-A

-
-
addHeader(String) - -Method in class com.google.mockwebserver.MockResponse -
Adds header as an HTTP header. -
addHeader(String, Object) - -Method in class com.google.mockwebserver.MockResponse -
Adds a new header with the name and value. -
-
-

-C

-
-
clearHeaders() - -Method in class com.google.mockwebserver.MockResponse -
Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default. -
clone() - -Method in class com.google.mockwebserver.MockResponse -
  -
com.google.mockwebserver - package com.google.mockwebserver
 
-
-

-E

-
-
enqueue(MockResponse) - -Method in class com.google.mockwebserver.MockWebServer -
  -
-
-

-G

-
-
getBody() - -Method in class com.google.mockwebserver.MockResponse -
Returns the raw HTTP payload. -
getBody() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the body of this POST request. -
getBodySize() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the total size of the body of this POST request (before - truncation). -
getBytesPerSecond() - -Method in class com.google.mockwebserver.MockResponse -
  -
getChunkSizes() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked. -
getCookieDomain() - -Method in class com.google.mockwebserver.MockWebServer -
Returns a cookie domain for this server. -
getHeader(String) - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the first header named name, or null if no such header - exists. -
getHeaders() - -Method in class com.google.mockwebserver.MockResponse -
Returns the HTTP headers, such as "Content-Length: 0". -
getHeaders() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns all headers. -
getHeaders(String) - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the headers named name. -
getHostName() - -Method in class com.google.mockwebserver.MockWebServer -
  -
getMethod() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getPath() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getPort() - -Method in class com.google.mockwebserver.MockWebServer -
  -
getRequestCount() - -Method in class com.google.mockwebserver.MockWebServer -
Returns the number of HTTP requests received thus far by this server. -
getRequestLine() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getSequenceNumber() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the index of this request on its HTTP connection. -
getSocketPolicy() - -Method in class com.google.mockwebserver.MockResponse -
  -
getSslProtocol() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the connection's SSL protocol like TLSv1, SSLv3, - NONE or null if the connection doesn't use SSL. -
getStatus() - -Method in class com.google.mockwebserver.MockResponse -
Returns the HTTP response line, such as "HTTP/1.1 200 OK". -
getUrl(String) - -Method in class com.google.mockwebserver.MockWebServer -
Returns a URL for connecting to this server. -
getUtf8Body() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the body of this POST request decoded as a UTF-8 string. -
-
-

-M

-
-
MockResponse - Class in com.google.mockwebserver
A scripted response to be replayed by the mock web server.
MockResponse() - -Constructor for class com.google.mockwebserver.MockResponse -
Creates a new mock response with an empty body. -
MockWebServer - Class in com.google.mockwebserver
A scriptable web server.
MockWebServer() - -Constructor for class com.google.mockwebserver.MockWebServer -
  -
-
-

-P

-
-
play() - -Method in class com.google.mockwebserver.MockWebServer -
Equivalent to play(0). -
play(int) - -Method in class com.google.mockwebserver.MockWebServer -
Starts the server, serves all enqueued requests, and shuts the server - down. -
-
-

-R

-
-
RecordedRequest - Class in com.google.mockwebserver
An HTTP request that came into the mock web server.
removeHeader(String) - -Method in class com.google.mockwebserver.MockResponse -
Removes all headers named name. -
-
-

-S

-
-
setBody(byte[]) - -Method in class com.google.mockwebserver.MockResponse -
  -
setBody(String) - -Method in class com.google.mockwebserver.MockResponse -
Sets the response body to the UTF-8 encoded bytes of body. -
setBodyLimit(int) - -Method in class com.google.mockwebserver.MockWebServer -
Sets the number of bytes of the POST body to keep in memory to the given - limit. -
setBytesPerSecond(int) - -Method in class com.google.mockwebserver.MockResponse -
Set simulated network speed, in bytes per second. -
setChunkedBody(byte[], int) - -Method in class com.google.mockwebserver.MockResponse -
Sets the response body to body, chunked every maxChunkSize bytes. -
setChunkedBody(String, int) - -Method in class com.google.mockwebserver.MockResponse -
Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes. -
setHeader(String, Object) - -Method in class com.google.mockwebserver.MockResponse -
Removes all headers named name, then adds a new header with the - name and value. -
setResponseCode(int) - -Method in class com.google.mockwebserver.MockResponse -
  -
setSingleResponse(boolean) - -Method in class com.google.mockwebserver.MockWebServer -
By default, this class processes requests coming in by adding them to a - queue and serves responses by removing them from another queue. -
setSocketPolicy(SocketPolicy) - -Method in class com.google.mockwebserver.MockResponse -
  -
setStatus(String) - -Method in class com.google.mockwebserver.MockResponse -
  -
shutdown() - -Method in class com.google.mockwebserver.MockWebServer -
  -
SocketPolicy - Enum in com.google.mockwebserver
What should be done with the incoming socket.
-
-

-T

-
-
takeRequest() - -Method in class com.google.mockwebserver.MockWebServer -
Awaits the next HTTP request, removes it, and returns it. -
toProxyAddress() - -Method in class com.google.mockwebserver.MockWebServer -
  -
toString() - -Method in class com.google.mockwebserver.MockResponse -
  -
toString() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
-
-

-U

-
-
useHttps(SSLSocketFactory, boolean) - -Method in class com.google.mockwebserver.MockWebServer -
Serve requests with HTTPS rather than otherwise. -
-
-

-V

-
-
valueOf(String) - -Static method in enum com.google.mockwebserver.SocketPolicy -
Returns the enum constant of this type with the specified name. -
values() - -Static method in enum com.google.mockwebserver.SocketPolicy -
Returns an array containing the constants of this enum type, in -the order they are declared. -
-
-A C E G M P R S T U V - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/index.html b/javadoc/index.html deleted file mode 100644 index 0b68a1c9d..000000000 --- a/javadoc/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - -mockwebserver 20120731 API - - - - - - - - -<H2> -Frame Alert</H2> - -<P> -This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. -<BR> -Link to<A HREF="com/google/mockwebserver/package-summary.html">Non-frame version.</A> - - - diff --git a/javadoc/overview-tree.html b/javadoc/overview-tree.html deleted file mode 100644 index 34d033984..000000000 --- a/javadoc/overview-tree.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - -Class Hierarchy (mockwebserver 20120731 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For All Packages

-
-
-
Package Hierarchies:
com.google.mockwebserver
-
-

-Class Hierarchy -

- -

-Enum Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/package-list b/javadoc/package-list deleted file mode 100644 index 89508e5d3..000000000 --- a/javadoc/package-list +++ /dev/null @@ -1 +0,0 @@ -com.google.mockwebserver diff --git a/javadoc/resources/inherit.gif b/javadoc/resources/inherit.gif deleted file mode 100644 index c814867a13deb0ca7ea2156c6ca1d5a03372af7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X diff --git a/javadoc/stylesheet.css b/javadoc/stylesheet.css deleted file mode 100644 index 6ea9e5161..000000000 --- a/javadoc/stylesheet.css +++ /dev/null @@ -1,29 +0,0 @@ -/* Javadoc style sheet */ - -/* Define colors, fonts and other style attributes here to override the defaults */ - -/* Page background color */ -body { background-color: #FFFFFF; color:#000000 } - -/* Headings */ -h1 { font-size: 145% } - -/* Table colors */ -.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ -.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ -.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ - -/* Font used in left-hand frame lists */ -.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } - -/* Navigation bar fonts and colors */ -.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ -.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ -.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} -.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} - -.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} -.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} - From c71fb83d25b523d4ab2f16cfadba423cb1dbe8dd Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Mon, 20 Aug 2012 05:03:55 +0000 Subject: [PATCH 21/43] New javadoc git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@24 cf848351-439f-e86a-257f-67fa721851d5 --- javadoc/allclasses-frame.html | 42 + javadoc/allclasses-noframe.html | 42 + .../com/google/mockwebserver/Dispatcher.html | 285 +++++++ .../google/mockwebserver/MockResponse.html | 721 ++++++++++++++++++ .../google/mockwebserver/MockWebServer.html | 545 +++++++++++++ .../google/mockwebserver/QueueDispatcher.html | 311 ++++++++ .../google/mockwebserver/RecordedRequest.html | 481 ++++++++++++ .../google/mockwebserver/SocketPolicy.html | 432 +++++++++++ .../mockwebserver/class-use/Dispatcher.html | 182 +++++ .../mockwebserver/class-use/MockResponse.html | 317 ++++++++ .../class-use/MockWebServer.html | 143 ++++ .../class-use/QueueDispatcher.html | 143 ++++ .../class-use/RecordedRequest.html | 190 +++++ .../mockwebserver/class-use/SocketPolicy.html | 215 ++++++ .../google/mockwebserver/package-frame.html | 52 ++ .../google/mockwebserver/package-summary.html | 186 +++++ .../google/mockwebserver/package-tree.html | 162 ++++ .../com/google/mockwebserver/package-use.html | 174 +++++ javadoc/constant-values.html | 145 ++++ javadoc/deprecated-list.html | 145 ++++ javadoc/help-doc.html | 216 ++++++ javadoc/index-all.html | 385 ++++++++++ javadoc/index.html | 37 + javadoc/overview-tree.html | 164 ++++ javadoc/package-list | 1 + javadoc/resources/inherit.gif | Bin 0 -> 57 bytes javadoc/stylesheet.css | 29 + 27 files changed, 5745 insertions(+) create mode 100644 javadoc/allclasses-frame.html create mode 100644 javadoc/allclasses-noframe.html create mode 100644 javadoc/com/google/mockwebserver/Dispatcher.html create mode 100644 javadoc/com/google/mockwebserver/MockResponse.html create mode 100644 javadoc/com/google/mockwebserver/MockWebServer.html create mode 100644 javadoc/com/google/mockwebserver/QueueDispatcher.html create mode 100644 javadoc/com/google/mockwebserver/RecordedRequest.html create mode 100644 javadoc/com/google/mockwebserver/SocketPolicy.html create mode 100644 javadoc/com/google/mockwebserver/class-use/Dispatcher.html create mode 100644 javadoc/com/google/mockwebserver/class-use/MockResponse.html create mode 100644 javadoc/com/google/mockwebserver/class-use/MockWebServer.html create mode 100644 javadoc/com/google/mockwebserver/class-use/QueueDispatcher.html create mode 100644 javadoc/com/google/mockwebserver/class-use/RecordedRequest.html create mode 100644 javadoc/com/google/mockwebserver/class-use/SocketPolicy.html create mode 100644 javadoc/com/google/mockwebserver/package-frame.html create mode 100644 javadoc/com/google/mockwebserver/package-summary.html create mode 100644 javadoc/com/google/mockwebserver/package-tree.html create mode 100644 javadoc/com/google/mockwebserver/package-use.html create mode 100644 javadoc/constant-values.html create mode 100644 javadoc/deprecated-list.html create mode 100644 javadoc/help-doc.html create mode 100644 javadoc/index-all.html create mode 100644 javadoc/index.html create mode 100644 javadoc/overview-tree.html create mode 100644 javadoc/package-list create mode 100644 javadoc/resources/inherit.gif create mode 100644 javadoc/stylesheet.css diff --git a/javadoc/allclasses-frame.html b/javadoc/allclasses-frame.html new file mode 100644 index 000000000..c7d702860 --- /dev/null +++ b/javadoc/allclasses-frame.html @@ -0,0 +1,42 @@ + + + + + + + +All Classes (mockwebserver 20120801 API) + + + + + + + + + + + +All Classes +
+ + + + + +
Dispatcher +
+MockResponse +
+MockWebServer +
+QueueDispatcher +
+RecordedRequest +
+SocketPolicy +
+
+ + + diff --git a/javadoc/allclasses-noframe.html b/javadoc/allclasses-noframe.html new file mode 100644 index 000000000..c00cb04a2 --- /dev/null +++ b/javadoc/allclasses-noframe.html @@ -0,0 +1,42 @@ + + + + + + + +All Classes (mockwebserver 20120801 API) + + + + + + + + + + + +All Classes +
+ + + + + +
Dispatcher +
+MockResponse +
+MockWebServer +
+QueueDispatcher +
+RecordedRequest +
+SocketPolicy +
+
+ + + diff --git a/javadoc/com/google/mockwebserver/Dispatcher.html b/javadoc/com/google/mockwebserver/Dispatcher.html new file mode 100644 index 000000000..23ad09d5c --- /dev/null +++ b/javadoc/com/google/mockwebserver/Dispatcher.html @@ -0,0 +1,285 @@ + + + + + + + +Dispatcher (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class Dispatcher

+
+java.lang.Object
+  extended by com.google.mockwebserver.Dispatcher
+
+
+
Direct Known Subclasses:
QueueDispatcher
+
+
+
+
public abstract class Dispatcher
extends Object
+ + +

+Handler for mock server requests. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
Dispatcher() + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+abstract  MockResponsedispatch(RecordedRequest request) + +
+          Returns a response to satisfy request.
+ SocketPolicypeekSocketPolicy() + +
+          Returns the socket policy of the next request.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Dispatcher

+
+public Dispatcher()
+
+
+ + + + + + + + +
+Method Detail
+ +

+dispatch

+
+public abstract MockResponse dispatch(RecordedRequest request)
+                               throws InterruptedException
+
+
Returns a response to satisfy request. This method can block (for instance, to wait on a CountdownLatch). +

+

+ +
Throws: +
InterruptedException
+
+
+
+ +

+peekSocketPolicy

+
+public SocketPolicy peekSocketPolicy()
+
+
Returns the socket policy of the next request. Default implementation returns SocketPolicy.KEEP_OPEN. + Mischievous implementations can return other values to test HTTP edge cases. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/MockResponse.html b/javadoc/com/google/mockwebserver/MockResponse.html new file mode 100644 index 000000000..a87b32a5a --- /dev/null +++ b/javadoc/com/google/mockwebserver/MockResponse.html @@ -0,0 +1,721 @@ + + + + + + + +MockResponse (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class MockResponse

+
+java.lang.Object
+  extended by com.google.mockwebserver.MockResponse
+
+
+
All Implemented Interfaces:
Cloneable
+
+
+
+
public final class MockResponse
extends Object
implements Cloneable
+ + +

+A scripted response to be replayed by the mock web server. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
MockResponse() + +
+          Creates a new mock response with an empty body.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ MockResponseaddHeader(String header) + +
+          Adds header as an HTTP header.
+ MockResponseaddHeader(String name, + Object value) + +
+          Adds a new header with the name and value.
+ MockResponseclearHeaders() + +
+          Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default.
+ MockResponseclone() + +
+           
+ byte[]getBody() + +
+          Returns the raw HTTP payload.
+ intgetBytesPerSecond() + +
+           
+ List<String>getHeaders() + +
+          Returns the HTTP headers, such as "Content-Length: 0".
+ SocketPolicygetSocketPolicy() + +
+           
+ StringgetStatus() + +
+          Returns the HTTP response line, such as "HTTP/1.1 200 OK".
+ MockResponseremoveHeader(String name) + +
+          Removes all headers named name.
+ MockResponsesetBody(byte[] body) + +
+           
+ MockResponsesetBody(String body) + +
+          Sets the response body to the UTF-8 encoded bytes of body.
+ MockResponsesetBytesPerSecond(int bytesPerSecond) + +
+          Set simulated network speed, in bytes per second.
+ MockResponsesetChunkedBody(byte[] body, + int maxChunkSize) + +
+          Sets the response body to body, chunked every maxChunkSize bytes.
+ MockResponsesetChunkedBody(String body, + int maxChunkSize) + +
+          Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes.
+ MockResponsesetHeader(String name, + Object value) + +
+          Removes all headers named name, then adds a new header with the + name and value.
+ MockResponsesetResponseCode(int code) + +
+           
+ MockResponsesetSocketPolicy(SocketPolicy socketPolicy) + +
+           
+ MockResponsesetStatus(String status) + +
+           
+ StringtoString() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+MockResponse

+
+public MockResponse()
+
+
Creates a new mock response with an empty body. +

+

+ + + + + + + + +
+Method Detail
+ +

+clone

+
+public MockResponse clone()
+
+
+
Overrides:
clone in class Object
+
+
+
+
+
+
+ +

+getStatus

+
+public String getStatus()
+
+
Returns the HTTP response line, such as "HTTP/1.1 200 OK". +

+

+
+
+
+
+
+
+
+ +

+setResponseCode

+
+public MockResponse setResponseCode(int code)
+
+
+
+
+
+
+
+
+
+ +

+setStatus

+
+public MockResponse setStatus(String status)
+
+
+
+
+
+
+
+
+
+ +

+getHeaders

+
+public List<String> getHeaders()
+
+
Returns the HTTP headers, such as "Content-Length: 0". +

+

+
+
+
+
+
+
+
+ +

+clearHeaders

+
+public MockResponse clearHeaders()
+
+
Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default. +

+

+
+
+
+
+
+
+
+ +

+addHeader

+
+public MockResponse addHeader(String header)
+
+
Adds header as an HTTP header. For well-formed HTTP header should contain a name followed by a colon and a value. +

+

+
+
+
+
+
+
+
+ +

+addHeader

+
+public MockResponse addHeader(String name,
+                              Object value)
+
+
Adds a new header with the name and value. This may be used to add + multiple headers with the same name. +

+

+
+
+
+
+
+
+
+ +

+setHeader

+
+public MockResponse setHeader(String name,
+                              Object value)
+
+
Removes all headers named name, then adds a new header with the + name and value. +

+

+
+
+
+
+
+
+
+ +

+removeHeader

+
+public MockResponse removeHeader(String name)
+
+
Removes all headers named name. +

+

+
+
+
+
+
+
+
+ +

+getBody

+
+public byte[] getBody()
+
+
Returns the raw HTTP payload. +

+

+
+
+
+
+
+
+
+ +

+setBody

+
+public MockResponse setBody(byte[] body)
+
+
+
+
+
+
+
+
+
+ +

+setBody

+
+public MockResponse setBody(String body)
+
+
Sets the response body to the UTF-8 encoded bytes of body. +

+

+
+
+
+
+
+
+
+ +

+setChunkedBody

+
+public MockResponse setChunkedBody(byte[] body,
+                                   int maxChunkSize)
+
+
Sets the response body to body, chunked every maxChunkSize bytes. +

+

+
+
+
+
+
+
+
+ +

+setChunkedBody

+
+public MockResponse setChunkedBody(String body,
+                                   int maxChunkSize)
+
+
Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes. +

+

+
+
+
+
+
+
+
+ +

+getSocketPolicy

+
+public SocketPolicy getSocketPolicy()
+
+
+
+
+
+
+
+
+
+ +

+setSocketPolicy

+
+public MockResponse setSocketPolicy(SocketPolicy socketPolicy)
+
+
+
+
+
+
+
+
+
+ +

+getBytesPerSecond

+
+public int getBytesPerSecond()
+
+
+
+
+
+
+
+
+
+ +

+setBytesPerSecond

+
+public MockResponse setBytesPerSecond(int bytesPerSecond)
+
+
Set simulated network speed, in bytes per second. This applies to the + response body only; response headers are not throttled. +

+

+
+
+
+
+
+
+
+ +

+toString

+
+public String toString()
+
+
+
Overrides:
toString in class Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/MockWebServer.html b/javadoc/com/google/mockwebserver/MockWebServer.html new file mode 100644 index 000000000..b01a91f36 --- /dev/null +++ b/javadoc/com/google/mockwebserver/MockWebServer.html @@ -0,0 +1,545 @@ + + + + + + + +MockWebServer (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class MockWebServer

+
+java.lang.Object
+  extended by com.google.mockwebserver.MockWebServer
+
+
+
+
public final class MockWebServer
extends Object
+ + +

+A scriptable web server. Callers supply canned responses and the server + replays them upon request in sequence. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
MockWebServer() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidenqueue(MockResponse response) + +
+           
+ StringgetCookieDomain() + +
+          Returns a cookie domain for this server.
+ StringgetHostName() + +
+           
+ intgetPort() + +
+           
+ intgetRequestCount() + +
+          Returns the number of HTTP requests received thus far by this server.
+ URLgetUrl(String path) + +
+          Returns a URL for connecting to this server.
+ voidplay() + +
+          Equivalent to play(0).
+ voidplay(int port) + +
+          Starts the server, serves all enqueued requests, and shuts the server + down.
+ voidsetBodyLimit(int maxBodyLength) + +
+          Sets the number of bytes of the POST body to keep in memory to the given + limit.
+ voidsetDispatcher(Dispatcher dispatcher) + +
+           
+ voidshutdown() + +
+           
+ RecordedRequesttakeRequest() + +
+          Awaits the next HTTP request, removes it, and returns it.
+ ProxytoProxyAddress() + +
+           
+ voiduseHttps(SSLSocketFactory sslSocketFactory, + boolean tunnelProxy) + +
+          Serve requests with HTTPS rather than otherwise.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+MockWebServer

+
+public MockWebServer()
+
+
+ + + + + + + + +
+Method Detail
+ +

+getPort

+
+public int getPort()
+
+
+
+
+
+
+ +

+getHostName

+
+public String getHostName()
+
+
+
+
+
+
+ +

+toProxyAddress

+
+public Proxy toProxyAddress()
+
+
+
+
+
+
+ +

+getUrl

+
+public URL getUrl(String path)
+
+
Returns a URL for connecting to this server. +

+

+
Parameters:
path - the request path, such as "/".
+
+
+
+ +

+getCookieDomain

+
+public String getCookieDomain()
+
+
Returns a cookie domain for this server. This returns the server's + non-loopback host name if it is known. Otherwise this returns ".local" + for this server's loopback name. +

+

+
+
+
+
+ +

+setBodyLimit

+
+public void setBodyLimit(int maxBodyLength)
+
+
Sets the number of bytes of the POST body to keep in memory to the given + limit. +

+

+
+
+
+
+ +

+useHttps

+
+public void useHttps(SSLSocketFactory sslSocketFactory,
+                     boolean tunnelProxy)
+
+
Serve requests with HTTPS rather than otherwise. +

+

+
Parameters:
tunnelProxy - whether to expect the HTTP CONNECT method before + negotiating TLS.
+
+
+
+ +

+takeRequest

+
+public RecordedRequest takeRequest()
+                            throws InterruptedException
+
+
Awaits the next HTTP request, removes it, and returns it. Callers should + use this to verify the request sent was as intended. +

+

+ +
Throws: +
InterruptedException
+
+
+
+ +

+getRequestCount

+
+public int getRequestCount()
+
+
Returns the number of HTTP requests received thus far by this server. + This may exceed the number of HTTP connections when connection reuse is + in practice. +

+

+
+
+
+
+ +

+enqueue

+
+public void enqueue(MockResponse response)
+
+
+
+
+
+
+ +

+play

+
+public void play()
+          throws IOException
+
+
Equivalent to play(0). +

+

+ +
Throws: +
IOException
+
+
+
+ +

+play

+
+public void play(int port)
+          throws IOException
+
+
Starts the server, serves all enqueued requests, and shuts the server + down. +

+

+
Parameters:
port - the port to listen to, or 0 for any available port. + Automated tests should always use port 0 to avoid flakiness when a + specific port is unavailable. +
Throws: +
IOException
+
+
+
+ +

+shutdown

+
+public void shutdown()
+              throws IOException
+
+
+ +
Throws: +
IOException
+
+
+
+ +

+setDispatcher

+
+public void setDispatcher(Dispatcher dispatcher)
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/QueueDispatcher.html b/javadoc/com/google/mockwebserver/QueueDispatcher.html new file mode 100644 index 000000000..86279e55f --- /dev/null +++ b/javadoc/com/google/mockwebserver/QueueDispatcher.html @@ -0,0 +1,311 @@ + + + + + + + +QueueDispatcher (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class QueueDispatcher

+
+java.lang.Object
+  extended by com.google.mockwebserver.Dispatcher
+      extended by com.google.mockwebserver.QueueDispatcher
+
+
+
+
public class QueueDispatcher
extends Dispatcher
+ + +

+Default dispatcher that processes a script of responses. Populate the script by calling + enqueueResponse(MockResponse). +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
QueueDispatcher() + +
+           
+  + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ MockResponsedispatch(RecordedRequest request) + +
+          Returns a response to satisfy request.
+ voidenqueueResponse(MockResponse response) + +
+           
+ SocketPolicypeekSocketPolicy() + +
+          Returns the socket policy of the next request.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+QueueDispatcher

+
+public QueueDispatcher()
+
+
+ + + + + + + + +
+Method Detail
+ +

+dispatch

+
+public MockResponse dispatch(RecordedRequest request)
+                      throws InterruptedException
+
+
Description copied from class: Dispatcher
+
Returns a response to satisfy request. This method can block (for instance, to wait on a CountdownLatch). +

+

+
Specified by:
dispatch in class Dispatcher
+
+
+ +
Throws: +
InterruptedException
+
+
+
+ +

+peekSocketPolicy

+
+public SocketPolicy peekSocketPolicy()
+
+
Description copied from class: Dispatcher
+
Returns the socket policy of the next request. Default implementation returns SocketPolicy.KEEP_OPEN. + Mischievous implementations can return other values to test HTTP edge cases. +

+

+
Overrides:
peekSocketPolicy in class Dispatcher
+
+
+
+
+
+
+ +

+enqueueResponse

+
+public void enqueueResponse(MockResponse response)
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/RecordedRequest.html b/javadoc/com/google/mockwebserver/RecordedRequest.html new file mode 100644 index 000000000..e0e905ab1 --- /dev/null +++ b/javadoc/com/google/mockwebserver/RecordedRequest.html @@ -0,0 +1,481 @@ + + + + + + + +RecordedRequest (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class RecordedRequest

+
+java.lang.Object
+  extended by com.google.mockwebserver.RecordedRequest
+
+
+
+
public final class RecordedRequest
extends Object
+ + +

+An HTTP request that came into the mock web server. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ byte[]getBody() + +
+          Returns the body of this POST request.
+ intgetBodySize() + +
+          Returns the total size of the body of this POST request (before + truncation).
+ List<Integer>getChunkSizes() + +
+          Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked.
+ StringgetHeader(String name) + +
+          Returns the first header named name, or null if no such header + exists.
+ List<String>getHeaders() + +
+          Returns all headers.
+ List<String>getHeaders(String name) + +
+          Returns the headers named name.
+ StringgetMethod() + +
+           
+ StringgetPath() + +
+           
+ StringgetRequestLine() + +
+           
+ intgetSequenceNumber() + +
+          Returns the index of this request on its HTTP connection.
+ StringgetSslProtocol() + +
+          Returns the connection's SSL protocol like TLSv1, SSLv3, + NONE or null if the connection doesn't use SSL.
+ StringgetUtf8Body() + +
+          Returns the body of this POST request decoded as a UTF-8 string.
+ StringtoString() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Method Detail
+ +

+getRequestLine

+
+public String getRequestLine()
+
+
+
+
+
+
+ +

+getMethod

+
+public String getMethod()
+
+
+
+
+
+
+ +

+getPath

+
+public String getPath()
+
+
+
+
+
+
+ +

+getHeaders

+
+public List<String> getHeaders()
+
+
Returns all headers. +

+

+
+
+
+
+ +

+getHeader

+
+public String getHeader(String name)
+
+
Returns the first header named name, or null if no such header + exists. +

+

+
+
+
+
+ +

+getHeaders

+
+public List<String> getHeaders(String name)
+
+
Returns the headers named name. +

+

+
+
+
+
+ +

+getChunkSizes

+
+public List<Integer> getChunkSizes()
+
+
Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked. +

+

+
+
+
+
+ +

+getBodySize

+
+public int getBodySize()
+
+
Returns the total size of the body of this POST request (before + truncation). +

+

+
+
+
+
+ +

+getBody

+
+public byte[] getBody()
+
+
Returns the body of this POST request. This may be truncated. +

+

+
+
+
+
+ +

+getUtf8Body

+
+public String getUtf8Body()
+
+
Returns the body of this POST request decoded as a UTF-8 string. +

+

+
+
+
+
+ +

+getSequenceNumber

+
+public int getSequenceNumber()
+
+
Returns the index of this request on its HTTP connection. Since a single + HTTP connection may serve multiple requests, each request is assigned its + own sequence number. +

+

+
+
+
+
+ +

+getSslProtocol

+
+public String getSslProtocol()
+
+
Returns the connection's SSL protocol like TLSv1, SSLv3, + NONE or null if the connection doesn't use SSL. +

+

+
+
+
+
+ +

+toString

+
+public String toString()
+
+
+
Overrides:
toString in class Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/SocketPolicy.html b/javadoc/com/google/mockwebserver/SocketPolicy.html new file mode 100644 index 000000000..d9c97033a --- /dev/null +++ b/javadoc/com/google/mockwebserver/SocketPolicy.html @@ -0,0 +1,432 @@ + + + + + + + +SocketPolicy (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Enum SocketPolicy

+
+java.lang.Object
+  extended by java.lang.Enum<SocketPolicy>
+      extended by com.google.mockwebserver.SocketPolicy
+
+
+
All Implemented Interfaces:
Serializable, Comparable<SocketPolicy>
+
+
+
+
public enum SocketPolicy
extends Enum<SocketPolicy>
+ + +

+What should be done with the incoming socket. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Enum Constant Summary
DISCONNECT_AT_END + +
+          Close the socket after the response.
DISCONNECT_AT_START + +
+          Request immediate close of connection without even reading the + request.
FAIL_HANDSHAKE + +
+          Don't trust the client during the SSL handshake.
KEEP_OPEN + +
+          Keep the socket open after the response.
SHUTDOWN_INPUT_AT_END + +
+          Shutdown the socket input after sending the response.
SHUTDOWN_OUTPUT_AT_END + +
+          Shutdown the socket output after sending the response.
UPGRADE_TO_SSL_AT_END + +
+          Wrap the socket with SSL at the completion of this request/response + pair.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static SocketPolicyvalueOf(String name) + +
+          Returns the enum constant of this type with the specified name.
+static SocketPolicy[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+KEEP_OPEN

+
+public static final SocketPolicy KEEP_OPEN
+
+
Keep the socket open after the response. This is the default HTTP/1.1 + behavior. +

+

+
+
+
+ +

+DISCONNECT_AT_END

+
+public static final SocketPolicy DISCONNECT_AT_END
+
+
Close the socket after the response. This is the default HTTP/1.0 + behavior. +

+

+
+
+
+ +

+UPGRADE_TO_SSL_AT_END

+
+public static final SocketPolicy UPGRADE_TO_SSL_AT_END
+
+
Wrap the socket with SSL at the completion of this request/response + pair. Used for CONNECT messages to tunnel SSL over an HTTP proxy. +

+

+
+
+
+ +

+DISCONNECT_AT_START

+
+public static final SocketPolicy DISCONNECT_AT_START
+
+
Request immediate close of connection without even reading the + request. + +

Use to simulate the real life case of losing connection + because of bugger SSL server close connection when it seems + something like a compression method or TLS extension it doesn't + understand, instead of simply ignoring it like it should. +

+

+
+
+
+ +

+FAIL_HANDSHAKE

+
+public static final SocketPolicy FAIL_HANDSHAKE
+
+
Don't trust the client during the SSL handshake. +

+

+
+
+
+ +

+SHUTDOWN_INPUT_AT_END

+
+public static final SocketPolicy SHUTDOWN_INPUT_AT_END
+
+
Shutdown the socket input after sending the response. For testing bad + behavior. +

+

+
+
+
+ +

+SHUTDOWN_OUTPUT_AT_END

+
+public static final SocketPolicy SHUTDOWN_OUTPUT_AT_END
+
+
Shutdown the socket output after sending the response. For testing bad + behavior. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static SocketPolicy[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (SocketPolicy c : SocketPolicy.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static SocketPolicy valueOf(String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
IllegalArgumentException - if this enum type has no constant +with the specified name +
NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/Dispatcher.html b/javadoc/com/google/mockwebserver/class-use/Dispatcher.html new file mode 100644 index 000000000..54be7af71 --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/Dispatcher.html @@ -0,0 +1,182 @@ + + + + + + + +Uses of Class com.google.mockwebserver.Dispatcher (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.Dispatcher

+
+ + + + + +
+Uses of Dispatcher in com.google.mockwebserver
+  +

+ + + + + + + + + +
Subclasses of Dispatcher in com.google.mockwebserver
+ classQueueDispatcher + +
+          Default dispatcher that processes a script of responses.
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver with parameters of type Dispatcher
+ voidMockWebServer.setDispatcher(Dispatcher dispatcher) + +
+           
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/MockResponse.html b/javadoc/com/google/mockwebserver/class-use/MockResponse.html new file mode 100644 index 000000000..37d39c7ec --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/MockResponse.html @@ -0,0 +1,317 @@ + + + + + + + +Uses of Class com.google.mockwebserver.MockResponse (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.MockResponse

+
+ + + + + +
+Uses of MockResponse in com.google.mockwebserver
+  +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Methods in com.google.mockwebserver that return MockResponse
+ MockResponseMockResponse.addHeader(String header) + +
+          Adds header as an HTTP header.
+ MockResponseMockResponse.addHeader(String name, + Object value) + +
+          Adds a new header with the name and value.
+ MockResponseMockResponse.clearHeaders() + +
+          Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default.
+ MockResponseMockResponse.clone() + +
+           
+ MockResponseQueueDispatcher.dispatch(RecordedRequest request) + +
+           
+abstract  MockResponseDispatcher.dispatch(RecordedRequest request) + +
+          Returns a response to satisfy request.
+ MockResponseMockResponse.removeHeader(String name) + +
+          Removes all headers named name.
+ MockResponseMockResponse.setBody(byte[] body) + +
+           
+ MockResponseMockResponse.setBody(String body) + +
+          Sets the response body to the UTF-8 encoded bytes of body.
+ MockResponseMockResponse.setBytesPerSecond(int bytesPerSecond) + +
+          Set simulated network speed, in bytes per second.
+ MockResponseMockResponse.setChunkedBody(byte[] body, + int maxChunkSize) + +
+          Sets the response body to body, chunked every maxChunkSize bytes.
+ MockResponseMockResponse.setChunkedBody(String body, + int maxChunkSize) + +
+          Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes.
+ MockResponseMockResponse.setHeader(String name, + Object value) + +
+          Removes all headers named name, then adds a new header with the + name and value.
+ MockResponseMockResponse.setResponseCode(int code) + +
+           
+ MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) + +
+           
+ MockResponseMockResponse.setStatus(String status) + +
+           
+  +

+ + + + + + + + + + + + + +
Methods in com.google.mockwebserver with parameters of type MockResponse
+ voidMockWebServer.enqueue(MockResponse response) + +
+           
+ voidQueueDispatcher.enqueueResponse(MockResponse response) + +
+           
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/MockWebServer.html b/javadoc/com/google/mockwebserver/class-use/MockWebServer.html new file mode 100644 index 000000000..7d15c9afd --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/MockWebServer.html @@ -0,0 +1,143 @@ + + + + + + + +Uses of Class com.google.mockwebserver.MockWebServer (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.MockWebServer

+
+No usage of com.google.mockwebserver.MockWebServer +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/QueueDispatcher.html b/javadoc/com/google/mockwebserver/class-use/QueueDispatcher.html new file mode 100644 index 000000000..76e103730 --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/QueueDispatcher.html @@ -0,0 +1,143 @@ + + + + + + + +Uses of Class com.google.mockwebserver.QueueDispatcher (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.QueueDispatcher

+
+No usage of com.google.mockwebserver.QueueDispatcher +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html b/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html new file mode 100644 index 000000000..9e831a720 --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html @@ -0,0 +1,190 @@ + + + + + + + +Uses of Class com.google.mockwebserver.RecordedRequest (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.RecordedRequest

+
+ + + + + +
+Uses of RecordedRequest in com.google.mockwebserver
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver that return RecordedRequest
+ RecordedRequestMockWebServer.takeRequest() + +
+          Awaits the next HTTP request, removes it, and returns it.
+  +

+ + + + + + + + + + + + + +
Methods in com.google.mockwebserver with parameters of type RecordedRequest
+ MockResponseQueueDispatcher.dispatch(RecordedRequest request) + +
+           
+abstract  MockResponseDispatcher.dispatch(RecordedRequest request) + +
+          Returns a response to satisfy request.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html b/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html new file mode 100644 index 000000000..cabd48688 --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html @@ -0,0 +1,215 @@ + + + + + + + +Uses of Class com.google.mockwebserver.SocketPolicy (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.SocketPolicy

+
+ + + + + +
+Uses of SocketPolicy in com.google.mockwebserver
+  +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Methods in com.google.mockwebserver that return SocketPolicy
+ SocketPolicyMockResponse.getSocketPolicy() + +
+           
+ SocketPolicyQueueDispatcher.peekSocketPolicy() + +
+           
+ SocketPolicyDispatcher.peekSocketPolicy() + +
+          Returns the socket policy of the next request.
+static SocketPolicySocketPolicy.valueOf(String name) + +
+          Returns the enum constant of this type with the specified name.
+static SocketPolicy[]SocketPolicy.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver with parameters of type SocketPolicy
+ MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) + +
+           
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/package-frame.html b/javadoc/com/google/mockwebserver/package-frame.html new file mode 100644 index 000000000..4bb58dd0f --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-frame.html @@ -0,0 +1,52 @@ + + + + + + + +com.google.mockwebserver (mockwebserver 20120801 API) + + + + + + + + + + + +com.google.mockwebserver + + + + +
+Classes  + +
+Dispatcher +
+MockResponse +
+MockWebServer +
+QueueDispatcher +
+RecordedRequest
+ + + + + + +
+Enums  + +
+SocketPolicy
+ + + + diff --git a/javadoc/com/google/mockwebserver/package-summary.html b/javadoc/com/google/mockwebserver/package-summary.html new file mode 100644 index 000000000..884b34692 --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-summary.html @@ -0,0 +1,186 @@ + + + + + + + +com.google.mockwebserver (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package com.google.mockwebserver +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+Class Summary
DispatcherHandler for mock server requests.
MockResponseA scripted response to be replayed by the mock web server.
MockWebServerA scriptable web server.
QueueDispatcherDefault dispatcher that processes a script of responses.
RecordedRequestAn HTTP request that came into the mock web server.
+  + +

+ + + + + + + + + +
+Enum Summary
SocketPolicyWhat should be done with the incoming socket.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/package-tree.html b/javadoc/com/google/mockwebserver/package-tree.html new file mode 100644 index 000000000..071d3498f --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-tree.html @@ -0,0 +1,162 @@ + + + + + + + +com.google.mockwebserver Class Hierarchy (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package com.google.mockwebserver +

+
+

+Class Hierarchy +

+ +

+Enum Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/package-use.html b/javadoc/com/google/mockwebserver/package-use.html new file mode 100644 index 000000000..7b8f7a929 --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-use.html @@ -0,0 +1,174 @@ + + + + + + + +Uses of Package com.google.mockwebserver (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Package
com.google.mockwebserver

+
+ + + + + + + + + + + + + + + + + +
+Classes in com.google.mockwebserver used by com.google.mockwebserver
Dispatcher + +
+          Handler for mock server requests.
MockResponse + +
+          A scripted response to be replayed by the mock web server.
RecordedRequest + +
+          An HTTP request that came into the mock web server.
SocketPolicy + +
+          What should be done with the incoming socket.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/constant-values.html b/javadoc/constant-values.html new file mode 100644 index 000000000..2473fc37f --- /dev/null +++ b/javadoc/constant-values.html @@ -0,0 +1,145 @@ + + + + + + + +Constant Field Values (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Constant Field Values

+
+
+Contents
    +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/deprecated-list.html b/javadoc/deprecated-list.html new file mode 100644 index 000000000..08b040334 --- /dev/null +++ b/javadoc/deprecated-list.html @@ -0,0 +1,145 @@ + + + + + + + +Deprecated List (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Deprecated API

+
+
+Contents
    +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/help-doc.html b/javadoc/help-doc.html new file mode 100644 index 000000000..2ee249fca --- /dev/null +++ b/javadoc/help-doc.html @@ -0,0 +1,216 @@ + + + + + + + +API Help (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+How This API Document Is Organized

+
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

+Package

+
+ +

+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    +
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
+
+

+Class/Interface

+
+ +

+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description +

    +

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary +

    +

  • Field Detail
  • Constructor Detail
  • Method Detail
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+ +

+Annotation Type

+
+ +

+Each annotation type has its own separate page with the following sections:

    +
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
+
+ +

+Enum

+
+ +

+Each enum has its own separate page with the following sections:

    +
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
+
+

+Use

+
+Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.
+

+Tree (Class Hierarchy)

+
+There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    +
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
+
+

+Deprecated API

+
+The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
+

+Index

+
+The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
+

+Prev/Next

+These links take you to the next or previous class, interface, package, or related page.

+Frames/No Frames

+These links show and hide the HTML frames. All pages are available with or without frames. +

+

+Serialized Form

+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. +

+

+Constant Field Values

+The Constant Field Values page lists the static final fields and their values. +

+ + +This help file applies to API documentation generated using the standard doclet. + +
+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/index-all.html b/javadoc/index-all.html new file mode 100644 index 000000000..5a411fdbc --- /dev/null +++ b/javadoc/index-all.html @@ -0,0 +1,385 @@ + + + + + + + +Index (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G M P Q R S T U V
+

+A

+
+
addHeader(String) - +Method in class com.google.mockwebserver.MockResponse +
Adds header as an HTTP header. +
addHeader(String, Object) - +Method in class com.google.mockwebserver.MockResponse +
Adds a new header with the name and value. +
+
+

+C

+
+
clearHeaders() - +Method in class com.google.mockwebserver.MockResponse +
Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default. +
clone() - +Method in class com.google.mockwebserver.MockResponse +
  +
com.google.mockwebserver - package com.google.mockwebserver
 
+
+

+D

+
+
dispatch(RecordedRequest) - +Method in class com.google.mockwebserver.Dispatcher +
Returns a response to satisfy request. +
dispatch(RecordedRequest) - +Method in class com.google.mockwebserver.QueueDispatcher +
  +
Dispatcher - Class in com.google.mockwebserver
Handler for mock server requests.
Dispatcher() - +Constructor for class com.google.mockwebserver.Dispatcher +
  +
+
+

+E

+
+
enqueue(MockResponse) - +Method in class com.google.mockwebserver.MockWebServer +
  +
enqueueResponse(MockResponse) - +Method in class com.google.mockwebserver.QueueDispatcher +
  +
+
+

+G

+
+
getBody() - +Method in class com.google.mockwebserver.MockResponse +
Returns the raw HTTP payload. +
getBody() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the body of this POST request. +
getBodySize() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the total size of the body of this POST request (before + truncation). +
getBytesPerSecond() - +Method in class com.google.mockwebserver.MockResponse +
  +
getChunkSizes() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked. +
getCookieDomain() - +Method in class com.google.mockwebserver.MockWebServer +
Returns a cookie domain for this server. +
getHeader(String) - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the first header named name, or null if no such header + exists. +
getHeaders() - +Method in class com.google.mockwebserver.MockResponse +
Returns the HTTP headers, such as "Content-Length: 0". +
getHeaders() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns all headers. +
getHeaders(String) - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the headers named name. +
getHostName() - +Method in class com.google.mockwebserver.MockWebServer +
  +
getMethod() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getPath() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getPort() - +Method in class com.google.mockwebserver.MockWebServer +
  +
getRequestCount() - +Method in class com.google.mockwebserver.MockWebServer +
Returns the number of HTTP requests received thus far by this server. +
getRequestLine() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getSequenceNumber() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the index of this request on its HTTP connection. +
getSocketPolicy() - +Method in class com.google.mockwebserver.MockResponse +
  +
getSslProtocol() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the connection's SSL protocol like TLSv1, SSLv3, + NONE or null if the connection doesn't use SSL. +
getStatus() - +Method in class com.google.mockwebserver.MockResponse +
Returns the HTTP response line, such as "HTTP/1.1 200 OK". +
getUrl(String) - +Method in class com.google.mockwebserver.MockWebServer +
Returns a URL for connecting to this server. +
getUtf8Body() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the body of this POST request decoded as a UTF-8 string. +
+
+

+M

+
+
MockResponse - Class in com.google.mockwebserver
A scripted response to be replayed by the mock web server.
MockResponse() - +Constructor for class com.google.mockwebserver.MockResponse +
Creates a new mock response with an empty body. +
MockWebServer - Class in com.google.mockwebserver
A scriptable web server.
MockWebServer() - +Constructor for class com.google.mockwebserver.MockWebServer +
  +
+
+

+P

+
+
peekSocketPolicy() - +Method in class com.google.mockwebserver.Dispatcher +
Returns the socket policy of the next request. +
peekSocketPolicy() - +Method in class com.google.mockwebserver.QueueDispatcher +
  +
play() - +Method in class com.google.mockwebserver.MockWebServer +
Equivalent to play(0). +
play(int) - +Method in class com.google.mockwebserver.MockWebServer +
Starts the server, serves all enqueued requests, and shuts the server + down. +
+
+

+Q

+
+
QueueDispatcher - Class in com.google.mockwebserver
Default dispatcher that processes a script of responses.
QueueDispatcher() - +Constructor for class com.google.mockwebserver.QueueDispatcher +
  +
+
+

+R

+
+
RecordedRequest - Class in com.google.mockwebserver
An HTTP request that came into the mock web server.
removeHeader(String) - +Method in class com.google.mockwebserver.MockResponse +
Removes all headers named name. +
+
+

+S

+
+
setBody(byte[]) - +Method in class com.google.mockwebserver.MockResponse +
  +
setBody(String) - +Method in class com.google.mockwebserver.MockResponse +
Sets the response body to the UTF-8 encoded bytes of body. +
setBodyLimit(int) - +Method in class com.google.mockwebserver.MockWebServer +
Sets the number of bytes of the POST body to keep in memory to the given + limit. +
setBytesPerSecond(int) - +Method in class com.google.mockwebserver.MockResponse +
Set simulated network speed, in bytes per second. +
setChunkedBody(byte[], int) - +Method in class com.google.mockwebserver.MockResponse +
Sets the response body to body, chunked every maxChunkSize bytes. +
setChunkedBody(String, int) - +Method in class com.google.mockwebserver.MockResponse +
Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes. +
setDispatcher(Dispatcher) - +Method in class com.google.mockwebserver.MockWebServer +
  +
setHeader(String, Object) - +Method in class com.google.mockwebserver.MockResponse +
Removes all headers named name, then adds a new header with the + name and value. +
setResponseCode(int) - +Method in class com.google.mockwebserver.MockResponse +
  +
setSocketPolicy(SocketPolicy) - +Method in class com.google.mockwebserver.MockResponse +
  +
setStatus(String) - +Method in class com.google.mockwebserver.MockResponse +
  +
shutdown() - +Method in class com.google.mockwebserver.MockWebServer +
  +
SocketPolicy - Enum in com.google.mockwebserver
What should be done with the incoming socket.
+
+

+T

+
+
takeRequest() - +Method in class com.google.mockwebserver.MockWebServer +
Awaits the next HTTP request, removes it, and returns it. +
toProxyAddress() - +Method in class com.google.mockwebserver.MockWebServer +
  +
toString() - +Method in class com.google.mockwebserver.MockResponse +
  +
toString() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
+
+

+U

+
+
useHttps(SSLSocketFactory, boolean) - +Method in class com.google.mockwebserver.MockWebServer +
Serve requests with HTTPS rather than otherwise. +
+
+

+V

+
+
valueOf(String) - +Static method in enum com.google.mockwebserver.SocketPolicy +
Returns the enum constant of this type with the specified name. +
values() - +Static method in enum com.google.mockwebserver.SocketPolicy +
Returns an array containing the constants of this enum type, in +the order they are declared. +
+
+A C D E G M P Q R S T U V + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/index.html b/javadoc/index.html new file mode 100644 index 000000000..19785ccf2 --- /dev/null +++ b/javadoc/index.html @@ -0,0 +1,37 @@ + + + + + + + +mockwebserver 20120801 API + + + + + + + + +<H2> +Frame Alert</H2> + +<P> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<BR> +Link to<A HREF="com/google/mockwebserver/package-summary.html">Non-frame version.</A> + + + diff --git a/javadoc/overview-tree.html b/javadoc/overview-tree.html new file mode 100644 index 000000000..50af843a3 --- /dev/null +++ b/javadoc/overview-tree.html @@ -0,0 +1,164 @@ + + + + + + + +Class Hierarchy (mockwebserver 20120801 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For All Packages

+
+
+
Package Hierarchies:
com.google.mockwebserver
+
+

+Class Hierarchy +

+ +

+Enum Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/package-list b/javadoc/package-list new file mode 100644 index 000000000..89508e5d3 --- /dev/null +++ b/javadoc/package-list @@ -0,0 +1 @@ +com.google.mockwebserver diff --git a/javadoc/resources/inherit.gif b/javadoc/resources/inherit.gif new file mode 100644 index 0000000000000000000000000000000000000000..c814867a13deb0ca7ea2156c6ca1d5a03372af7e GIT binary patch literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X literal 0 HcmV?d00001 diff --git a/javadoc/stylesheet.css b/javadoc/stylesheet.css new file mode 100644 index 000000000..6ea9e5161 --- /dev/null +++ b/javadoc/stylesheet.css @@ -0,0 +1,29 @@ +/* Javadoc style sheet */ + +/* Define colors, fonts and other style attributes here to override the defaults */ + +/* Page background color */ +body { background-color: #FFFFFF; color:#000000 } + +/* Headings */ +h1 { font-size: 145% } + +/* Table colors */ +.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ +.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ +.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ + +/* Font used in left-hand frame lists */ +.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } + +/* Navigation bar fonts and colors */ +.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ +.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ +.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} +.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} + +.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} +.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} + From 889463746b9d426c6f0703c743b07a41fa5367cc Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Mon, 20 Aug 2012 05:15:49 +0000 Subject: [PATCH 22/43] Documentation cleanup. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@25 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- .../com/google/mockwebserver/Dispatcher.java | 8 +-- .../google/mockwebserver/MockWebServer.java | 50 ++++++++++++++++--- .../google/mockwebserver/QueueDispatcher.java | 2 +- 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 35c8d1295..43924017c 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20120801-SNAPSHOT + 20120819 mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/Dispatcher.java b/src/main/java/com/google/mockwebserver/Dispatcher.java index ae52c99ff..045602586 100644 --- a/src/main/java/com/google/mockwebserver/Dispatcher.java +++ b/src/main/java/com/google/mockwebserver/Dispatcher.java @@ -20,13 +20,15 @@ package com.google.mockwebserver; */ public abstract class Dispatcher { /** - * Returns a response to satisfy {@code request}. This method can block (for instance, to wait on a CountdownLatch). + * Returns a response to satisfy {@code request}. This method may block (for + * instance, to wait on a CountdownLatch). */ public abstract MockResponse dispatch(RecordedRequest request) throws InterruptedException; /** - * Returns the socket policy of the next request. Default implementation returns {@link SocketPolicy#KEEP_OPEN}. - * Mischievous implementations can return other values to test HTTP edge cases. + * Returns the socket policy of the next request. Default implementation + * returns {@link SocketPolicy#KEEP_OPEN}. Mischievous implementations can + * return other values to test HTTP edge cases. */ public SocketPolicy peekSocketPolicy() { return SocketPolicy.KEEP_OPEN; diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index fdf6e31a8..e94b37778 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -16,19 +16,40 @@ package com.google.mockwebserver; -import javax.net.ssl.*; -import java.io.*; -import java.net.*; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.Proxy; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketException; +import java.net.URL; +import java.net.UnknownHostException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.concurrent.*; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; import static com.google.mockwebserver.SocketPolicy.DISCONNECT_AT_START; import static com.google.mockwebserver.SocketPolicy.FAIL_HANDSHAKE; @@ -136,8 +157,16 @@ public final class MockWebServer { return requestCount.get(); } + /** + * Scripts {@code response} to be returned to a request made in sequence. + * The first request is served by the first enqueued response; the second + * request by the second enqueued response; and so on. + * + * @throws ClassCastException if the default dispatcher has been replaced + * with {@link #setDispatcher(Dispatcher)}. + */ public void enqueue(MockResponse response) { - ((QueueDispatcher)dispatcher).enqueueResponse(response.clone()); + ((QueueDispatcher) dispatcher).enqueueResponse(response.clone()); } /** @@ -178,7 +207,7 @@ public final class MockWebServer { } catch (Throwable e) { logger.log(Level.WARNING, "MockWebServer server socket close failed", e); } - for (Iterator s = openClientSockets.keySet().iterator(); s.hasNext();) { + for (Iterator s = openClientSockets.keySet().iterator(); s.hasNext(); ) { try { s.next().close(); s.remove(); @@ -483,7 +512,16 @@ public final class MockWebServer { } } + /** + * Sets the dispatcher used to match incoming requests to mock responses. + * The default dispatcher simply serves a fixed sequence of responses from + * a {@link #enqueue(MockResponse) queue}; custom dispatchers can vary the + * response based on timing or the content of the request. + */ public void setDispatcher(Dispatcher dispatcher) { + if (dispatcher == null) { + throw new NullPointerException(); + } this.dispatcher = dispatcher; } diff --git a/src/main/java/com/google/mockwebserver/QueueDispatcher.java b/src/main/java/com/google/mockwebserver/QueueDispatcher.java index 6d1e8cfb0..02f6cd4b0 100644 --- a/src/main/java/com/google/mockwebserver/QueueDispatcher.java +++ b/src/main/java/com/google/mockwebserver/QueueDispatcher.java @@ -23,7 +23,7 @@ import java.util.concurrent.LinkedBlockingQueue; * Default dispatcher that processes a script of responses. Populate the script by calling * {@link #enqueueResponse(MockResponse)}. */ -public class QueueDispatcher extends Dispatcher { +final class QueueDispatcher extends Dispatcher { private final BlockingQueue responseQueue = new LinkedBlockingQueue(); From 1742e1eea04785dcdcba35825d5444d8c548db9b Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Mon, 20 Aug 2012 05:16:06 +0000 Subject: [PATCH 23/43] New javadoc git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@26 cf848351-439f-e86a-257f-67fa721851d5 --- javadoc/allclasses-frame.html | 42 - javadoc/allclasses-noframe.html | 42 - .../com/google/mockwebserver/Dispatcher.html | 285 ------- .../google/mockwebserver/MockResponse.html | 721 ------------------ .../google/mockwebserver/MockWebServer.html | 545 ------------- .../google/mockwebserver/QueueDispatcher.html | 311 -------- .../google/mockwebserver/RecordedRequest.html | 481 ------------ .../google/mockwebserver/SocketPolicy.html | 432 ----------- .../mockwebserver/class-use/Dispatcher.html | 182 ----- .../mockwebserver/class-use/MockResponse.html | 317 -------- .../class-use/MockWebServer.html | 143 ---- .../class-use/QueueDispatcher.html | 143 ---- .../class-use/RecordedRequest.html | 190 ----- .../mockwebserver/class-use/SocketPolicy.html | 215 ------ .../google/mockwebserver/package-frame.html | 52 -- .../google/mockwebserver/package-summary.html | 186 ----- .../google/mockwebserver/package-tree.html | 162 ---- .../com/google/mockwebserver/package-use.html | 174 ----- javadoc/constant-values.html | 145 ---- javadoc/deprecated-list.html | 145 ---- javadoc/help-doc.html | 216 ------ javadoc/index-all.html | 385 ---------- javadoc/index.html | 37 - javadoc/overview-tree.html | 164 ---- javadoc/package-list | 1 - javadoc/resources/inherit.gif | Bin 57 -> 0 bytes javadoc/stylesheet.css | 29 - 27 files changed, 5745 deletions(-) delete mode 100644 javadoc/allclasses-frame.html delete mode 100644 javadoc/allclasses-noframe.html delete mode 100644 javadoc/com/google/mockwebserver/Dispatcher.html delete mode 100644 javadoc/com/google/mockwebserver/MockResponse.html delete mode 100644 javadoc/com/google/mockwebserver/MockWebServer.html delete mode 100644 javadoc/com/google/mockwebserver/QueueDispatcher.html delete mode 100644 javadoc/com/google/mockwebserver/RecordedRequest.html delete mode 100644 javadoc/com/google/mockwebserver/SocketPolicy.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/Dispatcher.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/MockResponse.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/MockWebServer.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/QueueDispatcher.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/RecordedRequest.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/SocketPolicy.html delete mode 100644 javadoc/com/google/mockwebserver/package-frame.html delete mode 100644 javadoc/com/google/mockwebserver/package-summary.html delete mode 100644 javadoc/com/google/mockwebserver/package-tree.html delete mode 100644 javadoc/com/google/mockwebserver/package-use.html delete mode 100644 javadoc/constant-values.html delete mode 100644 javadoc/deprecated-list.html delete mode 100644 javadoc/help-doc.html delete mode 100644 javadoc/index-all.html delete mode 100644 javadoc/index.html delete mode 100644 javadoc/overview-tree.html delete mode 100644 javadoc/package-list delete mode 100644 javadoc/resources/inherit.gif delete mode 100644 javadoc/stylesheet.css diff --git a/javadoc/allclasses-frame.html b/javadoc/allclasses-frame.html deleted file mode 100644 index c7d702860..000000000 --- a/javadoc/allclasses-frame.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - -All Classes (mockwebserver 20120801 API) - - - - - - - - - - - -All Classes -
- - - - - -
Dispatcher -
-MockResponse -
-MockWebServer -
-QueueDispatcher -
-RecordedRequest -
-SocketPolicy -
-
- - - diff --git a/javadoc/allclasses-noframe.html b/javadoc/allclasses-noframe.html deleted file mode 100644 index c00cb04a2..000000000 --- a/javadoc/allclasses-noframe.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - -All Classes (mockwebserver 20120801 API) - - - - - - - - - - - -All Classes -
- - - - - -
Dispatcher -
-MockResponse -
-MockWebServer -
-QueueDispatcher -
-RecordedRequest -
-SocketPolicy -
-
- - - diff --git a/javadoc/com/google/mockwebserver/Dispatcher.html b/javadoc/com/google/mockwebserver/Dispatcher.html deleted file mode 100644 index 23ad09d5c..000000000 --- a/javadoc/com/google/mockwebserver/Dispatcher.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - - - - -Dispatcher (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class Dispatcher

-
-java.lang.Object
-  extended by com.google.mockwebserver.Dispatcher
-
-
-
Direct Known Subclasses:
QueueDispatcher
-
-
-
-
public abstract class Dispatcher
extends Object
- - -

-Handler for mock server requests. -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
Dispatcher() - -
-           
-  - - - - - - - - - - - - - - - -
-Method Summary
-abstract  MockResponsedispatch(RecordedRequest request) - -
-          Returns a response to satisfy request.
- SocketPolicypeekSocketPolicy() - -
-          Returns the socket policy of the next request.
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-Dispatcher

-
-public Dispatcher()
-
-
- - - - - - - - -
-Method Detail
- -

-dispatch

-
-public abstract MockResponse dispatch(RecordedRequest request)
-                               throws InterruptedException
-
-
Returns a response to satisfy request. This method can block (for instance, to wait on a CountdownLatch). -

-

- -
Throws: -
InterruptedException
-
-
-
- -

-peekSocketPolicy

-
-public SocketPolicy peekSocketPolicy()
-
-
Returns the socket policy of the next request. Default implementation returns SocketPolicy.KEEP_OPEN. - Mischievous implementations can return other values to test HTTP edge cases. -

-

-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/MockResponse.html b/javadoc/com/google/mockwebserver/MockResponse.html deleted file mode 100644 index a87b32a5a..000000000 --- a/javadoc/com/google/mockwebserver/MockResponse.html +++ /dev/null @@ -1,721 +0,0 @@ - - - - - - - -MockResponse (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class MockResponse

-
-java.lang.Object
-  extended by com.google.mockwebserver.MockResponse
-
-
-
All Implemented Interfaces:
Cloneable
-
-
-
-
public final class MockResponse
extends Object
implements Cloneable
- - -

-A scripted response to be replayed by the mock web server. -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
MockResponse() - -
-          Creates a new mock response with an empty body.
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- MockResponseaddHeader(String header) - -
-          Adds header as an HTTP header.
- MockResponseaddHeader(String name, - Object value) - -
-          Adds a new header with the name and value.
- MockResponseclearHeaders() - -
-          Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default.
- MockResponseclone() - -
-           
- byte[]getBody() - -
-          Returns the raw HTTP payload.
- intgetBytesPerSecond() - -
-           
- List<String>getHeaders() - -
-          Returns the HTTP headers, such as "Content-Length: 0".
- SocketPolicygetSocketPolicy() - -
-           
- StringgetStatus() - -
-          Returns the HTTP response line, such as "HTTP/1.1 200 OK".
- MockResponseremoveHeader(String name) - -
-          Removes all headers named name.
- MockResponsesetBody(byte[] body) - -
-           
- MockResponsesetBody(String body) - -
-          Sets the response body to the UTF-8 encoded bytes of body.
- MockResponsesetBytesPerSecond(int bytesPerSecond) - -
-          Set simulated network speed, in bytes per second.
- MockResponsesetChunkedBody(byte[] body, - int maxChunkSize) - -
-          Sets the response body to body, chunked every maxChunkSize bytes.
- MockResponsesetChunkedBody(String body, - int maxChunkSize) - -
-          Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes.
- MockResponsesetHeader(String name, - Object value) - -
-          Removes all headers named name, then adds a new header with the - name and value.
- MockResponsesetResponseCode(int code) - -
-           
- MockResponsesetSocketPolicy(SocketPolicy socketPolicy) - -
-           
- MockResponsesetStatus(String status) - -
-           
- StringtoString() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-MockResponse

-
-public MockResponse()
-
-
Creates a new mock response with an empty body. -

-

- - - - - - - - -
-Method Detail
- -

-clone

-
-public MockResponse clone()
-
-
-
Overrides:
clone in class Object
-
-
-
-
-
-
- -

-getStatus

-
-public String getStatus()
-
-
Returns the HTTP response line, such as "HTTP/1.1 200 OK". -

-

-
-
-
-
-
-
-
- -

-setResponseCode

-
-public MockResponse setResponseCode(int code)
-
-
-
-
-
-
-
-
-
- -

-setStatus

-
-public MockResponse setStatus(String status)
-
-
-
-
-
-
-
-
-
- -

-getHeaders

-
-public List<String> getHeaders()
-
-
Returns the HTTP headers, such as "Content-Length: 0". -

-

-
-
-
-
-
-
-
- -

-clearHeaders

-
-public MockResponse clearHeaders()
-
-
Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default. -

-

-
-
-
-
-
-
-
- -

-addHeader

-
-public MockResponse addHeader(String header)
-
-
Adds header as an HTTP header. For well-formed HTTP header should contain a name followed by a colon and a value. -

-

-
-
-
-
-
-
-
- -

-addHeader

-
-public MockResponse addHeader(String name,
-                              Object value)
-
-
Adds a new header with the name and value. This may be used to add - multiple headers with the same name. -

-

-
-
-
-
-
-
-
- -

-setHeader

-
-public MockResponse setHeader(String name,
-                              Object value)
-
-
Removes all headers named name, then adds a new header with the - name and value. -

-

-
-
-
-
-
-
-
- -

-removeHeader

-
-public MockResponse removeHeader(String name)
-
-
Removes all headers named name. -

-

-
-
-
-
-
-
-
- -

-getBody

-
-public byte[] getBody()
-
-
Returns the raw HTTP payload. -

-

-
-
-
-
-
-
-
- -

-setBody

-
-public MockResponse setBody(byte[] body)
-
-
-
-
-
-
-
-
-
- -

-setBody

-
-public MockResponse setBody(String body)
-
-
Sets the response body to the UTF-8 encoded bytes of body. -

-

-
-
-
-
-
-
-
- -

-setChunkedBody

-
-public MockResponse setChunkedBody(byte[] body,
-                                   int maxChunkSize)
-
-
Sets the response body to body, chunked every maxChunkSize bytes. -

-

-
-
-
-
-
-
-
- -

-setChunkedBody

-
-public MockResponse setChunkedBody(String body,
-                                   int maxChunkSize)
-
-
Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes. -

-

-
-
-
-
-
-
-
- -

-getSocketPolicy

-
-public SocketPolicy getSocketPolicy()
-
-
-
-
-
-
-
-
-
- -

-setSocketPolicy

-
-public MockResponse setSocketPolicy(SocketPolicy socketPolicy)
-
-
-
-
-
-
-
-
-
- -

-getBytesPerSecond

-
-public int getBytesPerSecond()
-
-
-
-
-
-
-
-
-
- -

-setBytesPerSecond

-
-public MockResponse setBytesPerSecond(int bytesPerSecond)
-
-
Set simulated network speed, in bytes per second. This applies to the - response body only; response headers are not throttled. -

-

-
-
-
-
-
-
-
- -

-toString

-
-public String toString()
-
-
-
Overrides:
toString in class Object
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/MockWebServer.html b/javadoc/com/google/mockwebserver/MockWebServer.html deleted file mode 100644 index b01a91f36..000000000 --- a/javadoc/com/google/mockwebserver/MockWebServer.html +++ /dev/null @@ -1,545 +0,0 @@ - - - - - - - -MockWebServer (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class MockWebServer

-
-java.lang.Object
-  extended by com.google.mockwebserver.MockWebServer
-
-
-
-
public final class MockWebServer
extends Object
- - -

-A scriptable web server. Callers supply canned responses and the server - replays them upon request in sequence. -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
MockWebServer() - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidenqueue(MockResponse response) - -
-           
- StringgetCookieDomain() - -
-          Returns a cookie domain for this server.
- StringgetHostName() - -
-           
- intgetPort() - -
-           
- intgetRequestCount() - -
-          Returns the number of HTTP requests received thus far by this server.
- URLgetUrl(String path) - -
-          Returns a URL for connecting to this server.
- voidplay() - -
-          Equivalent to play(0).
- voidplay(int port) - -
-          Starts the server, serves all enqueued requests, and shuts the server - down.
- voidsetBodyLimit(int maxBodyLength) - -
-          Sets the number of bytes of the POST body to keep in memory to the given - limit.
- voidsetDispatcher(Dispatcher dispatcher) - -
-           
- voidshutdown() - -
-           
- RecordedRequesttakeRequest() - -
-          Awaits the next HTTP request, removes it, and returns it.
- ProxytoProxyAddress() - -
-           
- voiduseHttps(SSLSocketFactory sslSocketFactory, - boolean tunnelProxy) - -
-          Serve requests with HTTPS rather than otherwise.
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-MockWebServer

-
-public MockWebServer()
-
-
- - - - - - - - -
-Method Detail
- -

-getPort

-
-public int getPort()
-
-
-
-
-
-
- -

-getHostName

-
-public String getHostName()
-
-
-
-
-
-
- -

-toProxyAddress

-
-public Proxy toProxyAddress()
-
-
-
-
-
-
- -

-getUrl

-
-public URL getUrl(String path)
-
-
Returns a URL for connecting to this server. -

-

-
Parameters:
path - the request path, such as "/".
-
-
-
- -

-getCookieDomain

-
-public String getCookieDomain()
-
-
Returns a cookie domain for this server. This returns the server's - non-loopback host name if it is known. Otherwise this returns ".local" - for this server's loopback name. -

-

-
-
-
-
- -

-setBodyLimit

-
-public void setBodyLimit(int maxBodyLength)
-
-
Sets the number of bytes of the POST body to keep in memory to the given - limit. -

-

-
-
-
-
- -

-useHttps

-
-public void useHttps(SSLSocketFactory sslSocketFactory,
-                     boolean tunnelProxy)
-
-
Serve requests with HTTPS rather than otherwise. -

-

-
Parameters:
tunnelProxy - whether to expect the HTTP CONNECT method before - negotiating TLS.
-
-
-
- -

-takeRequest

-
-public RecordedRequest takeRequest()
-                            throws InterruptedException
-
-
Awaits the next HTTP request, removes it, and returns it. Callers should - use this to verify the request sent was as intended. -

-

- -
Throws: -
InterruptedException
-
-
-
- -

-getRequestCount

-
-public int getRequestCount()
-
-
Returns the number of HTTP requests received thus far by this server. - This may exceed the number of HTTP connections when connection reuse is - in practice. -

-

-
-
-
-
- -

-enqueue

-
-public void enqueue(MockResponse response)
-
-
-
-
-
-
- -

-play

-
-public void play()
-          throws IOException
-
-
Equivalent to play(0). -

-

- -
Throws: -
IOException
-
-
-
- -

-play

-
-public void play(int port)
-          throws IOException
-
-
Starts the server, serves all enqueued requests, and shuts the server - down. -

-

-
Parameters:
port - the port to listen to, or 0 for any available port. - Automated tests should always use port 0 to avoid flakiness when a - specific port is unavailable. -
Throws: -
IOException
-
-
-
- -

-shutdown

-
-public void shutdown()
-              throws IOException
-
-
- -
Throws: -
IOException
-
-
-
- -

-setDispatcher

-
-public void setDispatcher(Dispatcher dispatcher)
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/QueueDispatcher.html b/javadoc/com/google/mockwebserver/QueueDispatcher.html deleted file mode 100644 index 86279e55f..000000000 --- a/javadoc/com/google/mockwebserver/QueueDispatcher.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - -QueueDispatcher (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class QueueDispatcher

-
-java.lang.Object
-  extended by com.google.mockwebserver.Dispatcher
-      extended by com.google.mockwebserver.QueueDispatcher
-
-
-
-
public class QueueDispatcher
extends Dispatcher
- - -

-Default dispatcher that processes a script of responses. Populate the script by calling - enqueueResponse(MockResponse). -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
QueueDispatcher() - -
-           
-  - - - - - - - - - - - - - - - - - - - -
-Method Summary
- MockResponsedispatch(RecordedRequest request) - -
-          Returns a response to satisfy request.
- voidenqueueResponse(MockResponse response) - -
-           
- SocketPolicypeekSocketPolicy() - -
-          Returns the socket policy of the next request.
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-QueueDispatcher

-
-public QueueDispatcher()
-
-
- - - - - - - - -
-Method Detail
- -

-dispatch

-
-public MockResponse dispatch(RecordedRequest request)
-                      throws InterruptedException
-
-
Description copied from class: Dispatcher
-
Returns a response to satisfy request. This method can block (for instance, to wait on a CountdownLatch). -

-

-
Specified by:
dispatch in class Dispatcher
-
-
- -
Throws: -
InterruptedException
-
-
-
- -

-peekSocketPolicy

-
-public SocketPolicy peekSocketPolicy()
-
-
Description copied from class: Dispatcher
-
Returns the socket policy of the next request. Default implementation returns SocketPolicy.KEEP_OPEN. - Mischievous implementations can return other values to test HTTP edge cases. -

-

-
Overrides:
peekSocketPolicy in class Dispatcher
-
-
-
-
-
-
- -

-enqueueResponse

-
-public void enqueueResponse(MockResponse response)
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/RecordedRequest.html b/javadoc/com/google/mockwebserver/RecordedRequest.html deleted file mode 100644 index e0e905ab1..000000000 --- a/javadoc/com/google/mockwebserver/RecordedRequest.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - - - -RecordedRequest (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class RecordedRequest

-
-java.lang.Object
-  extended by com.google.mockwebserver.RecordedRequest
-
-
-
-
public final class RecordedRequest
extends Object
- - -

-An HTTP request that came into the mock web server. -

- -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- byte[]getBody() - -
-          Returns the body of this POST request.
- intgetBodySize() - -
-          Returns the total size of the body of this POST request (before - truncation).
- List<Integer>getChunkSizes() - -
-          Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked.
- StringgetHeader(String name) - -
-          Returns the first header named name, or null if no such header - exists.
- List<String>getHeaders() - -
-          Returns all headers.
- List<String>getHeaders(String name) - -
-          Returns the headers named name.
- StringgetMethod() - -
-           
- StringgetPath() - -
-           
- StringgetRequestLine() - -
-           
- intgetSequenceNumber() - -
-          Returns the index of this request on its HTTP connection.
- StringgetSslProtocol() - -
-          Returns the connection's SSL protocol like TLSv1, SSLv3, - NONE or null if the connection doesn't use SSL.
- StringgetUtf8Body() - -
-          Returns the body of this POST request decoded as a UTF-8 string.
- StringtoString() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Method Detail
- -

-getRequestLine

-
-public String getRequestLine()
-
-
-
-
-
-
- -

-getMethod

-
-public String getMethod()
-
-
-
-
-
-
- -

-getPath

-
-public String getPath()
-
-
-
-
-
-
- -

-getHeaders

-
-public List<String> getHeaders()
-
-
Returns all headers. -

-

-
-
-
-
- -

-getHeader

-
-public String getHeader(String name)
-
-
Returns the first header named name, or null if no such header - exists. -

-

-
-
-
-
- -

-getHeaders

-
-public List<String> getHeaders(String name)
-
-
Returns the headers named name. -

-

-
-
-
-
- -

-getChunkSizes

-
-public List<Integer> getChunkSizes()
-
-
Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked. -

-

-
-
-
-
- -

-getBodySize

-
-public int getBodySize()
-
-
Returns the total size of the body of this POST request (before - truncation). -

-

-
-
-
-
- -

-getBody

-
-public byte[] getBody()
-
-
Returns the body of this POST request. This may be truncated. -

-

-
-
-
-
- -

-getUtf8Body

-
-public String getUtf8Body()
-
-
Returns the body of this POST request decoded as a UTF-8 string. -

-

-
-
-
-
- -

-getSequenceNumber

-
-public int getSequenceNumber()
-
-
Returns the index of this request on its HTTP connection. Since a single - HTTP connection may serve multiple requests, each request is assigned its - own sequence number. -

-

-
-
-
-
- -

-getSslProtocol

-
-public String getSslProtocol()
-
-
Returns the connection's SSL protocol like TLSv1, SSLv3, - NONE or null if the connection doesn't use SSL. -

-

-
-
-
-
- -

-toString

-
-public String toString()
-
-
-
Overrides:
toString in class Object
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/SocketPolicy.html b/javadoc/com/google/mockwebserver/SocketPolicy.html deleted file mode 100644 index d9c97033a..000000000 --- a/javadoc/com/google/mockwebserver/SocketPolicy.html +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - -SocketPolicy (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Enum SocketPolicy

-
-java.lang.Object
-  extended by java.lang.Enum<SocketPolicy>
-      extended by com.google.mockwebserver.SocketPolicy
-
-
-
All Implemented Interfaces:
Serializable, Comparable<SocketPolicy>
-
-
-
-
public enum SocketPolicy
extends Enum<SocketPolicy>
- - -

-What should be done with the incoming socket. -

- -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Enum Constant Summary
DISCONNECT_AT_END - -
-          Close the socket after the response.
DISCONNECT_AT_START - -
-          Request immediate close of connection without even reading the - request.
FAIL_HANDSHAKE - -
-          Don't trust the client during the SSL handshake.
KEEP_OPEN - -
-          Keep the socket open after the response.
SHUTDOWN_INPUT_AT_END - -
-          Shutdown the socket input after sending the response.
SHUTDOWN_OUTPUT_AT_END - -
-          Shutdown the socket output after sending the response.
UPGRADE_TO_SSL_AT_END - -
-          Wrap the socket with SSL at the completion of this request/response - pair.
-  - - - - - - - - - - - - - - - -
-Method Summary
-static SocketPolicyvalueOf(String name) - -
-          Returns the enum constant of this type with the specified name.
-static SocketPolicy[]values() - -
-          Returns an array containing the constants of this enum type, in -the order they are declared.
- - - - - - - -
Methods inherited from class java.lang.Enum
clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
- - - - - - - -
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Enum Constant Detail
- -

-KEEP_OPEN

-
-public static final SocketPolicy KEEP_OPEN
-
-
Keep the socket open after the response. This is the default HTTP/1.1 - behavior. -

-

-
-
-
- -

-DISCONNECT_AT_END

-
-public static final SocketPolicy DISCONNECT_AT_END
-
-
Close the socket after the response. This is the default HTTP/1.0 - behavior. -

-

-
-
-
- -

-UPGRADE_TO_SSL_AT_END

-
-public static final SocketPolicy UPGRADE_TO_SSL_AT_END
-
-
Wrap the socket with SSL at the completion of this request/response - pair. Used for CONNECT messages to tunnel SSL over an HTTP proxy. -

-

-
-
-
- -

-DISCONNECT_AT_START

-
-public static final SocketPolicy DISCONNECT_AT_START
-
-
Request immediate close of connection without even reading the - request. - -

Use to simulate the real life case of losing connection - because of bugger SSL server close connection when it seems - something like a compression method or TLS extension it doesn't - understand, instead of simply ignoring it like it should. -

-

-
-
-
- -

-FAIL_HANDSHAKE

-
-public static final SocketPolicy FAIL_HANDSHAKE
-
-
Don't trust the client during the SSL handshake. -

-

-
-
-
- -

-SHUTDOWN_INPUT_AT_END

-
-public static final SocketPolicy SHUTDOWN_INPUT_AT_END
-
-
Shutdown the socket input after sending the response. For testing bad - behavior. -

-

-
-
-
- -

-SHUTDOWN_OUTPUT_AT_END

-
-public static final SocketPolicy SHUTDOWN_OUTPUT_AT_END
-
-
Shutdown the socket output after sending the response. For testing bad - behavior. -

-

-
-
- - - - - - - - -
-Method Detail
- -

-values

-
-public static SocketPolicy[] values()
-
-
Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
-for (SocketPolicy c : SocketPolicy.values())
-    System.out.println(c);
-
-

-

- -
Returns:
an array containing the constants of this enum type, in -the order they are declared
-
-
-
- -

-valueOf

-
-public static SocketPolicy valueOf(String name)
-
-
Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.) -

-

-
Parameters:
name - the name of the enum constant to be returned. -
Returns:
the enum constant with the specified name -
Throws: -
IllegalArgumentException - if this enum type has no constant -with the specified name -
NullPointerException - if the argument is null
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/Dispatcher.html b/javadoc/com/google/mockwebserver/class-use/Dispatcher.html deleted file mode 100644 index 54be7af71..000000000 --- a/javadoc/com/google/mockwebserver/class-use/Dispatcher.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.Dispatcher (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.Dispatcher

-
- - - - - -
-Uses of Dispatcher in com.google.mockwebserver
-  -

- - - - - - - - - -
Subclasses of Dispatcher in com.google.mockwebserver
- classQueueDispatcher - -
-          Default dispatcher that processes a script of responses.
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver with parameters of type Dispatcher
- voidMockWebServer.setDispatcher(Dispatcher dispatcher) - -
-           
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/MockResponse.html b/javadoc/com/google/mockwebserver/class-use/MockResponse.html deleted file mode 100644 index 37d39c7ec..000000000 --- a/javadoc/com/google/mockwebserver/class-use/MockResponse.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.MockResponse (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.MockResponse

-
- - - - - -
-Uses of MockResponse in com.google.mockwebserver
-  -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Methods in com.google.mockwebserver that return MockResponse
- MockResponseMockResponse.addHeader(String header) - -
-          Adds header as an HTTP header.
- MockResponseMockResponse.addHeader(String name, - Object value) - -
-          Adds a new header with the name and value.
- MockResponseMockResponse.clearHeaders() - -
-          Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default.
- MockResponseMockResponse.clone() - -
-           
- MockResponseQueueDispatcher.dispatch(RecordedRequest request) - -
-           
-abstract  MockResponseDispatcher.dispatch(RecordedRequest request) - -
-          Returns a response to satisfy request.
- MockResponseMockResponse.removeHeader(String name) - -
-          Removes all headers named name.
- MockResponseMockResponse.setBody(byte[] body) - -
-           
- MockResponseMockResponse.setBody(String body) - -
-          Sets the response body to the UTF-8 encoded bytes of body.
- MockResponseMockResponse.setBytesPerSecond(int bytesPerSecond) - -
-          Set simulated network speed, in bytes per second.
- MockResponseMockResponse.setChunkedBody(byte[] body, - int maxChunkSize) - -
-          Sets the response body to body, chunked every maxChunkSize bytes.
- MockResponseMockResponse.setChunkedBody(String body, - int maxChunkSize) - -
-          Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes.
- MockResponseMockResponse.setHeader(String name, - Object value) - -
-          Removes all headers named name, then adds a new header with the - name and value.
- MockResponseMockResponse.setResponseCode(int code) - -
-           
- MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) - -
-           
- MockResponseMockResponse.setStatus(String status) - -
-           
-  -

- - - - - - - - - - - - - -
Methods in com.google.mockwebserver with parameters of type MockResponse
- voidMockWebServer.enqueue(MockResponse response) - -
-           
- voidQueueDispatcher.enqueueResponse(MockResponse response) - -
-           
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/MockWebServer.html b/javadoc/com/google/mockwebserver/class-use/MockWebServer.html deleted file mode 100644 index 7d15c9afd..000000000 --- a/javadoc/com/google/mockwebserver/class-use/MockWebServer.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.MockWebServer (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.MockWebServer

-
-No usage of com.google.mockwebserver.MockWebServer -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/QueueDispatcher.html b/javadoc/com/google/mockwebserver/class-use/QueueDispatcher.html deleted file mode 100644 index 76e103730..000000000 --- a/javadoc/com/google/mockwebserver/class-use/QueueDispatcher.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.QueueDispatcher (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.QueueDispatcher

-
-No usage of com.google.mockwebserver.QueueDispatcher -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html b/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html deleted file mode 100644 index 9e831a720..000000000 --- a/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.RecordedRequest (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.RecordedRequest

-
- - - - - -
-Uses of RecordedRequest in com.google.mockwebserver
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver that return RecordedRequest
- RecordedRequestMockWebServer.takeRequest() - -
-          Awaits the next HTTP request, removes it, and returns it.
-  -

- - - - - - - - - - - - - -
Methods in com.google.mockwebserver with parameters of type RecordedRequest
- MockResponseQueueDispatcher.dispatch(RecordedRequest request) - -
-           
-abstract  MockResponseDispatcher.dispatch(RecordedRequest request) - -
-          Returns a response to satisfy request.
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html b/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html deleted file mode 100644 index cabd48688..000000000 --- a/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.SocketPolicy (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.SocketPolicy

-
- - - - - -
-Uses of SocketPolicy in com.google.mockwebserver
-  -

- - - - - - - - - - - - - - - - - - - - - - - - - -
Methods in com.google.mockwebserver that return SocketPolicy
- SocketPolicyMockResponse.getSocketPolicy() - -
-           
- SocketPolicyQueueDispatcher.peekSocketPolicy() - -
-           
- SocketPolicyDispatcher.peekSocketPolicy() - -
-          Returns the socket policy of the next request.
-static SocketPolicySocketPolicy.valueOf(String name) - -
-          Returns the enum constant of this type with the specified name.
-static SocketPolicy[]SocketPolicy.values() - -
-          Returns an array containing the constants of this enum type, in -the order they are declared.
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver with parameters of type SocketPolicy
- MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) - -
-           
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/package-frame.html b/javadoc/com/google/mockwebserver/package-frame.html deleted file mode 100644 index 4bb58dd0f..000000000 --- a/javadoc/com/google/mockwebserver/package-frame.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - -com.google.mockwebserver (mockwebserver 20120801 API) - - - - - - - - - - - -com.google.mockwebserver - - - - -
-Classes  - -
-Dispatcher -
-MockResponse -
-MockWebServer -
-QueueDispatcher -
-RecordedRequest
- - - - - - -
-Enums  - -
-SocketPolicy
- - - - diff --git a/javadoc/com/google/mockwebserver/package-summary.html b/javadoc/com/google/mockwebserver/package-summary.html deleted file mode 100644 index 884b34692..000000000 --- a/javadoc/com/google/mockwebserver/package-summary.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - -com.google.mockwebserver (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.google.mockwebserver -

- - - - - - - - - - - - - - - - - - - - - - - - - -
-Class Summary
DispatcherHandler for mock server requests.
MockResponseA scripted response to be replayed by the mock web server.
MockWebServerA scriptable web server.
QueueDispatcherDefault dispatcher that processes a script of responses.
RecordedRequestAn HTTP request that came into the mock web server.
-  - -

- - - - - - - - - -
-Enum Summary
SocketPolicyWhat should be done with the incoming socket.
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/package-tree.html b/javadoc/com/google/mockwebserver/package-tree.html deleted file mode 100644 index 071d3498f..000000000 --- a/javadoc/com/google/mockwebserver/package-tree.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - -com.google.mockwebserver Class Hierarchy (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.google.mockwebserver -

-
-

-Class Hierarchy -

- -

-Enum Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/package-use.html b/javadoc/com/google/mockwebserver/package-use.html deleted file mode 100644 index 7b8f7a929..000000000 --- a/javadoc/com/google/mockwebserver/package-use.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - -Uses of Package com.google.mockwebserver (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Package
com.google.mockwebserver

-
- - - - - - - - - - - - - - - - - -
-Classes in com.google.mockwebserver used by com.google.mockwebserver
Dispatcher - -
-          Handler for mock server requests.
MockResponse - -
-          A scripted response to be replayed by the mock web server.
RecordedRequest - -
-          An HTTP request that came into the mock web server.
SocketPolicy - -
-          What should be done with the incoming socket.
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/constant-values.html b/javadoc/constant-values.html deleted file mode 100644 index 2473fc37f..000000000 --- a/javadoc/constant-values.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - -Constant Field Values (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Constant Field Values

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/deprecated-list.html b/javadoc/deprecated-list.html deleted file mode 100644 index 08b040334..000000000 --- a/javadoc/deprecated-list.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - -Deprecated List (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Deprecated API

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/help-doc.html b/javadoc/help-doc.html deleted file mode 100644 index 2ee249fca..000000000 --- a/javadoc/help-doc.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - -API Help (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-How This API Document Is Organized

-
-This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

-Package

-
- -

-Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    -
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
-
-

-Class/Interface

-
- -

-Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    -
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description -

    -

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary -

    -

  • Field Detail
  • Constructor Detail
  • Method Detail
-Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
- -

-Annotation Type

-
- -

-Each annotation type has its own separate page with the following sections:

    -
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
-
- -

-Enum

-
- -

-Each enum has its own separate page with the following sections:

    -
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
-
-

-Use

-
-Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.
-

-Tree (Class Hierarchy)

-
-There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    -
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
-
-

-Deprecated API

-
-The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
-

-Index

-
-The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
-

-Prev/Next

-These links take you to the next or previous class, interface, package, or related page.

-Frames/No Frames

-These links show and hide the HTML frames. All pages are available with or without frames. -

-

-Serialized Form

-Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. -

-

-Constant Field Values

-The Constant Field Values page lists the static final fields and their values. -

- - -This help file applies to API documentation generated using the standard doclet. - -
-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/index-all.html b/javadoc/index-all.html deleted file mode 100644 index 5a411fdbc..000000000 --- a/javadoc/index-all.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - - - -Index (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -A C D E G M P Q R S T U V
-

-A

-
-
addHeader(String) - -Method in class com.google.mockwebserver.MockResponse -
Adds header as an HTTP header. -
addHeader(String, Object) - -Method in class com.google.mockwebserver.MockResponse -
Adds a new header with the name and value. -
-
-

-C

-
-
clearHeaders() - -Method in class com.google.mockwebserver.MockResponse -
Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default. -
clone() - -Method in class com.google.mockwebserver.MockResponse -
  -
com.google.mockwebserver - package com.google.mockwebserver
 
-
-

-D

-
-
dispatch(RecordedRequest) - -Method in class com.google.mockwebserver.Dispatcher -
Returns a response to satisfy request. -
dispatch(RecordedRequest) - -Method in class com.google.mockwebserver.QueueDispatcher -
  -
Dispatcher - Class in com.google.mockwebserver
Handler for mock server requests.
Dispatcher() - -Constructor for class com.google.mockwebserver.Dispatcher -
  -
-
-

-E

-
-
enqueue(MockResponse) - -Method in class com.google.mockwebserver.MockWebServer -
  -
enqueueResponse(MockResponse) - -Method in class com.google.mockwebserver.QueueDispatcher -
  -
-
-

-G

-
-
getBody() - -Method in class com.google.mockwebserver.MockResponse -
Returns the raw HTTP payload. -
getBody() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the body of this POST request. -
getBodySize() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the total size of the body of this POST request (before - truncation). -
getBytesPerSecond() - -Method in class com.google.mockwebserver.MockResponse -
  -
getChunkSizes() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked. -
getCookieDomain() - -Method in class com.google.mockwebserver.MockWebServer -
Returns a cookie domain for this server. -
getHeader(String) - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the first header named name, or null if no such header - exists. -
getHeaders() - -Method in class com.google.mockwebserver.MockResponse -
Returns the HTTP headers, such as "Content-Length: 0". -
getHeaders() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns all headers. -
getHeaders(String) - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the headers named name. -
getHostName() - -Method in class com.google.mockwebserver.MockWebServer -
  -
getMethod() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getPath() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getPort() - -Method in class com.google.mockwebserver.MockWebServer -
  -
getRequestCount() - -Method in class com.google.mockwebserver.MockWebServer -
Returns the number of HTTP requests received thus far by this server. -
getRequestLine() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getSequenceNumber() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the index of this request on its HTTP connection. -
getSocketPolicy() - -Method in class com.google.mockwebserver.MockResponse -
  -
getSslProtocol() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the connection's SSL protocol like TLSv1, SSLv3, - NONE or null if the connection doesn't use SSL. -
getStatus() - -Method in class com.google.mockwebserver.MockResponse -
Returns the HTTP response line, such as "HTTP/1.1 200 OK". -
getUrl(String) - -Method in class com.google.mockwebserver.MockWebServer -
Returns a URL for connecting to this server. -
getUtf8Body() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the body of this POST request decoded as a UTF-8 string. -
-
-

-M

-
-
MockResponse - Class in com.google.mockwebserver
A scripted response to be replayed by the mock web server.
MockResponse() - -Constructor for class com.google.mockwebserver.MockResponse -
Creates a new mock response with an empty body. -
MockWebServer - Class in com.google.mockwebserver
A scriptable web server.
MockWebServer() - -Constructor for class com.google.mockwebserver.MockWebServer -
  -
-
-

-P

-
-
peekSocketPolicy() - -Method in class com.google.mockwebserver.Dispatcher -
Returns the socket policy of the next request. -
peekSocketPolicy() - -Method in class com.google.mockwebserver.QueueDispatcher -
  -
play() - -Method in class com.google.mockwebserver.MockWebServer -
Equivalent to play(0). -
play(int) - -Method in class com.google.mockwebserver.MockWebServer -
Starts the server, serves all enqueued requests, and shuts the server - down. -
-
-

-Q

-
-
QueueDispatcher - Class in com.google.mockwebserver
Default dispatcher that processes a script of responses.
QueueDispatcher() - -Constructor for class com.google.mockwebserver.QueueDispatcher -
  -
-
-

-R

-
-
RecordedRequest - Class in com.google.mockwebserver
An HTTP request that came into the mock web server.
removeHeader(String) - -Method in class com.google.mockwebserver.MockResponse -
Removes all headers named name. -
-
-

-S

-
-
setBody(byte[]) - -Method in class com.google.mockwebserver.MockResponse -
  -
setBody(String) - -Method in class com.google.mockwebserver.MockResponse -
Sets the response body to the UTF-8 encoded bytes of body. -
setBodyLimit(int) - -Method in class com.google.mockwebserver.MockWebServer -
Sets the number of bytes of the POST body to keep in memory to the given - limit. -
setBytesPerSecond(int) - -Method in class com.google.mockwebserver.MockResponse -
Set simulated network speed, in bytes per second. -
setChunkedBody(byte[], int) - -Method in class com.google.mockwebserver.MockResponse -
Sets the response body to body, chunked every maxChunkSize bytes. -
setChunkedBody(String, int) - -Method in class com.google.mockwebserver.MockResponse -
Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes. -
setDispatcher(Dispatcher) - -Method in class com.google.mockwebserver.MockWebServer -
  -
setHeader(String, Object) - -Method in class com.google.mockwebserver.MockResponse -
Removes all headers named name, then adds a new header with the - name and value. -
setResponseCode(int) - -Method in class com.google.mockwebserver.MockResponse -
  -
setSocketPolicy(SocketPolicy) - -Method in class com.google.mockwebserver.MockResponse -
  -
setStatus(String) - -Method in class com.google.mockwebserver.MockResponse -
  -
shutdown() - -Method in class com.google.mockwebserver.MockWebServer -
  -
SocketPolicy - Enum in com.google.mockwebserver
What should be done with the incoming socket.
-
-

-T

-
-
takeRequest() - -Method in class com.google.mockwebserver.MockWebServer -
Awaits the next HTTP request, removes it, and returns it. -
toProxyAddress() - -Method in class com.google.mockwebserver.MockWebServer -
  -
toString() - -Method in class com.google.mockwebserver.MockResponse -
  -
toString() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
-
-

-U

-
-
useHttps(SSLSocketFactory, boolean) - -Method in class com.google.mockwebserver.MockWebServer -
Serve requests with HTTPS rather than otherwise. -
-
-

-V

-
-
valueOf(String) - -Static method in enum com.google.mockwebserver.SocketPolicy -
Returns the enum constant of this type with the specified name. -
values() - -Static method in enum com.google.mockwebserver.SocketPolicy -
Returns an array containing the constants of this enum type, in -the order they are declared. -
-
-A C D E G M P Q R S T U V - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/index.html b/javadoc/index.html deleted file mode 100644 index 19785ccf2..000000000 --- a/javadoc/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - -mockwebserver 20120801 API - - - - - - - - -<H2> -Frame Alert</H2> - -<P> -This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. -<BR> -Link to<A HREF="com/google/mockwebserver/package-summary.html">Non-frame version.</A> - - - diff --git a/javadoc/overview-tree.html b/javadoc/overview-tree.html deleted file mode 100644 index 50af843a3..000000000 --- a/javadoc/overview-tree.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - -Class Hierarchy (mockwebserver 20120801 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For All Packages

-
-
-
Package Hierarchies:
com.google.mockwebserver
-
-

-Class Hierarchy -

- -

-Enum Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/package-list b/javadoc/package-list deleted file mode 100644 index 89508e5d3..000000000 --- a/javadoc/package-list +++ /dev/null @@ -1 +0,0 @@ -com.google.mockwebserver diff --git a/javadoc/resources/inherit.gif b/javadoc/resources/inherit.gif deleted file mode 100644 index c814867a13deb0ca7ea2156c6ca1d5a03372af7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X diff --git a/javadoc/stylesheet.css b/javadoc/stylesheet.css deleted file mode 100644 index 6ea9e5161..000000000 --- a/javadoc/stylesheet.css +++ /dev/null @@ -1,29 +0,0 @@ -/* Javadoc style sheet */ - -/* Define colors, fonts and other style attributes here to override the defaults */ - -/* Page background color */ -body { background-color: #FFFFFF; color:#000000 } - -/* Headings */ -h1 { font-size: 145% } - -/* Table colors */ -.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ -.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ -.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ - -/* Font used in left-hand frame lists */ -.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } - -/* Navigation bar fonts and colors */ -.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ -.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ -.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} -.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} - -.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} -.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} - From 47e5ea23b04ccd4b36b7690d9e2812aec5005b2d Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Mon, 20 Aug 2012 05:17:05 +0000 Subject: [PATCH 24/43] New javadoc git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@27 cf848351-439f-e86a-257f-67fa721851d5 --- javadoc/allclasses-frame.html | 40 + javadoc/allclasses-noframe.html | 40 + .../com/google/mockwebserver/Dispatcher.html | 284 +++++++ .../google/mockwebserver/MockResponse.html | 721 ++++++++++++++++++ .../google/mockwebserver/MockWebServer.html | 557 ++++++++++++++ .../google/mockwebserver/RecordedRequest.html | 481 ++++++++++++ .../google/mockwebserver/SocketPolicy.html | 432 +++++++++++ .../mockwebserver/class-use/Dispatcher.html | 166 ++++ .../mockwebserver/class-use/MockResponse.html | 301 ++++++++ .../class-use/MockWebServer.html | 143 ++++ .../class-use/RecordedRequest.html | 182 +++++ .../mockwebserver/class-use/SocketPolicy.html | 207 +++++ .../google/mockwebserver/package-frame.html | 50 ++ .../google/mockwebserver/package-summary.html | 182 +++++ .../google/mockwebserver/package-tree.html | 160 ++++ .../com/google/mockwebserver/package-use.html | 174 +++++ javadoc/constant-values.html | 145 ++++ javadoc/deprecated-list.html | 145 ++++ javadoc/help-doc.html | 216 ++++++ javadoc/index-all.html | 368 +++++++++ javadoc/index.html | 37 + javadoc/overview-tree.html | 162 ++++ javadoc/package-list | 1 + javadoc/resources/inherit.gif | Bin 0 -> 57 bytes javadoc/stylesheet.css | 29 + 25 files changed, 5223 insertions(+) create mode 100644 javadoc/allclasses-frame.html create mode 100644 javadoc/allclasses-noframe.html create mode 100644 javadoc/com/google/mockwebserver/Dispatcher.html create mode 100644 javadoc/com/google/mockwebserver/MockResponse.html create mode 100644 javadoc/com/google/mockwebserver/MockWebServer.html create mode 100644 javadoc/com/google/mockwebserver/RecordedRequest.html create mode 100644 javadoc/com/google/mockwebserver/SocketPolicy.html create mode 100644 javadoc/com/google/mockwebserver/class-use/Dispatcher.html create mode 100644 javadoc/com/google/mockwebserver/class-use/MockResponse.html create mode 100644 javadoc/com/google/mockwebserver/class-use/MockWebServer.html create mode 100644 javadoc/com/google/mockwebserver/class-use/RecordedRequest.html create mode 100644 javadoc/com/google/mockwebserver/class-use/SocketPolicy.html create mode 100644 javadoc/com/google/mockwebserver/package-frame.html create mode 100644 javadoc/com/google/mockwebserver/package-summary.html create mode 100644 javadoc/com/google/mockwebserver/package-tree.html create mode 100644 javadoc/com/google/mockwebserver/package-use.html create mode 100644 javadoc/constant-values.html create mode 100644 javadoc/deprecated-list.html create mode 100644 javadoc/help-doc.html create mode 100644 javadoc/index-all.html create mode 100644 javadoc/index.html create mode 100644 javadoc/overview-tree.html create mode 100644 javadoc/package-list create mode 100644 javadoc/resources/inherit.gif create mode 100644 javadoc/stylesheet.css diff --git a/javadoc/allclasses-frame.html b/javadoc/allclasses-frame.html new file mode 100644 index 000000000..6cdc97722 --- /dev/null +++ b/javadoc/allclasses-frame.html @@ -0,0 +1,40 @@ + + + + + + + +All Classes (mockwebserver 20120819 API) + + + + + + + + + + + +All Classes +
+ + + + + +
Dispatcher +
+MockResponse +
+MockWebServer +
+RecordedRequest +
+SocketPolicy +
+
+ + + diff --git a/javadoc/allclasses-noframe.html b/javadoc/allclasses-noframe.html new file mode 100644 index 000000000..2f15ae42a --- /dev/null +++ b/javadoc/allclasses-noframe.html @@ -0,0 +1,40 @@ + + + + + + + +All Classes (mockwebserver 20120819 API) + + + + + + + + + + + +All Classes +
+ + + + + +
Dispatcher +
+MockResponse +
+MockWebServer +
+RecordedRequest +
+SocketPolicy +
+
+ + + diff --git a/javadoc/com/google/mockwebserver/Dispatcher.html b/javadoc/com/google/mockwebserver/Dispatcher.html new file mode 100644 index 000000000..0c1660037 --- /dev/null +++ b/javadoc/com/google/mockwebserver/Dispatcher.html @@ -0,0 +1,284 @@ + + + + + + + +Dispatcher (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class Dispatcher

+
+java.lang.Object
+  extended by com.google.mockwebserver.Dispatcher
+
+
+
+
public abstract class Dispatcher
extends Object
+ + +

+Handler for mock server requests. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
Dispatcher() + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+abstract  MockResponsedispatch(RecordedRequest request) + +
+          Returns a response to satisfy request.
+ SocketPolicypeekSocketPolicy() + +
+          Returns the socket policy of the next request.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Dispatcher

+
+public Dispatcher()
+
+
+ + + + + + + + +
+Method Detail
+ +

+dispatch

+
+public abstract MockResponse dispatch(RecordedRequest request)
+                               throws InterruptedException
+
+
Returns a response to satisfy request. This method may block (for + instance, to wait on a CountdownLatch). +

+

+ +
Throws: +
InterruptedException
+
+
+
+ +

+peekSocketPolicy

+
+public SocketPolicy peekSocketPolicy()
+
+
Returns the socket policy of the next request. Default implementation + returns SocketPolicy.KEEP_OPEN. Mischievous implementations can + return other values to test HTTP edge cases. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/MockResponse.html b/javadoc/com/google/mockwebserver/MockResponse.html new file mode 100644 index 000000000..5b4afa736 --- /dev/null +++ b/javadoc/com/google/mockwebserver/MockResponse.html @@ -0,0 +1,721 @@ + + + + + + + +MockResponse (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class MockResponse

+
+java.lang.Object
+  extended by com.google.mockwebserver.MockResponse
+
+
+
All Implemented Interfaces:
Cloneable
+
+
+
+
public final class MockResponse
extends Object
implements Cloneable
+ + +

+A scripted response to be replayed by the mock web server. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
MockResponse() + +
+          Creates a new mock response with an empty body.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ MockResponseaddHeader(String header) + +
+          Adds header as an HTTP header.
+ MockResponseaddHeader(String name, + Object value) + +
+          Adds a new header with the name and value.
+ MockResponseclearHeaders() + +
+          Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default.
+ MockResponseclone() + +
+           
+ byte[]getBody() + +
+          Returns the raw HTTP payload.
+ intgetBytesPerSecond() + +
+           
+ List<String>getHeaders() + +
+          Returns the HTTP headers, such as "Content-Length: 0".
+ SocketPolicygetSocketPolicy() + +
+           
+ StringgetStatus() + +
+          Returns the HTTP response line, such as "HTTP/1.1 200 OK".
+ MockResponseremoveHeader(String name) + +
+          Removes all headers named name.
+ MockResponsesetBody(byte[] body) + +
+           
+ MockResponsesetBody(String body) + +
+          Sets the response body to the UTF-8 encoded bytes of body.
+ MockResponsesetBytesPerSecond(int bytesPerSecond) + +
+          Set simulated network speed, in bytes per second.
+ MockResponsesetChunkedBody(byte[] body, + int maxChunkSize) + +
+          Sets the response body to body, chunked every maxChunkSize bytes.
+ MockResponsesetChunkedBody(String body, + int maxChunkSize) + +
+          Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes.
+ MockResponsesetHeader(String name, + Object value) + +
+          Removes all headers named name, then adds a new header with the + name and value.
+ MockResponsesetResponseCode(int code) + +
+           
+ MockResponsesetSocketPolicy(SocketPolicy socketPolicy) + +
+           
+ MockResponsesetStatus(String status) + +
+           
+ StringtoString() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+MockResponse

+
+public MockResponse()
+
+
Creates a new mock response with an empty body. +

+

+ + + + + + + + +
+Method Detail
+ +

+clone

+
+public MockResponse clone()
+
+
+
Overrides:
clone in class Object
+
+
+
+
+
+
+ +

+getStatus

+
+public String getStatus()
+
+
Returns the HTTP response line, such as "HTTP/1.1 200 OK". +

+

+
+
+
+
+
+
+
+ +

+setResponseCode

+
+public MockResponse setResponseCode(int code)
+
+
+
+
+
+
+
+
+
+ +

+setStatus

+
+public MockResponse setStatus(String status)
+
+
+
+
+
+
+
+
+
+ +

+getHeaders

+
+public List<String> getHeaders()
+
+
Returns the HTTP headers, such as "Content-Length: 0". +

+

+
+
+
+
+
+
+
+ +

+clearHeaders

+
+public MockResponse clearHeaders()
+
+
Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default. +

+

+
+
+
+
+
+
+
+ +

+addHeader

+
+public MockResponse addHeader(String header)
+
+
Adds header as an HTTP header. For well-formed HTTP header should contain a name followed by a colon and a value. +

+

+
+
+
+
+
+
+
+ +

+addHeader

+
+public MockResponse addHeader(String name,
+                              Object value)
+
+
Adds a new header with the name and value. This may be used to add + multiple headers with the same name. +

+

+
+
+
+
+
+
+
+ +

+setHeader

+
+public MockResponse setHeader(String name,
+                              Object value)
+
+
Removes all headers named name, then adds a new header with the + name and value. +

+

+
+
+
+
+
+
+
+ +

+removeHeader

+
+public MockResponse removeHeader(String name)
+
+
Removes all headers named name. +

+

+
+
+
+
+
+
+
+ +

+getBody

+
+public byte[] getBody()
+
+
Returns the raw HTTP payload. +

+

+
+
+
+
+
+
+
+ +

+setBody

+
+public MockResponse setBody(byte[] body)
+
+
+
+
+
+
+
+
+
+ +

+setBody

+
+public MockResponse setBody(String body)
+
+
Sets the response body to the UTF-8 encoded bytes of body. +

+

+
+
+
+
+
+
+
+ +

+setChunkedBody

+
+public MockResponse setChunkedBody(byte[] body,
+                                   int maxChunkSize)
+
+
Sets the response body to body, chunked every maxChunkSize bytes. +

+

+
+
+
+
+
+
+
+ +

+setChunkedBody

+
+public MockResponse setChunkedBody(String body,
+                                   int maxChunkSize)
+
+
Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes. +

+

+
+
+
+
+
+
+
+ +

+getSocketPolicy

+
+public SocketPolicy getSocketPolicy()
+
+
+
+
+
+
+
+
+
+ +

+setSocketPolicy

+
+public MockResponse setSocketPolicy(SocketPolicy socketPolicy)
+
+
+
+
+
+
+
+
+
+ +

+getBytesPerSecond

+
+public int getBytesPerSecond()
+
+
+
+
+
+
+
+
+
+ +

+setBytesPerSecond

+
+public MockResponse setBytesPerSecond(int bytesPerSecond)
+
+
Set simulated network speed, in bytes per second. This applies to the + response body only; response headers are not throttled. +

+

+
+
+
+
+
+
+
+ +

+toString

+
+public String toString()
+
+
+
Overrides:
toString in class Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/MockWebServer.html b/javadoc/com/google/mockwebserver/MockWebServer.html new file mode 100644 index 000000000..e312508f7 --- /dev/null +++ b/javadoc/com/google/mockwebserver/MockWebServer.html @@ -0,0 +1,557 @@ + + + + + + + +MockWebServer (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class MockWebServer

+
+java.lang.Object
+  extended by com.google.mockwebserver.MockWebServer
+
+
+
+
public final class MockWebServer
extends Object
+ + +

+A scriptable web server. Callers supply canned responses and the server + replays them upon request in sequence. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
MockWebServer() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidenqueue(MockResponse response) + +
+          Scripts response to be returned to a request made in sequence.
+ StringgetCookieDomain() + +
+          Returns a cookie domain for this server.
+ StringgetHostName() + +
+           
+ intgetPort() + +
+           
+ intgetRequestCount() + +
+          Returns the number of HTTP requests received thus far by this server.
+ URLgetUrl(String path) + +
+          Returns a URL for connecting to this server.
+ voidplay() + +
+          Equivalent to play(0).
+ voidplay(int port) + +
+          Starts the server, serves all enqueued requests, and shuts the server + down.
+ voidsetBodyLimit(int maxBodyLength) + +
+          Sets the number of bytes of the POST body to keep in memory to the given + limit.
+ voidsetDispatcher(Dispatcher dispatcher) + +
+          Sets the dispatcher used to match incoming requests to mock responses.
+ voidshutdown() + +
+           
+ RecordedRequesttakeRequest() + +
+          Awaits the next HTTP request, removes it, and returns it.
+ ProxytoProxyAddress() + +
+           
+ voiduseHttps(SSLSocketFactory sslSocketFactory, + boolean tunnelProxy) + +
+          Serve requests with HTTPS rather than otherwise.
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+MockWebServer

+
+public MockWebServer()
+
+
+ + + + + + + + +
+Method Detail
+ +

+getPort

+
+public int getPort()
+
+
+
+
+
+
+ +

+getHostName

+
+public String getHostName()
+
+
+
+
+
+
+ +

+toProxyAddress

+
+public Proxy toProxyAddress()
+
+
+
+
+
+
+ +

+getUrl

+
+public URL getUrl(String path)
+
+
Returns a URL for connecting to this server. +

+

+
Parameters:
path - the request path, such as "/".
+
+
+
+ +

+getCookieDomain

+
+public String getCookieDomain()
+
+
Returns a cookie domain for this server. This returns the server's + non-loopback host name if it is known. Otherwise this returns ".local" + for this server's loopback name. +

+

+
+
+
+
+ +

+setBodyLimit

+
+public void setBodyLimit(int maxBodyLength)
+
+
Sets the number of bytes of the POST body to keep in memory to the given + limit. +

+

+
+
+
+
+ +

+useHttps

+
+public void useHttps(SSLSocketFactory sslSocketFactory,
+                     boolean tunnelProxy)
+
+
Serve requests with HTTPS rather than otherwise. +

+

+
Parameters:
tunnelProxy - whether to expect the HTTP CONNECT method before + negotiating TLS.
+
+
+
+ +

+takeRequest

+
+public RecordedRequest takeRequest()
+                            throws InterruptedException
+
+
Awaits the next HTTP request, removes it, and returns it. Callers should + use this to verify the request sent was as intended. +

+

+ +
Throws: +
InterruptedException
+
+
+
+ +

+getRequestCount

+
+public int getRequestCount()
+
+
Returns the number of HTTP requests received thus far by this server. + This may exceed the number of HTTP connections when connection reuse is + in practice. +

+

+
+
+
+
+ +

+enqueue

+
+public void enqueue(MockResponse response)
+
+
Scripts response to be returned to a request made in sequence. + The first request is served by the first enqueued response; the second + request by the second enqueued response; and so on. +

+

+ +
Throws: +
ClassCastException - if the default dispatcher has been replaced + with setDispatcher(Dispatcher).
+
+
+
+ +

+play

+
+public void play()
+          throws IOException
+
+
Equivalent to play(0). +

+

+ +
Throws: +
IOException
+
+
+
+ +

+play

+
+public void play(int port)
+          throws IOException
+
+
Starts the server, serves all enqueued requests, and shuts the server + down. +

+

+
Parameters:
port - the port to listen to, or 0 for any available port. + Automated tests should always use port 0 to avoid flakiness when a + specific port is unavailable. +
Throws: +
IOException
+
+
+
+ +

+shutdown

+
+public void shutdown()
+              throws IOException
+
+
+ +
Throws: +
IOException
+
+
+
+ +

+setDispatcher

+
+public void setDispatcher(Dispatcher dispatcher)
+
+
Sets the dispatcher used to match incoming requests to mock responses. + The default dispatcher simply serves a fixed sequence of responses from + a queue; custom dispatchers can vary the + response based on timing or the content of the request. +

+

+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/RecordedRequest.html b/javadoc/com/google/mockwebserver/RecordedRequest.html new file mode 100644 index 000000000..62073f2c2 --- /dev/null +++ b/javadoc/com/google/mockwebserver/RecordedRequest.html @@ -0,0 +1,481 @@ + + + + + + + +RecordedRequest (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Class RecordedRequest

+
+java.lang.Object
+  extended by com.google.mockwebserver.RecordedRequest
+
+
+
+
public final class RecordedRequest
extends Object
+ + +

+An HTTP request that came into the mock web server. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ byte[]getBody() + +
+          Returns the body of this POST request.
+ intgetBodySize() + +
+          Returns the total size of the body of this POST request (before + truncation).
+ List<Integer>getChunkSizes() + +
+          Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked.
+ StringgetHeader(String name) + +
+          Returns the first header named name, or null if no such header + exists.
+ List<String>getHeaders() + +
+          Returns all headers.
+ List<String>getHeaders(String name) + +
+          Returns the headers named name.
+ StringgetMethod() + +
+           
+ StringgetPath() + +
+           
+ StringgetRequestLine() + +
+           
+ intgetSequenceNumber() + +
+          Returns the index of this request on its HTTP connection.
+ StringgetSslProtocol() + +
+          Returns the connection's SSL protocol like TLSv1, SSLv3, + NONE or null if the connection doesn't use SSL.
+ StringgetUtf8Body() + +
+          Returns the body of this POST request decoded as a UTF-8 string.
+ StringtoString() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Method Detail
+ +

+getRequestLine

+
+public String getRequestLine()
+
+
+
+
+
+
+ +

+getMethod

+
+public String getMethod()
+
+
+
+
+
+
+ +

+getPath

+
+public String getPath()
+
+
+
+
+
+
+ +

+getHeaders

+
+public List<String> getHeaders()
+
+
Returns all headers. +

+

+
+
+
+
+ +

+getHeader

+
+public String getHeader(String name)
+
+
Returns the first header named name, or null if no such header + exists. +

+

+
+
+
+
+ +

+getHeaders

+
+public List<String> getHeaders(String name)
+
+
Returns the headers named name. +

+

+
+
+
+
+ +

+getChunkSizes

+
+public List<Integer> getChunkSizes()
+
+
Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked. +

+

+
+
+
+
+ +

+getBodySize

+
+public int getBodySize()
+
+
Returns the total size of the body of this POST request (before + truncation). +

+

+
+
+
+
+ +

+getBody

+
+public byte[] getBody()
+
+
Returns the body of this POST request. This may be truncated. +

+

+
+
+
+
+ +

+getUtf8Body

+
+public String getUtf8Body()
+
+
Returns the body of this POST request decoded as a UTF-8 string. +

+

+
+
+
+
+ +

+getSequenceNumber

+
+public int getSequenceNumber()
+
+
Returns the index of this request on its HTTP connection. Since a single + HTTP connection may serve multiple requests, each request is assigned its + own sequence number. +

+

+
+
+
+
+ +

+getSslProtocol

+
+public String getSslProtocol()
+
+
Returns the connection's SSL protocol like TLSv1, SSLv3, + NONE or null if the connection doesn't use SSL. +

+

+
+
+
+
+ +

+toString

+
+public String toString()
+
+
+
Overrides:
toString in class Object
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/SocketPolicy.html b/javadoc/com/google/mockwebserver/SocketPolicy.html new file mode 100644 index 000000000..9ab677347 --- /dev/null +++ b/javadoc/com/google/mockwebserver/SocketPolicy.html @@ -0,0 +1,432 @@ + + + + + + + +SocketPolicy (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +com.google.mockwebserver +
+Enum SocketPolicy

+
+java.lang.Object
+  extended by java.lang.Enum<SocketPolicy>
+      extended by com.google.mockwebserver.SocketPolicy
+
+
+
All Implemented Interfaces:
Serializable, Comparable<SocketPolicy>
+
+
+
+
public enum SocketPolicy
extends Enum<SocketPolicy>
+ + +

+What should be done with the incoming socket. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Enum Constant Summary
DISCONNECT_AT_END + +
+          Close the socket after the response.
DISCONNECT_AT_START + +
+          Request immediate close of connection without even reading the + request.
FAIL_HANDSHAKE + +
+          Don't trust the client during the SSL handshake.
KEEP_OPEN + +
+          Keep the socket open after the response.
SHUTDOWN_INPUT_AT_END + +
+          Shutdown the socket input after sending the response.
SHUTDOWN_OUTPUT_AT_END + +
+          Shutdown the socket output after sending the response.
UPGRADE_TO_SSL_AT_END + +
+          Wrap the socket with SSL at the completion of this request/response + pair.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static SocketPolicyvalueOf(String name) + +
+          Returns the enum constant of this type with the specified name.
+static SocketPolicy[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+KEEP_OPEN

+
+public static final SocketPolicy KEEP_OPEN
+
+
Keep the socket open after the response. This is the default HTTP/1.1 + behavior. +

+

+
+
+
+ +

+DISCONNECT_AT_END

+
+public static final SocketPolicy DISCONNECT_AT_END
+
+
Close the socket after the response. This is the default HTTP/1.0 + behavior. +

+

+
+
+
+ +

+UPGRADE_TO_SSL_AT_END

+
+public static final SocketPolicy UPGRADE_TO_SSL_AT_END
+
+
Wrap the socket with SSL at the completion of this request/response + pair. Used for CONNECT messages to tunnel SSL over an HTTP proxy. +

+

+
+
+
+ +

+DISCONNECT_AT_START

+
+public static final SocketPolicy DISCONNECT_AT_START
+
+
Request immediate close of connection without even reading the + request. + +

Use to simulate the real life case of losing connection + because of bugger SSL server close connection when it seems + something like a compression method or TLS extension it doesn't + understand, instead of simply ignoring it like it should. +

+

+
+
+
+ +

+FAIL_HANDSHAKE

+
+public static final SocketPolicy FAIL_HANDSHAKE
+
+
Don't trust the client during the SSL handshake. +

+

+
+
+
+ +

+SHUTDOWN_INPUT_AT_END

+
+public static final SocketPolicy SHUTDOWN_INPUT_AT_END
+
+
Shutdown the socket input after sending the response. For testing bad + behavior. +

+

+
+
+
+ +

+SHUTDOWN_OUTPUT_AT_END

+
+public static final SocketPolicy SHUTDOWN_OUTPUT_AT_END
+
+
Shutdown the socket output after sending the response. For testing bad + behavior. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static SocketPolicy[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (SocketPolicy c : SocketPolicy.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static SocketPolicy valueOf(String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
IllegalArgumentException - if this enum type has no constant +with the specified name +
NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/Dispatcher.html b/javadoc/com/google/mockwebserver/class-use/Dispatcher.html new file mode 100644 index 000000000..282a84e2d --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/Dispatcher.html @@ -0,0 +1,166 @@ + + + + + + + +Uses of Class com.google.mockwebserver.Dispatcher (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.Dispatcher

+
+ + + + + +
+Uses of Dispatcher in com.google.mockwebserver
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver with parameters of type Dispatcher
+ voidMockWebServer.setDispatcher(Dispatcher dispatcher) + +
+          Sets the dispatcher used to match incoming requests to mock responses.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/MockResponse.html b/javadoc/com/google/mockwebserver/class-use/MockResponse.html new file mode 100644 index 000000000..563b32aff --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/MockResponse.html @@ -0,0 +1,301 @@ + + + + + + + +Uses of Class com.google.mockwebserver.MockResponse (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.MockResponse

+
+ + + + + +
+Uses of MockResponse in com.google.mockwebserver
+  +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Methods in com.google.mockwebserver that return MockResponse
+ MockResponseMockResponse.addHeader(String header) + +
+          Adds header as an HTTP header.
+ MockResponseMockResponse.addHeader(String name, + Object value) + +
+          Adds a new header with the name and value.
+ MockResponseMockResponse.clearHeaders() + +
+          Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default.
+ MockResponseMockResponse.clone() + +
+           
+abstract  MockResponseDispatcher.dispatch(RecordedRequest request) + +
+          Returns a response to satisfy request.
+ MockResponseMockResponse.removeHeader(String name) + +
+          Removes all headers named name.
+ MockResponseMockResponse.setBody(byte[] body) + +
+           
+ MockResponseMockResponse.setBody(String body) + +
+          Sets the response body to the UTF-8 encoded bytes of body.
+ MockResponseMockResponse.setBytesPerSecond(int bytesPerSecond) + +
+          Set simulated network speed, in bytes per second.
+ MockResponseMockResponse.setChunkedBody(byte[] body, + int maxChunkSize) + +
+          Sets the response body to body, chunked every maxChunkSize bytes.
+ MockResponseMockResponse.setChunkedBody(String body, + int maxChunkSize) + +
+          Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes.
+ MockResponseMockResponse.setHeader(String name, + Object value) + +
+          Removes all headers named name, then adds a new header with the + name and value.
+ MockResponseMockResponse.setResponseCode(int code) + +
+           
+ MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) + +
+           
+ MockResponseMockResponse.setStatus(String status) + +
+           
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver with parameters of type MockResponse
+ voidMockWebServer.enqueue(MockResponse response) + +
+          Scripts response to be returned to a request made in sequence.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/MockWebServer.html b/javadoc/com/google/mockwebserver/class-use/MockWebServer.html new file mode 100644 index 000000000..0797fcc22 --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/MockWebServer.html @@ -0,0 +1,143 @@ + + + + + + + +Uses of Class com.google.mockwebserver.MockWebServer (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.MockWebServer

+
+No usage of com.google.mockwebserver.MockWebServer +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html b/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html new file mode 100644 index 000000000..e2f264c17 --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html @@ -0,0 +1,182 @@ + + + + + + + +Uses of Class com.google.mockwebserver.RecordedRequest (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.RecordedRequest

+
+ + + + + +
+Uses of RecordedRequest in com.google.mockwebserver
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver that return RecordedRequest
+ RecordedRequestMockWebServer.takeRequest() + +
+          Awaits the next HTTP request, removes it, and returns it.
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver with parameters of type RecordedRequest
+abstract  MockResponseDispatcher.dispatch(RecordedRequest request) + +
+          Returns a response to satisfy request.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html b/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html new file mode 100644 index 000000000..4f9dd4887 --- /dev/null +++ b/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html @@ -0,0 +1,207 @@ + + + + + + + +Uses of Class com.google.mockwebserver.SocketPolicy (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
com.google.mockwebserver.SocketPolicy

+
+ + + + + +
+Uses of SocketPolicy in com.google.mockwebserver
+  +

+ + + + + + + + + + + + + + + + + + + + + +
Methods in com.google.mockwebserver that return SocketPolicy
+ SocketPolicyMockResponse.getSocketPolicy() + +
+           
+ SocketPolicyDispatcher.peekSocketPolicy() + +
+          Returns the socket policy of the next request.
+static SocketPolicySocketPolicy.valueOf(String name) + +
+          Returns the enum constant of this type with the specified name.
+static SocketPolicy[]SocketPolicy.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + +
Methods in com.google.mockwebserver with parameters of type SocketPolicy
+ MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) + +
+           
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/package-frame.html b/javadoc/com/google/mockwebserver/package-frame.html new file mode 100644 index 000000000..0f3f49e76 --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-frame.html @@ -0,0 +1,50 @@ + + + + + + + +com.google.mockwebserver (mockwebserver 20120819 API) + + + + + + + + + + + +com.google.mockwebserver + + + + +
+Classes  + +
+Dispatcher +
+MockResponse +
+MockWebServer +
+RecordedRequest
+ + + + + + +
+Enums  + +
+SocketPolicy
+ + + + diff --git a/javadoc/com/google/mockwebserver/package-summary.html b/javadoc/com/google/mockwebserver/package-summary.html new file mode 100644 index 000000000..9f05d8662 --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-summary.html @@ -0,0 +1,182 @@ + + + + + + + +com.google.mockwebserver (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package com.google.mockwebserver +

+ + + + + + + + + + + + + + + + + + + + + +
+Class Summary
DispatcherHandler for mock server requests.
MockResponseA scripted response to be replayed by the mock web server.
MockWebServerA scriptable web server.
RecordedRequestAn HTTP request that came into the mock web server.
+  + +

+ + + + + + + + + +
+Enum Summary
SocketPolicyWhat should be done with the incoming socket.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/package-tree.html b/javadoc/com/google/mockwebserver/package-tree.html new file mode 100644 index 000000000..f1ec41452 --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-tree.html @@ -0,0 +1,160 @@ + + + + + + + +com.google.mockwebserver Class Hierarchy (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package com.google.mockwebserver +

+
+

+Class Hierarchy +

+ +

+Enum Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/com/google/mockwebserver/package-use.html b/javadoc/com/google/mockwebserver/package-use.html new file mode 100644 index 000000000..ddc54e2e1 --- /dev/null +++ b/javadoc/com/google/mockwebserver/package-use.html @@ -0,0 +1,174 @@ + + + + + + + +Uses of Package com.google.mockwebserver (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Package
com.google.mockwebserver

+
+ + + + + + + + + + + + + + + + + +
+Classes in com.google.mockwebserver used by com.google.mockwebserver
Dispatcher + +
+          Handler for mock server requests.
MockResponse + +
+          A scripted response to be replayed by the mock web server.
RecordedRequest + +
+          An HTTP request that came into the mock web server.
SocketPolicy + +
+          What should be done with the incoming socket.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/constant-values.html b/javadoc/constant-values.html new file mode 100644 index 000000000..9dfb18e76 --- /dev/null +++ b/javadoc/constant-values.html @@ -0,0 +1,145 @@ + + + + + + + +Constant Field Values (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Constant Field Values

+
+
+Contents
    +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/deprecated-list.html b/javadoc/deprecated-list.html new file mode 100644 index 000000000..d54eb0bfa --- /dev/null +++ b/javadoc/deprecated-list.html @@ -0,0 +1,145 @@ + + + + + + + +Deprecated List (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Deprecated API

+
+
+Contents
    +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/help-doc.html b/javadoc/help-doc.html new file mode 100644 index 000000000..bb807f4ee --- /dev/null +++ b/javadoc/help-doc.html @@ -0,0 +1,216 @@ + + + + + + + +API Help (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+How This API Document Is Organized

+
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

+Package

+
+ +

+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    +
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
+
+

+Class/Interface

+
+ +

+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description +

    +

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary +

    +

  • Field Detail
  • Constructor Detail
  • Method Detail
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+ +

+Annotation Type

+
+ +

+Each annotation type has its own separate page with the following sections:

    +
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
+
+ +

+Enum

+
+ +

+Each enum has its own separate page with the following sections:

    +
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
+
+

+Use

+
+Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.
+

+Tree (Class Hierarchy)

+
+There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    +
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
+
+

+Deprecated API

+
+The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
+

+Index

+
+The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
+

+Prev/Next

+These links take you to the next or previous class, interface, package, or related page.

+Frames/No Frames

+These links show and hide the HTML frames. All pages are available with or without frames. +

+

+Serialized Form

+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. +

+

+Constant Field Values

+The Constant Field Values page lists the static final fields and their values. +

+ + +This help file applies to API documentation generated using the standard doclet. + +
+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/index-all.html b/javadoc/index-all.html new file mode 100644 index 000000000..2ead9bbfd --- /dev/null +++ b/javadoc/index-all.html @@ -0,0 +1,368 @@ + + + + + + + +Index (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G M P R S T U V
+

+A

+
+
addHeader(String) - +Method in class com.google.mockwebserver.MockResponse +
Adds header as an HTTP header. +
addHeader(String, Object) - +Method in class com.google.mockwebserver.MockResponse +
Adds a new header with the name and value. +
+
+

+C

+
+
clearHeaders() - +Method in class com.google.mockwebserver.MockResponse +
Removes all HTTP headers including any "Content-Length" and + "Transfer-encoding" headers that were added by default. +
clone() - +Method in class com.google.mockwebserver.MockResponse +
  +
com.google.mockwebserver - package com.google.mockwebserver
 
+
+

+D

+
+
dispatch(RecordedRequest) - +Method in class com.google.mockwebserver.Dispatcher +
Returns a response to satisfy request. +
Dispatcher - Class in com.google.mockwebserver
Handler for mock server requests.
Dispatcher() - +Constructor for class com.google.mockwebserver.Dispatcher +
  +
+
+

+E

+
+
enqueue(MockResponse) - +Method in class com.google.mockwebserver.MockWebServer +
Scripts response to be returned to a request made in sequence. +
+
+

+G

+
+
getBody() - +Method in class com.google.mockwebserver.MockResponse +
Returns the raw HTTP payload. +
getBody() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the body of this POST request. +
getBodySize() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the total size of the body of this POST request (before + truncation). +
getBytesPerSecond() - +Method in class com.google.mockwebserver.MockResponse +
  +
getChunkSizes() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the sizes of the chunks of this request's body, or an empty list + if the request's body was empty or unchunked. +
getCookieDomain() - +Method in class com.google.mockwebserver.MockWebServer +
Returns a cookie domain for this server. +
getHeader(String) - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the first header named name, or null if no such header + exists. +
getHeaders() - +Method in class com.google.mockwebserver.MockResponse +
Returns the HTTP headers, such as "Content-Length: 0". +
getHeaders() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns all headers. +
getHeaders(String) - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the headers named name. +
getHostName() - +Method in class com.google.mockwebserver.MockWebServer +
  +
getMethod() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getPath() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getPort() - +Method in class com.google.mockwebserver.MockWebServer +
  +
getRequestCount() - +Method in class com.google.mockwebserver.MockWebServer +
Returns the number of HTTP requests received thus far by this server. +
getRequestLine() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
getSequenceNumber() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the index of this request on its HTTP connection. +
getSocketPolicy() - +Method in class com.google.mockwebserver.MockResponse +
  +
getSslProtocol() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the connection's SSL protocol like TLSv1, SSLv3, + NONE or null if the connection doesn't use SSL. +
getStatus() - +Method in class com.google.mockwebserver.MockResponse +
Returns the HTTP response line, such as "HTTP/1.1 200 OK". +
getUrl(String) - +Method in class com.google.mockwebserver.MockWebServer +
Returns a URL for connecting to this server. +
getUtf8Body() - +Method in class com.google.mockwebserver.RecordedRequest +
Returns the body of this POST request decoded as a UTF-8 string. +
+
+

+M

+
+
MockResponse - Class in com.google.mockwebserver
A scripted response to be replayed by the mock web server.
MockResponse() - +Constructor for class com.google.mockwebserver.MockResponse +
Creates a new mock response with an empty body. +
MockWebServer - Class in com.google.mockwebserver
A scriptable web server.
MockWebServer() - +Constructor for class com.google.mockwebserver.MockWebServer +
  +
+
+

+P

+
+
peekSocketPolicy() - +Method in class com.google.mockwebserver.Dispatcher +
Returns the socket policy of the next request. +
play() - +Method in class com.google.mockwebserver.MockWebServer +
Equivalent to play(0). +
play(int) - +Method in class com.google.mockwebserver.MockWebServer +
Starts the server, serves all enqueued requests, and shuts the server + down. +
+
+

+R

+
+
RecordedRequest - Class in com.google.mockwebserver
An HTTP request that came into the mock web server.
removeHeader(String) - +Method in class com.google.mockwebserver.MockResponse +
Removes all headers named name. +
+
+

+S

+
+
setBody(byte[]) - +Method in class com.google.mockwebserver.MockResponse +
  +
setBody(String) - +Method in class com.google.mockwebserver.MockResponse +
Sets the response body to the UTF-8 encoded bytes of body. +
setBodyLimit(int) - +Method in class com.google.mockwebserver.MockWebServer +
Sets the number of bytes of the POST body to keep in memory to the given + limit. +
setBytesPerSecond(int) - +Method in class com.google.mockwebserver.MockResponse +
Set simulated network speed, in bytes per second. +
setChunkedBody(byte[], int) - +Method in class com.google.mockwebserver.MockResponse +
Sets the response body to body, chunked every maxChunkSize bytes. +
setChunkedBody(String, int) - +Method in class com.google.mockwebserver.MockResponse +
Sets the response body to the UTF-8 encoded bytes of body, + chunked every maxChunkSize bytes. +
setDispatcher(Dispatcher) - +Method in class com.google.mockwebserver.MockWebServer +
Sets the dispatcher used to match incoming requests to mock responses. +
setHeader(String, Object) - +Method in class com.google.mockwebserver.MockResponse +
Removes all headers named name, then adds a new header with the + name and value. +
setResponseCode(int) - +Method in class com.google.mockwebserver.MockResponse +
  +
setSocketPolicy(SocketPolicy) - +Method in class com.google.mockwebserver.MockResponse +
  +
setStatus(String) - +Method in class com.google.mockwebserver.MockResponse +
  +
shutdown() - +Method in class com.google.mockwebserver.MockWebServer +
  +
SocketPolicy - Enum in com.google.mockwebserver
What should be done with the incoming socket.
+
+

+T

+
+
takeRequest() - +Method in class com.google.mockwebserver.MockWebServer +
Awaits the next HTTP request, removes it, and returns it. +
toProxyAddress() - +Method in class com.google.mockwebserver.MockWebServer +
  +
toString() - +Method in class com.google.mockwebserver.MockResponse +
  +
toString() - +Method in class com.google.mockwebserver.RecordedRequest +
  +
+
+

+U

+
+
useHttps(SSLSocketFactory, boolean) - +Method in class com.google.mockwebserver.MockWebServer +
Serve requests with HTTPS rather than otherwise. +
+
+

+V

+
+
valueOf(String) - +Static method in enum com.google.mockwebserver.SocketPolicy +
Returns the enum constant of this type with the specified name. +
values() - +Static method in enum com.google.mockwebserver.SocketPolicy +
Returns an array containing the constants of this enum type, in +the order they are declared. +
+
+A C D E G M P R S T U V + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/index.html b/javadoc/index.html new file mode 100644 index 000000000..62d9e9ea4 --- /dev/null +++ b/javadoc/index.html @@ -0,0 +1,37 @@ + + + + + + + +mockwebserver 20120819 API + + + + + + + + +<H2> +Frame Alert</H2> + +<P> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<BR> +Link to<A HREF="com/google/mockwebserver/package-summary.html">Non-frame version.</A> + + + diff --git a/javadoc/overview-tree.html b/javadoc/overview-tree.html new file mode 100644 index 000000000..29d9491f3 --- /dev/null +++ b/javadoc/overview-tree.html @@ -0,0 +1,162 @@ + + + + + + + +Class Hierarchy (mockwebserver 20120819 API) + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For All Packages

+
+
+
Package Hierarchies:
com.google.mockwebserver
+
+

+Class Hierarchy +

+ +

+Enum Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+Copyright © 2011-2012. All Rights Reserved. + + diff --git a/javadoc/package-list b/javadoc/package-list new file mode 100644 index 000000000..89508e5d3 --- /dev/null +++ b/javadoc/package-list @@ -0,0 +1 @@ +com.google.mockwebserver diff --git a/javadoc/resources/inherit.gif b/javadoc/resources/inherit.gif new file mode 100644 index 0000000000000000000000000000000000000000..c814867a13deb0ca7ea2156c6ca1d5a03372af7e GIT binary patch literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X literal 0 HcmV?d00001 diff --git a/javadoc/stylesheet.css b/javadoc/stylesheet.css new file mode 100644 index 000000000..6ea9e5161 --- /dev/null +++ b/javadoc/stylesheet.css @@ -0,0 +1,29 @@ +/* Javadoc style sheet */ + +/* Define colors, fonts and other style attributes here to override the defaults */ + +/* Page background color */ +body { background-color: #FFFFFF; color:#000000 } + +/* Headings */ +h1 { font-size: 145% } + +/* Table colors */ +.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ +.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ +.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ + +/* Font used in left-hand frame lists */ +.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } + +/* Navigation bar fonts and colors */ +.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ +.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ +.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} +.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} + +.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} +.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} + From 3748484ffb160810d7f94c9f25c5566c210880ed Mon Sep 17 00:00:00 2001 From: edenman Date: Thu, 23 Aug 2012 03:05:56 +0000 Subject: [PATCH 25/43] Fix the DISCONNECT_AT_START logic git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@28 cf848351-439f-e86a-257f-67fa721851d5 --- .../google/mockwebserver/QueueDispatcher.java | 5 +++-- .../google/mockwebserver/MockWebServerTest.java | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/google/mockwebserver/QueueDispatcher.java b/src/main/java/com/google/mockwebserver/QueueDispatcher.java index 02f6cd4b0..be5a310b1 100644 --- a/src/main/java/com/google/mockwebserver/QueueDispatcher.java +++ b/src/main/java/com/google/mockwebserver/QueueDispatcher.java @@ -29,8 +29,9 @@ final class QueueDispatcher extends Dispatcher { public MockResponse dispatch(RecordedRequest request) throws InterruptedException { // to permit interactive/browser testing, ignore requests for favicons - if (request.getRequestLine().equals("GET /favicon.ico HTTP/1.1")) { - System.out.println("served " + request.getRequestLine()); + final String requestLine = request.getRequestLine(); + if (requestLine != null && requestLine.equals("GET /favicon.ico HTTP/1.1")) { + System.out.println("served " + requestLine); return new MockResponse() .setResponseCode(HttpURLConnection.HTTP_NOT_FOUND); } diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java index fbd4c2e44..6f54b89dc 100644 --- a/src/test/java/com/google/mockwebserver/MockWebServerTest.java +++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java @@ -16,6 +16,8 @@ package com.google.mockwebserver; +import junit.framework.TestCase; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -27,7 +29,6 @@ import java.net.URLConnection; import java.util.Arrays; import java.util.Collections; import java.util.List; -import junit.framework.TestCase; public final class MockWebServerTest extends TestCase { @@ -198,4 +199,17 @@ public final class MockWebServerTest extends TestCase { assertEquals(0, server.takeRequest().getSequenceNumber()); assertEquals(0, server.takeRequest().getSequenceNumber()); } + + public void testDisconnectAtStart() throws Exception { + server.enqueue(new MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AT_START)); + server.enqueue(new MockResponse()); // The jdk's HttpUrlConnection is a bastard. + server.enqueue(new MockResponse()); + server.play(); + try { + server.getUrl("/a").openConnection().getInputStream(); + } catch (IOException e) { + // Expected. + } + server.getUrl("/b").openConnection().getInputStream(); // Should succeed. + } } From ede853861795d04f787895365f9cebe9912ea37a Mon Sep 17 00:00:00 2001 From: edenman Date: Thu, 23 Aug 2012 03:29:42 +0000 Subject: [PATCH 26/43] Make QueueDispatcher overridable again. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@29 cf848351-439f-e86a-257f-67fa721851d5 --- src/main/java/com/google/mockwebserver/QueueDispatcher.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/mockwebserver/QueueDispatcher.java b/src/main/java/com/google/mockwebserver/QueueDispatcher.java index be5a310b1..7d77590c3 100644 --- a/src/main/java/com/google/mockwebserver/QueueDispatcher.java +++ b/src/main/java/com/google/mockwebserver/QueueDispatcher.java @@ -23,8 +23,8 @@ import java.util.concurrent.LinkedBlockingQueue; * Default dispatcher that processes a script of responses. Populate the script by calling * {@link #enqueueResponse(MockResponse)}. */ -final class QueueDispatcher extends Dispatcher { - private final BlockingQueue responseQueue +public class QueueDispatcher extends Dispatcher { + protected final BlockingQueue responseQueue = new LinkedBlockingQueue(); public MockResponse dispatch(RecordedRequest request) throws InterruptedException { From 1c13de7a344090349b1172978e82648f26fed0b7 Mon Sep 17 00:00:00 2001 From: edenman Date: Wed, 5 Sep 2012 18:33:05 +0000 Subject: [PATCH 27/43] Add a "fail fast" mode for QueueDispatcher git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@30 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- .../java/com/google/mockwebserver/QueueDispatcher.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 43924017c..5e7066148 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20120819 + 20120905 mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/QueueDispatcher.java b/src/main/java/com/google/mockwebserver/QueueDispatcher.java index 7d77590c3..b4397bc52 100644 --- a/src/main/java/com/google/mockwebserver/QueueDispatcher.java +++ b/src/main/java/com/google/mockwebserver/QueueDispatcher.java @@ -26,6 +26,7 @@ import java.util.concurrent.LinkedBlockingQueue; public class QueueDispatcher extends Dispatcher { protected final BlockingQueue responseQueue = new LinkedBlockingQueue(); + private boolean failFast; public MockResponse dispatch(RecordedRequest request) throws InterruptedException { // to permit interactive/browser testing, ignore requests for favicons @@ -36,6 +37,11 @@ public class QueueDispatcher extends Dispatcher { .setResponseCode(HttpURLConnection.HTTP_NOT_FOUND); } + if (failFast && responseQueue.peek() == null) { + // Fail fast if there's no response queued up. + return new MockResponse().setResponseCode(404); + } + return responseQueue.take(); } @@ -49,4 +55,8 @@ public class QueueDispatcher extends Dispatcher { public void enqueueResponse(MockResponse response) { responseQueue.add(response); } + + public void setFailFast(boolean failFast) { + this.failFast = failFast; + } } From dcd8bd8ef1366507b908fbfe5f92d4346f066820 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Sun, 11 Nov 2012 18:28:26 +0000 Subject: [PATCH 28/43] Make the fail fast response configurable. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@31 cf848351-439f-e86a-257f-67fa721851d5 --- .../google/mockwebserver/QueueDispatcher.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/google/mockwebserver/QueueDispatcher.java b/src/main/java/com/google/mockwebserver/QueueDispatcher.java index b4397bc52..2b242b00b 100644 --- a/src/main/java/com/google/mockwebserver/QueueDispatcher.java +++ b/src/main/java/com/google/mockwebserver/QueueDispatcher.java @@ -26,9 +26,9 @@ import java.util.concurrent.LinkedBlockingQueue; public class QueueDispatcher extends Dispatcher { protected final BlockingQueue responseQueue = new LinkedBlockingQueue(); - private boolean failFast; + private MockResponse failFastResponse; - public MockResponse dispatch(RecordedRequest request) throws InterruptedException { + @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException { // to permit interactive/browser testing, ignore requests for favicons final String requestLine = request.getRequestLine(); if (requestLine != null && requestLine.equals("GET /favicon.ico HTTP/1.1")) { @@ -37,18 +37,21 @@ public class QueueDispatcher extends Dispatcher { .setResponseCode(HttpURLConnection.HTTP_NOT_FOUND); } - if (failFast && responseQueue.peek() == null) { + if (failFastResponse != null && responseQueue.peek() == null) { // Fail fast if there's no response queued up. - return new MockResponse().setResponseCode(404); + return failFastResponse; } return responseQueue.take(); } - @Override - public SocketPolicy peekSocketPolicy() { - final MockResponse peek = responseQueue.peek(); - if (peek == null) return SocketPolicy.KEEP_OPEN; + @Override public SocketPolicy peekSocketPolicy() { + MockResponse peek = responseQueue.peek(); + if (peek == null) { + return failFastResponse != null + ? failFastResponse.getSocketPolicy() + : SocketPolicy.KEEP_OPEN; + } return peek.getSocketPolicy(); } @@ -57,6 +60,13 @@ public class QueueDispatcher extends Dispatcher { } public void setFailFast(boolean failFast) { - this.failFast = failFast; + MockResponse failFastResponse = failFast + ? new MockResponse().setResponseCode(HttpURLConnection.HTTP_NOT_FOUND) + : null; + setFailFast(failFastResponse); + } + + public void setFailFast(MockResponse failFastResponse) { + this.failFastResponse = failFastResponse; } } From 1a3817c8c95ba79ea57fa511a6f1241a30963ffe Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Sun, 11 Nov 2012 18:29:14 +0000 Subject: [PATCH 29/43] Cut a 20121111 release. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@32 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5e7066148..233effd5c 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20120905 + 20121111 mockwebserver http://code.google.com/p/mockwebserver From 0d0e03b0859a200ea3da258bfe24a1f732659d6b Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Tue, 22 Jan 2013 15:41:08 +0000 Subject: [PATCH 30/43] Make the RecordedRequest constructor public. This is part of a longer change that will add a mock SPDY server. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@33 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- src/main/java/com/google/mockwebserver/RecordedRequest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 233effd5c..52650bfa6 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20121111 + 20130122 mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/RecordedRequest.java b/src/main/java/com/google/mockwebserver/RecordedRequest.java index d28e74286..2864d802f 100644 --- a/src/main/java/com/google/mockwebserver/RecordedRequest.java +++ b/src/main/java/com/google/mockwebserver/RecordedRequest.java @@ -36,7 +36,7 @@ public final class RecordedRequest { private final int sequenceNumber; private final String sslProtocol; - RecordedRequest(String requestLine, List headers, List chunkSizes, + public RecordedRequest(String requestLine, List headers, List chunkSizes, int bodySize, byte[] body, int sequenceNumber, Socket socket) { this.requestLine = requestLine; this.headers = headers; From a9311208f9a130216f5c8ff4dee106a945e0a8d2 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Fri, 1 Feb 2013 17:00:49 +0000 Subject: [PATCH 31/43] Dispatch FAIL_HANDSHAKE requests before causing the failure. Otherwise we have a race where the client may retry and peek the same socket policy when it should have been consumed. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@34 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- src/main/java/com/google/mockwebserver/MockWebServer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 52650bfa6..1f381991e 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20130122 + 20130201 mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index e94b37778..84d90b377 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -270,6 +270,7 @@ public final class MockWebServer { } final SocketPolicy socketPolicy = dispatcher.peekSocketPolicy(); if (socketPolicy == FAIL_HANDSHAKE) { + dispatchBookkeepingRequest(sequenceNumber, raw); processHandshakeFailure(raw, sequenceNumber++); return; } @@ -367,7 +368,6 @@ public final class MockWebServer { } catch (IOException expected) { } socket.close(); - dispatchBookkeepingRequest(sequenceNumber, socket); } private void dispatchBookkeepingRequest(int sequenceNumber, Socket socket) throws InterruptedException { From aec268f46cff2a5a298a353cec0cc9403226e339 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Sun, 3 Mar 2013 14:29:21 +0000 Subject: [PATCH 32/43] Let tests provide raw InputStream bodies. Original AOSP change by Jeff Sharkey: This enables testing of large files, such as those beyond the 2GB boundary. Also switches to streaming in MTU-sized chunks. Bug: 8209169 Change-Id: Iab6b299c13a3d67bbbaa80a9e5bc563ef6cf9302 This modifies Jeff's change to permit empty bodies, and to remove the getBody() accessor. Since reading the body is now destructive, that accessor must be removed! git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@35 cf848351-439f-e86a-257f-67fa721851d5 --- .../google/mockwebserver/MockResponse.java | 34 ++++++++++++++----- .../google/mockwebserver/MockWebServer.java | 34 +++++++++++++------ .../mockwebserver/MockWebServerTest.java | 11 +++--- 3 files changed, 56 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/google/mockwebserver/MockResponse.java b/src/main/java/com/google/mockwebserver/MockResponse.java index bcc693810..64e4e13fc 100644 --- a/src/main/java/com/google/mockwebserver/MockResponse.java +++ b/src/main/java/com/google/mockwebserver/MockResponse.java @@ -16,26 +16,27 @@ package com.google.mockwebserver; +import static com.google.mockwebserver.MockWebServer.ASCII; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import static com.google.mockwebserver.MockWebServer.ASCII; - /** * A scripted response to be replayed by the mock web server. */ public final class MockResponse implements Cloneable { private static final String EMPTY_BODY_HEADER = "Content-Length: 0"; private static final String CHUNKED_BODY_HEADER = "Transfer-encoding: chunked"; - private static final byte[] EMPTY_BODY = new byte[0]; private String status = "HTTP/1.1 200 OK"; private List headers = new ArrayList(); - private byte[] body = EMPTY_BODY; + private InputStream body; + private long bodyLength; private int bytesPerSecond = Integer.MAX_VALUE; private SocketPolicy socketPolicy = SocketPolicy.KEEP_OPEN; @@ -130,18 +131,30 @@ public final class MockResponse implements Cloneable { } /** - * Returns the raw HTTP payload. + * Returns an input stream containing the raw HTTP payload. */ - public byte[] getBody() { + InputStream getBodyStream() { return body; } + /** + * Returns length of raw HTTP payload. + */ + public long getBodyLength() { + return bodyLength; + } + public MockResponse setBody(byte[] body) { - if (this.body == EMPTY_BODY) { + return setBody(new ByteArrayInputStream(body), body.length); + } + + public MockResponse setBody(InputStream body, long bodyLength) { + if (this.body == null) { headers.remove(EMPTY_BODY_HEADER); } - this.headers.add("Content-Length: " + body.length); + this.headers.add("Content-Length: " + bodyLength); this.body = body; + this.bodyLength = bodyLength; return this; } @@ -176,7 +189,10 @@ public final class MockResponse implements Cloneable { pos += chunkSize; } bytesOut.write("0\r\n\r\n".getBytes(ASCII)); // last chunk + empty trailer + crlf - this.body = bytesOut.toByteArray(); + + body = bytesOut.toByteArray(); + this.body = new ByteArrayInputStream(body); + this.bodyLength = body.length; return this; } catch (IOException e) { throw new AssertionError(); // In-memory I/O doesn't throw IOExceptions. diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 84d90b377..141c523a5 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -16,6 +16,8 @@ package com.google.mockwebserver; +import static com.google.mockwebserver.SocketPolicy.DISCONNECT_AT_START; +import static com.google.mockwebserver.SocketPolicy.FAIL_HANDSHAKE; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; @@ -51,9 +53,6 @@ import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; -import static com.google.mockwebserver.SocketPolicy.DISCONNECT_AT_START; -import static com.google.mockwebserver.SocketPolicy.FAIL_HANDSHAKE; - /** * A scriptable web server. Callers supply canned responses and the server * replays them upon request in sequence. @@ -452,17 +451,32 @@ public final class MockWebServer { out.write(("\r\n").getBytes(ASCII)); out.flush(); - byte[] body = response.getBody(); - int bytesPerSecond = response.getBytesPerSecond(); + final InputStream in = response.getBodyStream(); + if (in == null) { + return; + } + final int bytesPerSecond = response.getBytesPerSecond(); - for (int offset = 0; offset < body.length; offset += bytesPerSecond) { - int count = Math.min(body.length - offset, bytesPerSecond); - out.write(body, offset, count); + // Stream data in MTU-sized increments + final byte[] buffer = new byte[1452]; + final long delayMs; + if (bytesPerSecond == Integer.MAX_VALUE) { + delayMs = 0; + } else { + delayMs = (1000 * buffer.length) / bytesPerSecond; + } + + int read; + long sinceDelay = 0; + while ((read = in.read(buffer)) != -1) { + out.write(buffer, 0, read); out.flush(); - if (offset + count < body.length) { + sinceDelay += read; + if (sinceDelay >= buffer.length && delayMs > 0) { + sinceDelay %= buffer.length; try { - Thread.sleep(1000); + Thread.sleep(delayMs); } catch (InterruptedException e) { throw new AssertionError(); } diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java index 6f54b89dc..a910e8c67 100644 --- a/src/test/java/com/google/mockwebserver/MockWebServerTest.java +++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java @@ -16,8 +16,6 @@ package com.google.mockwebserver; -import junit.framework.TestCase; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -29,6 +27,7 @@ import java.net.URLConnection; import java.util.Arrays; import java.util.Collections; import java.util.List; +import junit.framework.TestCase; public final class MockWebServerTest extends TestCase { @@ -66,10 +65,14 @@ public final class MockWebServerTest extends TestCase { assertEquals("HTTP/1.1 200 OK", response.getStatus()); } - public void testSetBodyAdjustsHeaders() { + public void testSetBodyAdjustsHeaders() throws IOException { MockResponse response = new MockResponse().setBody("ABC"); assertEquals(Arrays.asList("Content-Length: 3"), response.getHeaders()); - assertTrue(Arrays.equals(response.getBody(), new byte[] { 'A', 'B', 'C' })); + InputStream in = response.getBodyStream(); + assertEquals('A', in.read()); + assertEquals('B', in.read()); + assertEquals('C', in.read()); + assertEquals(-1, in.read()); assertEquals("HTTP/1.1 200 OK", response.getStatus()); } From 00d39e07e32a95bbd212cae93efa3110ef0ea8cf Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Sun, 3 Mar 2013 14:40:41 +0000 Subject: [PATCH 33/43] Don't fail if a POST or PUT request is missing a body. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@36 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- src/main/java/com/google/mockwebserver/MockWebServer.java | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 1f381991e..fa255d699 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20130201 + 20130303 mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 141c523a5..1024d530a 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -431,11 +431,7 @@ public final class MockWebServer { if (hasBody) { throw new IllegalArgumentException("Request must not have a body: " + request); } - } else if (request.startsWith("POST ") || request.startsWith("PUT ")) { - if (!hasBody) { - throw new IllegalArgumentException("Request must have a body: " + request); - } - } else { + } else if (!request.startsWith("POST ") && !request.startsWith("PUT ")) { throw new UnsupportedOperationException("Unexpected method: " + request); } From 1a0531845e49a5d5a76fab59398b16348971142d Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Wed, 3 Apr 2013 02:01:45 +0000 Subject: [PATCH 34/43] Clean up streaming response bodies. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@37 cf848351-439f-e86a-257f-67fa721851d5 --- .../google/mockwebserver/MockResponse.java | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/google/mockwebserver/MockResponse.java b/src/main/java/com/google/mockwebserver/MockResponse.java index 64e4e13fc..8d89bf103 100644 --- a/src/main/java/com/google/mockwebserver/MockResponse.java +++ b/src/main/java/com/google/mockwebserver/MockResponse.java @@ -30,13 +30,16 @@ import java.util.List; * A scripted response to be replayed by the mock web server. */ public final class MockResponse implements Cloneable { - private static final String EMPTY_BODY_HEADER = "Content-Length: 0"; private static final String CHUNKED_BODY_HEADER = "Transfer-encoding: chunked"; private String status = "HTTP/1.1 200 OK"; private List headers = new ArrayList(); - private InputStream body; - private long bodyLength; + + /** The response body content, or null if {@code bodyStream} is set. */ + private byte[] body; + /** The response body content, or null if {@code body} is set. */ + private InputStream bodyStream; + private int bytesPerSecond = Integer.MAX_VALUE; private SocketPolicy socketPolicy = SocketPolicy.KEEP_OPEN; @@ -44,7 +47,7 @@ public final class MockResponse implements Cloneable { * Creates a new mock response with an empty body. */ public MockResponse() { - headers.add(EMPTY_BODY_HEADER); + setBody(new byte[0]); } @Override public MockResponse clone() { @@ -134,27 +137,20 @@ public final class MockResponse implements Cloneable { * Returns an input stream containing the raw HTTP payload. */ InputStream getBodyStream() { - return body; - } - - /** - * Returns length of raw HTTP payload. - */ - public long getBodyLength() { - return bodyLength; + return bodyStream != null ? bodyStream : new ByteArrayInputStream(body); } public MockResponse setBody(byte[] body) { - return setBody(new ByteArrayInputStream(body), body.length); + setHeader("Content-Length", body.length); + this.body = body; + this.bodyStream = null; + return this; } - public MockResponse setBody(InputStream body, long bodyLength) { - if (this.body == null) { - headers.remove(EMPTY_BODY_HEADER); - } - this.headers.add("Content-Length: " + bodyLength); - this.body = body; - this.bodyLength = bodyLength; + public MockResponse setBody(InputStream bodyStream, long bodyLength) { + setHeader("Content-Length", bodyLength); + this.body = null; + this.bodyStream = bodyStream; return this; } @@ -174,7 +170,7 @@ public final class MockResponse implements Cloneable { * maxChunkSize} bytes. */ public MockResponse setChunkedBody(byte[] body, int maxChunkSize) { - headers.remove(EMPTY_BODY_HEADER); + removeHeader("Content-Length"); headers.add(CHUNKED_BODY_HEADER); try { @@ -190,9 +186,7 @@ public final class MockResponse implements Cloneable { } bytesOut.write("0\r\n\r\n".getBytes(ASCII)); // last chunk + empty trailer + crlf - body = bytesOut.toByteArray(); - this.body = new ByteArrayInputStream(body); - this.bodyLength = body.length; + this.body = bytesOut.toByteArray(); return this; } catch (IOException e) { throw new AssertionError(); // In-memory I/O doesn't throw IOExceptions. From 2eb0cdd8b39551475520eb5e9fce5f72abb40dbc Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Wed, 3 Apr 2013 02:04:20 +0000 Subject: [PATCH 35/43] Test case for streaming response body. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@38 cf848351-439f-e86a-257f-67fa721851d5 --- .../google/mockwebserver/MockWebServerTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java index a910e8c67..e3b57daa6 100644 --- a/src/test/java/com/google/mockwebserver/MockWebServerTest.java +++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java @@ -17,6 +17,7 @@ package com.google.mockwebserver; import java.io.BufferedReader; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -215,4 +216,17 @@ public final class MockWebServerTest extends TestCase { } server.getUrl("/b").openConnection().getInputStream(); // Should succeed. } + + public void testStreamingResponseBody() throws Exception { + InputStream responseBody = new ByteArrayInputStream("ABC".getBytes("UTF-8")); + server.enqueue(new MockResponse().setBody(responseBody, 3)); + server.play(); + + InputStream in = server.getUrl("/").openConnection().getInputStream(); + assertEquals('A', in.read()); + assertEquals('B', in.read()); + assertEquals('C', in.read()); + + assertEquals(-1, responseBody.read()); // The body is exhausted. + } } From 0c075085b1da333eb5e43218aae0ca0fa543fed9 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Wed, 3 Apr 2013 13:44:29 +0000 Subject: [PATCH 36/43] Restore getBody(). git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@39 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- src/main/java/com/google/mockwebserver/MockResponse.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fa255d699..4b1d00661 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20130303 + 20130403 mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/MockResponse.java b/src/main/java/com/google/mockwebserver/MockResponse.java index 8d89bf103..936e9fd8c 100644 --- a/src/main/java/com/google/mockwebserver/MockResponse.java +++ b/src/main/java/com/google/mockwebserver/MockResponse.java @@ -133,6 +133,13 @@ public final class MockResponse implements Cloneable { return this; } + /** + * Returns the raw HTTP payload, or null if this response is streamed. + */ + public byte[] getBody() { + return body; + } + /** * Returns an input stream containing the raw HTTP payload. */ From e218ed8cdcc9f0b9a1001f19da38406b200ad863 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Wed, 3 Apr 2013 18:03:09 +0000 Subject: [PATCH 37/43] Be consistent around formatting. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@40 cf848351-439f-e86a-257f-67fa721851d5 --- .../google/mockwebserver/MockResponse.java | 2 +- .../google/mockwebserver/MockWebServer.java | 2 +- .../google/mockwebserver/QueueDispatcher.java | 16 ++++++++-------- .../mockwebserver/CustomDispatcherTest.java | 19 +++++++++---------- .../mockwebserver/MockWebServerTest.java | 2 +- 5 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/google/mockwebserver/MockResponse.java b/src/main/java/com/google/mockwebserver/MockResponse.java index 936e9fd8c..674a91165 100644 --- a/src/main/java/com/google/mockwebserver/MockResponse.java +++ b/src/main/java/com/google/mockwebserver/MockResponse.java @@ -124,7 +124,7 @@ public final class MockResponse implements Cloneable { */ public MockResponse removeHeader(String name) { name += ":"; - for (Iterator i = headers.iterator(); i.hasNext();) { + for (Iterator i = headers.iterator(); i.hasNext(); ) { String header = i.next(); if (name.regionMatches(true, 0, header, 0, name.length())) { i.remove(); diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 1024d530a..9a8991215 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -427,7 +427,7 @@ public final class MockWebServer { if (request.startsWith("OPTIONS ") || request.startsWith("GET ") || request.startsWith("HEAD ") || request.startsWith("DELETE ") - || request .startsWith("TRACE ") || request.startsWith("CONNECT ")) { + || request.startsWith("TRACE ") || request.startsWith("CONNECT ")) { if (hasBody) { throw new IllegalArgumentException("Request must not have a body: " + request); } diff --git a/src/main/java/com/google/mockwebserver/QueueDispatcher.java b/src/main/java/com/google/mockwebserver/QueueDispatcher.java index 2b242b00b..bc2669429 100644 --- a/src/main/java/com/google/mockwebserver/QueueDispatcher.java +++ b/src/main/java/com/google/mockwebserver/QueueDispatcher.java @@ -28,7 +28,7 @@ public class QueueDispatcher extends Dispatcher { = new LinkedBlockingQueue(); private MockResponse failFastResponse; - @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException { + @Override public MockResponse dispatch(RecordedRequest request) throws InterruptedException { // to permit interactive/browser testing, ignore requests for favicons final String requestLine = request.getRequestLine(); if (requestLine != null && requestLine.equals("GET /favicon.ico HTTP/1.1")) { @@ -48,9 +48,9 @@ public class QueueDispatcher extends Dispatcher { @Override public SocketPolicy peekSocketPolicy() { MockResponse peek = responseQueue.peek(); if (peek == null) { - return failFastResponse != null - ? failFastResponse.getSocketPolicy() - : SocketPolicy.KEEP_OPEN; + return failFastResponse != null + ? failFastResponse.getSocketPolicy() + : SocketPolicy.KEEP_OPEN; } return peek.getSocketPolicy(); } @@ -60,10 +60,10 @@ public class QueueDispatcher extends Dispatcher { } public void setFailFast(boolean failFast) { - MockResponse failFastResponse = failFast - ? new MockResponse().setResponseCode(HttpURLConnection.HTTP_NOT_FOUND) - : null; - setFailFast(failFastResponse); + MockResponse failFastResponse = failFast + ? new MockResponse().setResponseCode(HttpURLConnection.HTTP_NOT_FOUND) + : null; + setFailFast(failFastResponse); } public void setFailFast(MockResponse failFastResponse) { diff --git a/src/test/java/com/google/mockwebserver/CustomDispatcherTest.java b/src/test/java/com/google/mockwebserver/CustomDispatcherTest.java index a8f8ac524..e75b9021f 100644 --- a/src/test/java/com/google/mockwebserver/CustomDispatcherTest.java +++ b/src/test/java/com/google/mockwebserver/CustomDispatcherTest.java @@ -85,17 +85,16 @@ public class CustomDispatcherTest extends TestCase { private Thread buildRequestThread(final String path, final AtomicInteger responseCode) { return new Thread(new Runnable() { - @Override - public void run() { - final URL url = mockWebServer.getUrl(path); - final HttpURLConnection conn; - try { - conn = (HttpURLConnection) url.openConnection(); - responseCode.set(conn.getResponseCode()); // Force the connection to hit the "server". - } catch (IOException e) { - } + @Override public void run() { + final URL url = mockWebServer.getUrl(path); + final HttpURLConnection conn; + try { + conn = (HttpURLConnection) url.openConnection(); + responseCode.set(conn.getResponseCode()); // Force the connection to hit the "server". + } catch (IOException e) { } - }); + } + }); } } diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java index e3b57daa6..a8d53319a 100644 --- a/src/test/java/com/google/mockwebserver/MockWebServerTest.java +++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java @@ -49,7 +49,7 @@ public final class MockWebServerTest extends TestCase { "X-Whitespace: both " ); List chunkSizes = Collections.emptyList(); - byte[] body = { 'A', 'B', 'C' }; + byte[] body = {'A', 'B', 'C'}; String requestLine = "GET / HTTP/1.1"; RecordedRequest request = new RecordedRequest( requestLine, headers, chunkSizes, body.length, body, 0, null); From 7f58c97ab215e9fa18762d3b66e4e2d427402858 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Tue, 16 Apr 2013 01:07:12 +0000 Subject: [PATCH 38/43] Fix bug: Zero-length PUT with Expect 100-continue hangs Code authored by adrian.f.cole, see issue 8 https://code.google.com/p/mockwebserver/issues/detail?id=8#c12 Fixes issue 8. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@41 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 9 +++ .../google/mockwebserver/MockWebServer.java | 18 +++++- .../mockwebserver/MockWebServerTest.java | 57 +++++++++++++++++++ 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 4b1d00661..182d2c3ea 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,15 @@ 1.6 + + org.apache.maven.plugins + maven-surefire-plugin + + + true + + + org.apache.maven.plugins maven-source-plugin diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 9a8991215..0a02dff84 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -87,7 +87,7 @@ public final class MockWebServer { try { return InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e) { - throw new AssertionError(); + throw new AssertionError(e); } } @@ -320,7 +320,7 @@ public final class MockWebServer { */ private boolean processOneRequest(Socket socket, InputStream in, OutputStream out) throws IOException, InterruptedException { - RecordedRequest request = readRequest(socket, in, sequenceNumber); + RecordedRequest request = readRequest(socket, in, out, sequenceNumber); if (request == null) { return false; } @@ -377,7 +377,7 @@ public final class MockWebServer { /** * @param sequenceNumber the index of this request on this connection. */ - private RecordedRequest readRequest(Socket socket, InputStream in, int sequenceNumber) + private RecordedRequest readRequest(Socket socket, InputStream in, OutputStream out, int sequenceNumber) throws IOException { String request; try { @@ -392,6 +392,7 @@ public final class MockWebServer { List headers = new ArrayList(); int contentLength = -1; boolean chunked = false; + boolean expectContinue = false; String header; while ((header = readAsciiUntilCrlf(in)).length() != 0) { headers.add(header); @@ -403,6 +404,17 @@ public final class MockWebServer { lowercaseHeader.substring(18).trim().equals("chunked")) { chunked = true; } + if (lowercaseHeader.startsWith("expect:") && + lowercaseHeader.substring(7).trim().equals("100-continue")) { + expectContinue = true; + } + } + + if (expectContinue) { + out.write(("HTTP/1.1 100 Continue\r\n").getBytes(ASCII)); + out.write(("Content-Length: 0\r\n").getBytes(ASCII)); + out.write(("\r\n").getBytes(ASCII)); + out.flush(); } boolean hasBody = false; diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/src/test/java/com/google/mockwebserver/MockWebServerTest.java index a8d53319a..5e6241486 100644 --- a/src/test/java/com/google/mockwebserver/MockWebServerTest.java +++ b/src/test/java/com/google/mockwebserver/MockWebServerTest.java @@ -97,6 +97,63 @@ public final class MockWebServerTest extends TestCase { response.getHeaders()); } + /** + * Clients who adhere to 100 + * Status expect the server to send an interim response with status code + * 100 before they send their payload. + * + *

Note

+ * + * JRE 6 only passes this test if + * {@code -Dsun.net.http.allowRestrictedHeaders=true} is set. + */ + public void testExpect100ContinueWithBody() throws Exception { + server.enqueue(new MockResponse()); + server.play(); + + URL url = server.getUrl("/"); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("PUT"); + connection.setAllowUserInteraction(false); + connection.setRequestProperty("Expect", "100-continue"); + connection.setDoOutput(true); + connection.getOutputStream().write("hello".getBytes()); + assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode()); + + assertEquals(server.getRequestCount(), 1); + RecordedRequest request = server.takeRequest(); + assertEquals(request.getRequestLine(), "PUT / HTTP/1.1"); + assertEquals("5", request.getHeader("Content-Length")); + assertEquals(5, request.getBodySize()); + assertEquals("hello", new String(request.getBody())); + // below fails on JRE 6 unless -Dsun.net.http.allowRestrictedHeaders=true is set + assertEquals("100-continue", request.getHeader("Expect")); + } + + public void testExpect100ContinueWithNoBody() throws Exception { + server.enqueue(new MockResponse()); + server.play(); + + URL url = server.getUrl("/"); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("PUT"); + connection.setAllowUserInteraction(false); + connection.setRequestProperty("Expect", "100-continue"); + connection.setRequestProperty("Content-Length", "0"); + connection.setDoOutput(true); + connection.setFixedLengthStreamingMode(0); + assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode()); + + assertEquals(server.getRequestCount(), 1); + RecordedRequest request = server.takeRequest(); + assertEquals(request.getRequestLine(), "PUT / HTTP/1.1"); + assertEquals("0", request.getHeader("Content-Length")); + assertEquals(0, request.getBodySize()); + // below fails on JRE 6 unless -Dsun.net.http.allowRestrictedHeaders=true is set + assertEquals("100-continue", request.getHeader("Expect")); + } + public void testRegularResponse() throws Exception { server.enqueue(new MockResponse().setBody("hello world")); server.play(); From 4546383a2c54db3c4b2aa0e42c41c0d6b55a52df Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Sun, 5 May 2013 13:59:43 +0000 Subject: [PATCH 39/43] Write at least a packet per second. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@42 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- src/main/java/com/google/mockwebserver/MockWebServer.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 182d2c3ea..4c6e64c5c 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20130403 + 20130505 mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 0a02dff84..356728410 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -465,8 +465,10 @@ public final class MockWebServer { } final int bytesPerSecond = response.getBytesPerSecond(); - // Stream data in MTU-sized increments - final byte[] buffer = new byte[1452]; + // Stream data in MTU-sized increments, with a minimum of one packet per second. + final byte[] buffer = bytesPerSecond >= 1452 + ? new byte[1452] + : new byte[bytesPerSecond]; final long delayMs; if (bytesPerSecond == Integer.MAX_VALUE) { delayMs = 0; From a67797405d43e313cebeac1b085388e28cbe2199 Mon Sep 17 00:00:00 2001 From: "bdc@google.com" Date: Mon, 6 May 2013 21:20:37 +0000 Subject: [PATCH 40/43] Do not allow MockWebServer to be played more than once git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@43 cf848351-439f-e86a-257f-67fa721851d5 --- src/main/java/com/google/mockwebserver/MockWebServer.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 356728410..0491eebc8 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -184,6 +184,9 @@ public final class MockWebServer { * specific port is unavailable. */ public void play(int port) throws IOException { + if (executor != null) { + throw new IllegalStateException("play() already called"); + } executor = Executors.newCachedThreadPool(); serverSocket = new ServerSocket(port); serverSocket.setReuseAddress(true); From a43db05b64bcd59518f3b34b3e8c61db98597096 Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Fri, 5 Jul 2013 22:00:23 +0000 Subject: [PATCH 41/43] Support requests greater than 2 GiB git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@44 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- src/main/java/com/google/mockwebserver/MockWebServer.java | 2 +- src/main/java/com/google/mockwebserver/RecordedRequest.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 4c6e64c5c..3a8d6bc37 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20130505 + 20130705 mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 0491eebc8..999beb4f6 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -556,7 +556,7 @@ public final class MockWebServer { * An output stream that drops data after bodyLimit bytes. */ private class TruncatingOutputStream extends ByteArrayOutputStream { - private int numBytesReceived = 0; + private long numBytesReceived = 0; @Override public void write(byte[] buffer, int offset, int len) { numBytesReceived += len; super.write(buffer, offset, Math.min(len, bodyLimit - count)); diff --git a/src/main/java/com/google/mockwebserver/RecordedRequest.java b/src/main/java/com/google/mockwebserver/RecordedRequest.java index 2864d802f..ba83416b0 100644 --- a/src/main/java/com/google/mockwebserver/RecordedRequest.java +++ b/src/main/java/com/google/mockwebserver/RecordedRequest.java @@ -31,13 +31,13 @@ public final class RecordedRequest { private final String path; private final List headers; private final List chunkSizes; - private final int bodySize; + private final long bodySize; private final byte[] body; private final int sequenceNumber; private final String sslProtocol; public RecordedRequest(String requestLine, List headers, List chunkSizes, - int bodySize, byte[] body, int sequenceNumber, Socket socket) { + long bodySize, byte[] body, int sequenceNumber, Socket socket) { this.requestLine = requestLine; this.headers = headers; this.chunkSizes = chunkSizes; @@ -122,7 +122,7 @@ public final class RecordedRequest { * Returns the total size of the body of this POST request (before * truncation). */ - public int getBodySize() { + public long getBodySize() { return bodySize; } From 76275fc9733168320d9472b8982c7d38956058fb Mon Sep 17 00:00:00 2001 From: "limpbizkit@gmail.com" Date: Fri, 5 Jul 2013 22:08:35 +0000 Subject: [PATCH 42/43] Really support requests greater than 2 GiB. git-svn-id: https://mockwebserver.googlecode.com/svn/trunk@45 cf848351-439f-e86a-257f-67fa721851d5 --- pom.xml | 2 +- src/main/java/com/google/mockwebserver/MockWebServer.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 3a8d6bc37..50b800140 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.google.mockwebserver mockwebserver - 20130705 + 20130706 mockwebserver http://code.google.com/p/mockwebserver diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/src/main/java/com/google/mockwebserver/MockWebServer.java index 999beb4f6..6e8080412 100644 --- a/src/main/java/com/google/mockwebserver/MockWebServer.java +++ b/src/main/java/com/google/mockwebserver/MockWebServer.java @@ -393,7 +393,7 @@ public final class MockWebServer { } List headers = new ArrayList(); - int contentLength = -1; + long contentLength = -1; boolean chunked = false; boolean expectContinue = false; String header; @@ -401,7 +401,7 @@ public final class MockWebServer { headers.add(header); String lowercaseHeader = header.toLowerCase(); if (contentLength == -1 && lowercaseHeader.startsWith("content-length:")) { - contentLength = Integer.parseInt(header.substring(15).trim()); + contentLength = Long.parseLong(header.substring(15).trim()); } if (lowercaseHeader.startsWith("transfer-encoding:") && lowercaseHeader.substring(18).trim().equals("chunked")) { @@ -501,10 +501,10 @@ public final class MockWebServer { * Transfer bytes from {@code in} to {@code out} until either {@code length} * bytes have been transferred or {@code in} is exhausted. */ - private void transfer(int length, InputStream in, OutputStream out) throws IOException { + private void transfer(long length, InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; while (length > 0) { - int count = in.read(buffer, 0, Math.min(buffer.length, length)); + int count = in.read(buffer, 0, (int) Math.min(buffer.length, length)); if (count == -1) { return; } From 60102293782e942ec86d7e2c26836ed6fa992cf5 Mon Sep 17 00:00:00 2001 From: jwilson Date: Sun, 4 Aug 2013 09:03:08 -0400 Subject: [PATCH 43/43] Imported mockwebserver source into mockwebserver/ --- javadoc/allclasses-frame.html | 40 - javadoc/allclasses-noframe.html | 40 - .../com/google/mockwebserver/Dispatcher.html | 284 ------- .../google/mockwebserver/MockResponse.html | 721 ------------------ .../google/mockwebserver/MockWebServer.html | 557 -------------- .../google/mockwebserver/RecordedRequest.html | 481 ------------ .../google/mockwebserver/SocketPolicy.html | 432 ----------- .../mockwebserver/class-use/Dispatcher.html | 166 ---- .../mockwebserver/class-use/MockResponse.html | 301 -------- .../class-use/MockWebServer.html | 143 ---- .../class-use/RecordedRequest.html | 182 ----- .../mockwebserver/class-use/SocketPolicy.html | 207 ----- .../google/mockwebserver/package-frame.html | 50 -- .../google/mockwebserver/package-summary.html | 182 ----- .../google/mockwebserver/package-tree.html | 160 ---- .../com/google/mockwebserver/package-use.html | 174 ----- javadoc/constant-values.html | 145 ---- javadoc/deprecated-list.html | 145 ---- javadoc/help-doc.html | 216 ------ javadoc/index-all.html | 368 --------- javadoc/index.html | 37 - javadoc/overview-tree.html | 162 ---- javadoc/package-list | 1 - javadoc/resources/inherit.gif | Bin 57 -> 0 bytes javadoc/stylesheet.css | 29 - lib/junit.jar | Bin 121070 -> 0 bytes COPYING => mockwebserver/COPYING | 0 .../com/google/mockwebserver/Dispatcher.java | 0 .../google/mockwebserver/MockResponse.java | 0 .../google/mockwebserver/MockWebServer.java | 0 .../google/mockwebserver/QueueDispatcher.java | 0 .../google/mockwebserver/RecordedRequest.java | 0 .../google/mockwebserver/SocketPolicy.java | 0 .../mockwebserver/CustomDispatcherTest.java | 0 .../mockwebserver/MockWebServerTest.java | 0 pom.xml | 99 --- 36 files changed, 5322 deletions(-) delete mode 100644 javadoc/allclasses-frame.html delete mode 100644 javadoc/allclasses-noframe.html delete mode 100644 javadoc/com/google/mockwebserver/Dispatcher.html delete mode 100644 javadoc/com/google/mockwebserver/MockResponse.html delete mode 100644 javadoc/com/google/mockwebserver/MockWebServer.html delete mode 100644 javadoc/com/google/mockwebserver/RecordedRequest.html delete mode 100644 javadoc/com/google/mockwebserver/SocketPolicy.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/Dispatcher.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/MockResponse.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/MockWebServer.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/RecordedRequest.html delete mode 100644 javadoc/com/google/mockwebserver/class-use/SocketPolicy.html delete mode 100644 javadoc/com/google/mockwebserver/package-frame.html delete mode 100644 javadoc/com/google/mockwebserver/package-summary.html delete mode 100644 javadoc/com/google/mockwebserver/package-tree.html delete mode 100644 javadoc/com/google/mockwebserver/package-use.html delete mode 100644 javadoc/constant-values.html delete mode 100644 javadoc/deprecated-list.html delete mode 100644 javadoc/help-doc.html delete mode 100644 javadoc/index-all.html delete mode 100644 javadoc/index.html delete mode 100644 javadoc/overview-tree.html delete mode 100644 javadoc/package-list delete mode 100644 javadoc/resources/inherit.gif delete mode 100644 javadoc/stylesheet.css delete mode 100644 lib/junit.jar rename COPYING => mockwebserver/COPYING (100%) rename {src => mockwebserver/src}/main/java/com/google/mockwebserver/Dispatcher.java (100%) rename {src => mockwebserver/src}/main/java/com/google/mockwebserver/MockResponse.java (100%) rename {src => mockwebserver/src}/main/java/com/google/mockwebserver/MockWebServer.java (100%) rename {src => mockwebserver/src}/main/java/com/google/mockwebserver/QueueDispatcher.java (100%) rename {src => mockwebserver/src}/main/java/com/google/mockwebserver/RecordedRequest.java (100%) rename {src => mockwebserver/src}/main/java/com/google/mockwebserver/SocketPolicy.java (100%) rename {src => mockwebserver/src}/test/java/com/google/mockwebserver/CustomDispatcherTest.java (100%) rename {src => mockwebserver/src}/test/java/com/google/mockwebserver/MockWebServerTest.java (100%) delete mode 100644 pom.xml diff --git a/javadoc/allclasses-frame.html b/javadoc/allclasses-frame.html deleted file mode 100644 index 6cdc97722..000000000 --- a/javadoc/allclasses-frame.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -All Classes (mockwebserver 20120819 API) - - - - - - - - - - - -All Classes -
- - - - - -
Dispatcher -
-MockResponse -
-MockWebServer -
-RecordedRequest -
-SocketPolicy -
-
- - - diff --git a/javadoc/allclasses-noframe.html b/javadoc/allclasses-noframe.html deleted file mode 100644 index 2f15ae42a..000000000 --- a/javadoc/allclasses-noframe.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -All Classes (mockwebserver 20120819 API) - - - - - - - - - - - -All Classes -
- - - - - -
Dispatcher -
-MockResponse -
-MockWebServer -
-RecordedRequest -
-SocketPolicy -
-
- - - diff --git a/javadoc/com/google/mockwebserver/Dispatcher.html b/javadoc/com/google/mockwebserver/Dispatcher.html deleted file mode 100644 index 0c1660037..000000000 --- a/javadoc/com/google/mockwebserver/Dispatcher.html +++ /dev/null @@ -1,284 +0,0 @@ - - - - - - - -Dispatcher (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class Dispatcher

-
-java.lang.Object
-  extended by com.google.mockwebserver.Dispatcher
-
-
-
-
public abstract class Dispatcher
extends Object
- - -

-Handler for mock server requests. -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
Dispatcher() - -
-           
-  - - - - - - - - - - - - - - - -
-Method Summary
-abstract  MockResponsedispatch(RecordedRequest request) - -
-          Returns a response to satisfy request.
- SocketPolicypeekSocketPolicy() - -
-          Returns the socket policy of the next request.
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-Dispatcher

-
-public Dispatcher()
-
-
- - - - - - - - -
-Method Detail
- -

-dispatch

-
-public abstract MockResponse dispatch(RecordedRequest request)
-                               throws InterruptedException
-
-
Returns a response to satisfy request. This method may block (for - instance, to wait on a CountdownLatch). -

-

- -
Throws: -
InterruptedException
-
-
-
- -

-peekSocketPolicy

-
-public SocketPolicy peekSocketPolicy()
-
-
Returns the socket policy of the next request. Default implementation - returns SocketPolicy.KEEP_OPEN. Mischievous implementations can - return other values to test HTTP edge cases. -

-

-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/MockResponse.html b/javadoc/com/google/mockwebserver/MockResponse.html deleted file mode 100644 index 5b4afa736..000000000 --- a/javadoc/com/google/mockwebserver/MockResponse.html +++ /dev/null @@ -1,721 +0,0 @@ - - - - - - - -MockResponse (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class MockResponse

-
-java.lang.Object
-  extended by com.google.mockwebserver.MockResponse
-
-
-
All Implemented Interfaces:
Cloneable
-
-
-
-
public final class MockResponse
extends Object
implements Cloneable
- - -

-A scripted response to be replayed by the mock web server. -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
MockResponse() - -
-          Creates a new mock response with an empty body.
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- MockResponseaddHeader(String header) - -
-          Adds header as an HTTP header.
- MockResponseaddHeader(String name, - Object value) - -
-          Adds a new header with the name and value.
- MockResponseclearHeaders() - -
-          Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default.
- MockResponseclone() - -
-           
- byte[]getBody() - -
-          Returns the raw HTTP payload.
- intgetBytesPerSecond() - -
-           
- List<String>getHeaders() - -
-          Returns the HTTP headers, such as "Content-Length: 0".
- SocketPolicygetSocketPolicy() - -
-           
- StringgetStatus() - -
-          Returns the HTTP response line, such as "HTTP/1.1 200 OK".
- MockResponseremoveHeader(String name) - -
-          Removes all headers named name.
- MockResponsesetBody(byte[] body) - -
-           
- MockResponsesetBody(String body) - -
-          Sets the response body to the UTF-8 encoded bytes of body.
- MockResponsesetBytesPerSecond(int bytesPerSecond) - -
-          Set simulated network speed, in bytes per second.
- MockResponsesetChunkedBody(byte[] body, - int maxChunkSize) - -
-          Sets the response body to body, chunked every maxChunkSize bytes.
- MockResponsesetChunkedBody(String body, - int maxChunkSize) - -
-          Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes.
- MockResponsesetHeader(String name, - Object value) - -
-          Removes all headers named name, then adds a new header with the - name and value.
- MockResponsesetResponseCode(int code) - -
-           
- MockResponsesetSocketPolicy(SocketPolicy socketPolicy) - -
-           
- MockResponsesetStatus(String status) - -
-           
- StringtoString() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-MockResponse

-
-public MockResponse()
-
-
Creates a new mock response with an empty body. -

-

- - - - - - - - -
-Method Detail
- -

-clone

-
-public MockResponse clone()
-
-
-
Overrides:
clone in class Object
-
-
-
-
-
-
- -

-getStatus

-
-public String getStatus()
-
-
Returns the HTTP response line, such as "HTTP/1.1 200 OK". -

-

-
-
-
-
-
-
-
- -

-setResponseCode

-
-public MockResponse setResponseCode(int code)
-
-
-
-
-
-
-
-
-
- -

-setStatus

-
-public MockResponse setStatus(String status)
-
-
-
-
-
-
-
-
-
- -

-getHeaders

-
-public List<String> getHeaders()
-
-
Returns the HTTP headers, such as "Content-Length: 0". -

-

-
-
-
-
-
-
-
- -

-clearHeaders

-
-public MockResponse clearHeaders()
-
-
Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default. -

-

-
-
-
-
-
-
-
- -

-addHeader

-
-public MockResponse addHeader(String header)
-
-
Adds header as an HTTP header. For well-formed HTTP header should contain a name followed by a colon and a value. -

-

-
-
-
-
-
-
-
- -

-addHeader

-
-public MockResponse addHeader(String name,
-                              Object value)
-
-
Adds a new header with the name and value. This may be used to add - multiple headers with the same name. -

-

-
-
-
-
-
-
-
- -

-setHeader

-
-public MockResponse setHeader(String name,
-                              Object value)
-
-
Removes all headers named name, then adds a new header with the - name and value. -

-

-
-
-
-
-
-
-
- -

-removeHeader

-
-public MockResponse removeHeader(String name)
-
-
Removes all headers named name. -

-

-
-
-
-
-
-
-
- -

-getBody

-
-public byte[] getBody()
-
-
Returns the raw HTTP payload. -

-

-
-
-
-
-
-
-
- -

-setBody

-
-public MockResponse setBody(byte[] body)
-
-
-
-
-
-
-
-
-
- -

-setBody

-
-public MockResponse setBody(String body)
-
-
Sets the response body to the UTF-8 encoded bytes of body. -

-

-
-
-
-
-
-
-
- -

-setChunkedBody

-
-public MockResponse setChunkedBody(byte[] body,
-                                   int maxChunkSize)
-
-
Sets the response body to body, chunked every maxChunkSize bytes. -

-

-
-
-
-
-
-
-
- -

-setChunkedBody

-
-public MockResponse setChunkedBody(String body,
-                                   int maxChunkSize)
-
-
Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes. -

-

-
-
-
-
-
-
-
- -

-getSocketPolicy

-
-public SocketPolicy getSocketPolicy()
-
-
-
-
-
-
-
-
-
- -

-setSocketPolicy

-
-public MockResponse setSocketPolicy(SocketPolicy socketPolicy)
-
-
-
-
-
-
-
-
-
- -

-getBytesPerSecond

-
-public int getBytesPerSecond()
-
-
-
-
-
-
-
-
-
- -

-setBytesPerSecond

-
-public MockResponse setBytesPerSecond(int bytesPerSecond)
-
-
Set simulated network speed, in bytes per second. This applies to the - response body only; response headers are not throttled. -

-

-
-
-
-
-
-
-
- -

-toString

-
-public String toString()
-
-
-
Overrides:
toString in class Object
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/MockWebServer.html b/javadoc/com/google/mockwebserver/MockWebServer.html deleted file mode 100644 index e312508f7..000000000 --- a/javadoc/com/google/mockwebserver/MockWebServer.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - - - - -MockWebServer (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class MockWebServer

-
-java.lang.Object
-  extended by com.google.mockwebserver.MockWebServer
-
-
-
-
public final class MockWebServer
extends Object
- - -

-A scriptable web server. Callers supply canned responses and the server - replays them upon request in sequence. -

- -

-


- -

- - - - - - - - - - - -
-Constructor Summary
MockWebServer() - -
-           
-  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- voidenqueue(MockResponse response) - -
-          Scripts response to be returned to a request made in sequence.
- StringgetCookieDomain() - -
-          Returns a cookie domain for this server.
- StringgetHostName() - -
-           
- intgetPort() - -
-           
- intgetRequestCount() - -
-          Returns the number of HTTP requests received thus far by this server.
- URLgetUrl(String path) - -
-          Returns a URL for connecting to this server.
- voidplay() - -
-          Equivalent to play(0).
- voidplay(int port) - -
-          Starts the server, serves all enqueued requests, and shuts the server - down.
- voidsetBodyLimit(int maxBodyLength) - -
-          Sets the number of bytes of the POST body to keep in memory to the given - limit.
- voidsetDispatcher(Dispatcher dispatcher) - -
-          Sets the dispatcher used to match incoming requests to mock responses.
- voidshutdown() - -
-           
- RecordedRequesttakeRequest() - -
-          Awaits the next HTTP request, removes it, and returns it.
- ProxytoProxyAddress() - -
-           
- voiduseHttps(SSLSocketFactory sslSocketFactory, - boolean tunnelProxy) - -
-          Serve requests with HTTPS rather than otherwise.
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-  -

- - - - - - - - -
-Constructor Detail
- -

-MockWebServer

-
-public MockWebServer()
-
-
- - - - - - - - -
-Method Detail
- -

-getPort

-
-public int getPort()
-
-
-
-
-
-
- -

-getHostName

-
-public String getHostName()
-
-
-
-
-
-
- -

-toProxyAddress

-
-public Proxy toProxyAddress()
-
-
-
-
-
-
- -

-getUrl

-
-public URL getUrl(String path)
-
-
Returns a URL for connecting to this server. -

-

-
Parameters:
path - the request path, such as "/".
-
-
-
- -

-getCookieDomain

-
-public String getCookieDomain()
-
-
Returns a cookie domain for this server. This returns the server's - non-loopback host name if it is known. Otherwise this returns ".local" - for this server's loopback name. -

-

-
-
-
-
- -

-setBodyLimit

-
-public void setBodyLimit(int maxBodyLength)
-
-
Sets the number of bytes of the POST body to keep in memory to the given - limit. -

-

-
-
-
-
- -

-useHttps

-
-public void useHttps(SSLSocketFactory sslSocketFactory,
-                     boolean tunnelProxy)
-
-
Serve requests with HTTPS rather than otherwise. -

-

-
Parameters:
tunnelProxy - whether to expect the HTTP CONNECT method before - negotiating TLS.
-
-
-
- -

-takeRequest

-
-public RecordedRequest takeRequest()
-                            throws InterruptedException
-
-
Awaits the next HTTP request, removes it, and returns it. Callers should - use this to verify the request sent was as intended. -

-

- -
Throws: -
InterruptedException
-
-
-
- -

-getRequestCount

-
-public int getRequestCount()
-
-
Returns the number of HTTP requests received thus far by this server. - This may exceed the number of HTTP connections when connection reuse is - in practice. -

-

-
-
-
-
- -

-enqueue

-
-public void enqueue(MockResponse response)
-
-
Scripts response to be returned to a request made in sequence. - The first request is served by the first enqueued response; the second - request by the second enqueued response; and so on. -

-

- -
Throws: -
ClassCastException - if the default dispatcher has been replaced - with setDispatcher(Dispatcher).
-
-
-
- -

-play

-
-public void play()
-          throws IOException
-
-
Equivalent to play(0). -

-

- -
Throws: -
IOException
-
-
-
- -

-play

-
-public void play(int port)
-          throws IOException
-
-
Starts the server, serves all enqueued requests, and shuts the server - down. -

-

-
Parameters:
port - the port to listen to, or 0 for any available port. - Automated tests should always use port 0 to avoid flakiness when a - specific port is unavailable. -
Throws: -
IOException
-
-
-
- -

-shutdown

-
-public void shutdown()
-              throws IOException
-
-
- -
Throws: -
IOException
-
-
-
- -

-setDispatcher

-
-public void setDispatcher(Dispatcher dispatcher)
-
-
Sets the dispatcher used to match incoming requests to mock responses. - The default dispatcher simply serves a fixed sequence of responses from - a queue; custom dispatchers can vary the - response based on timing or the content of the request. -

-

-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/RecordedRequest.html b/javadoc/com/google/mockwebserver/RecordedRequest.html deleted file mode 100644 index 62073f2c2..000000000 --- a/javadoc/com/google/mockwebserver/RecordedRequest.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - - - -RecordedRequest (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Class RecordedRequest

-
-java.lang.Object
-  extended by com.google.mockwebserver.RecordedRequest
-
-
-
-
public final class RecordedRequest
extends Object
- - -

-An HTTP request that came into the mock web server. -

- -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Method Summary
- byte[]getBody() - -
-          Returns the body of this POST request.
- intgetBodySize() - -
-          Returns the total size of the body of this POST request (before - truncation).
- List<Integer>getChunkSizes() - -
-          Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked.
- StringgetHeader(String name) - -
-          Returns the first header named name, or null if no such header - exists.
- List<String>getHeaders() - -
-          Returns all headers.
- List<String>getHeaders(String name) - -
-          Returns the headers named name.
- StringgetMethod() - -
-           
- StringgetPath() - -
-           
- StringgetRequestLine() - -
-           
- intgetSequenceNumber() - -
-          Returns the index of this request on its HTTP connection.
- StringgetSslProtocol() - -
-          Returns the connection's SSL protocol like TLSv1, SSLv3, - NONE or null if the connection doesn't use SSL.
- StringgetUtf8Body() - -
-          Returns the body of this POST request decoded as a UTF-8 string.
- StringtoString() - -
-           
- - - - - - - -
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Method Detail
- -

-getRequestLine

-
-public String getRequestLine()
-
-
-
-
-
-
- -

-getMethod

-
-public String getMethod()
-
-
-
-
-
-
- -

-getPath

-
-public String getPath()
-
-
-
-
-
-
- -

-getHeaders

-
-public List<String> getHeaders()
-
-
Returns all headers. -

-

-
-
-
-
- -

-getHeader

-
-public String getHeader(String name)
-
-
Returns the first header named name, or null if no such header - exists. -

-

-
-
-
-
- -

-getHeaders

-
-public List<String> getHeaders(String name)
-
-
Returns the headers named name. -

-

-
-
-
-
- -

-getChunkSizes

-
-public List<Integer> getChunkSizes()
-
-
Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked. -

-

-
-
-
-
- -

-getBodySize

-
-public int getBodySize()
-
-
Returns the total size of the body of this POST request (before - truncation). -

-

-
-
-
-
- -

-getBody

-
-public byte[] getBody()
-
-
Returns the body of this POST request. This may be truncated. -

-

-
-
-
-
- -

-getUtf8Body

-
-public String getUtf8Body()
-
-
Returns the body of this POST request decoded as a UTF-8 string. -

-

-
-
-
-
- -

-getSequenceNumber

-
-public int getSequenceNumber()
-
-
Returns the index of this request on its HTTP connection. Since a single - HTTP connection may serve multiple requests, each request is assigned its - own sequence number. -

-

-
-
-
-
- -

-getSslProtocol

-
-public String getSslProtocol()
-
-
Returns the connection's SSL protocol like TLSv1, SSLv3, - NONE or null if the connection doesn't use SSL. -

-

-
-
-
-
- -

-toString

-
-public String toString()
-
-
-
Overrides:
toString in class Object
-
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/SocketPolicy.html b/javadoc/com/google/mockwebserver/SocketPolicy.html deleted file mode 100644 index 9ab677347..000000000 --- a/javadoc/com/google/mockwebserver/SocketPolicy.html +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - -SocketPolicy (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
- -

- -com.google.mockwebserver -
-Enum SocketPolicy

-
-java.lang.Object
-  extended by java.lang.Enum<SocketPolicy>
-      extended by com.google.mockwebserver.SocketPolicy
-
-
-
All Implemented Interfaces:
Serializable, Comparable<SocketPolicy>
-
-
-
-
public enum SocketPolicy
extends Enum<SocketPolicy>
- - -

-What should be done with the incoming socket. -

- -

-


- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Enum Constant Summary
DISCONNECT_AT_END - -
-          Close the socket after the response.
DISCONNECT_AT_START - -
-          Request immediate close of connection without even reading the - request.
FAIL_HANDSHAKE - -
-          Don't trust the client during the SSL handshake.
KEEP_OPEN - -
-          Keep the socket open after the response.
SHUTDOWN_INPUT_AT_END - -
-          Shutdown the socket input after sending the response.
SHUTDOWN_OUTPUT_AT_END - -
-          Shutdown the socket output after sending the response.
UPGRADE_TO_SSL_AT_END - -
-          Wrap the socket with SSL at the completion of this request/response - pair.
-  - - - - - - - - - - - - - - - -
-Method Summary
-static SocketPolicyvalueOf(String name) - -
-          Returns the enum constant of this type with the specified name.
-static SocketPolicy[]values() - -
-          Returns an array containing the constants of this enum type, in -the order they are declared.
- - - - - - - -
Methods inherited from class java.lang.Enum
clone, compareTo, equals, finalize, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
- - - - - - - -
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
-  -

- - - - - - - - -
-Enum Constant Detail
- -

-KEEP_OPEN

-
-public static final SocketPolicy KEEP_OPEN
-
-
Keep the socket open after the response. This is the default HTTP/1.1 - behavior. -

-

-
-
-
- -

-DISCONNECT_AT_END

-
-public static final SocketPolicy DISCONNECT_AT_END
-
-
Close the socket after the response. This is the default HTTP/1.0 - behavior. -

-

-
-
-
- -

-UPGRADE_TO_SSL_AT_END

-
-public static final SocketPolicy UPGRADE_TO_SSL_AT_END
-
-
Wrap the socket with SSL at the completion of this request/response - pair. Used for CONNECT messages to tunnel SSL over an HTTP proxy. -

-

-
-
-
- -

-DISCONNECT_AT_START

-
-public static final SocketPolicy DISCONNECT_AT_START
-
-
Request immediate close of connection without even reading the - request. - -

Use to simulate the real life case of losing connection - because of bugger SSL server close connection when it seems - something like a compression method or TLS extension it doesn't - understand, instead of simply ignoring it like it should. -

-

-
-
-
- -

-FAIL_HANDSHAKE

-
-public static final SocketPolicy FAIL_HANDSHAKE
-
-
Don't trust the client during the SSL handshake. -

-

-
-
-
- -

-SHUTDOWN_INPUT_AT_END

-
-public static final SocketPolicy SHUTDOWN_INPUT_AT_END
-
-
Shutdown the socket input after sending the response. For testing bad - behavior. -

-

-
-
-
- -

-SHUTDOWN_OUTPUT_AT_END

-
-public static final SocketPolicy SHUTDOWN_OUTPUT_AT_END
-
-
Shutdown the socket output after sending the response. For testing bad - behavior. -

-

-
-
- - - - - - - - -
-Method Detail
- -

-values

-
-public static SocketPolicy[] values()
-
-
Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
-for (SocketPolicy c : SocketPolicy.values())
-    System.out.println(c);
-
-

-

- -
Returns:
an array containing the constants of this enum type, in -the order they are declared
-
-
-
- -

-valueOf

-
-public static SocketPolicy valueOf(String name)
-
-
Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.) -

-

-
Parameters:
name - the name of the enum constant to be returned. -
Returns:
the enum constant with the specified name -
Throws: -
IllegalArgumentException - if this enum type has no constant -with the specified name -
NullPointerException - if the argument is null
-
-
- -
- - - - - - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/Dispatcher.html b/javadoc/com/google/mockwebserver/class-use/Dispatcher.html deleted file mode 100644 index 282a84e2d..000000000 --- a/javadoc/com/google/mockwebserver/class-use/Dispatcher.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.Dispatcher (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.Dispatcher

-
- - - - - -
-Uses of Dispatcher in com.google.mockwebserver
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver with parameters of type Dispatcher
- voidMockWebServer.setDispatcher(Dispatcher dispatcher) - -
-          Sets the dispatcher used to match incoming requests to mock responses.
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/MockResponse.html b/javadoc/com/google/mockwebserver/class-use/MockResponse.html deleted file mode 100644 index 563b32aff..000000000 --- a/javadoc/com/google/mockwebserver/class-use/MockResponse.html +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.MockResponse (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.MockResponse

-
- - - - - -
-Uses of MockResponse in com.google.mockwebserver
-  -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Methods in com.google.mockwebserver that return MockResponse
- MockResponseMockResponse.addHeader(String header) - -
-          Adds header as an HTTP header.
- MockResponseMockResponse.addHeader(String name, - Object value) - -
-          Adds a new header with the name and value.
- MockResponseMockResponse.clearHeaders() - -
-          Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default.
- MockResponseMockResponse.clone() - -
-           
-abstract  MockResponseDispatcher.dispatch(RecordedRequest request) - -
-          Returns a response to satisfy request.
- MockResponseMockResponse.removeHeader(String name) - -
-          Removes all headers named name.
- MockResponseMockResponse.setBody(byte[] body) - -
-           
- MockResponseMockResponse.setBody(String body) - -
-          Sets the response body to the UTF-8 encoded bytes of body.
- MockResponseMockResponse.setBytesPerSecond(int bytesPerSecond) - -
-          Set simulated network speed, in bytes per second.
- MockResponseMockResponse.setChunkedBody(byte[] body, - int maxChunkSize) - -
-          Sets the response body to body, chunked every maxChunkSize bytes.
- MockResponseMockResponse.setChunkedBody(String body, - int maxChunkSize) - -
-          Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes.
- MockResponseMockResponse.setHeader(String name, - Object value) - -
-          Removes all headers named name, then adds a new header with the - name and value.
- MockResponseMockResponse.setResponseCode(int code) - -
-           
- MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) - -
-           
- MockResponseMockResponse.setStatus(String status) - -
-           
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver with parameters of type MockResponse
- voidMockWebServer.enqueue(MockResponse response) - -
-          Scripts response to be returned to a request made in sequence.
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/MockWebServer.html b/javadoc/com/google/mockwebserver/class-use/MockWebServer.html deleted file mode 100644 index 0797fcc22..000000000 --- a/javadoc/com/google/mockwebserver/class-use/MockWebServer.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.MockWebServer (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.MockWebServer

-
-No usage of com.google.mockwebserver.MockWebServer -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html b/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html deleted file mode 100644 index e2f264c17..000000000 --- a/javadoc/com/google/mockwebserver/class-use/RecordedRequest.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.RecordedRequest (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.RecordedRequest

-
- - - - - -
-Uses of RecordedRequest in com.google.mockwebserver
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver that return RecordedRequest
- RecordedRequestMockWebServer.takeRequest() - -
-          Awaits the next HTTP request, removes it, and returns it.
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver with parameters of type RecordedRequest
-abstract  MockResponseDispatcher.dispatch(RecordedRequest request) - -
-          Returns a response to satisfy request.
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html b/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html deleted file mode 100644 index 4f9dd4887..000000000 --- a/javadoc/com/google/mockwebserver/class-use/SocketPolicy.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - -Uses of Class com.google.mockwebserver.SocketPolicy (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Class
com.google.mockwebserver.SocketPolicy

-
- - - - - -
-Uses of SocketPolicy in com.google.mockwebserver
-  -

- - - - - - - - - - - - - - - - - - - - - -
Methods in com.google.mockwebserver that return SocketPolicy
- SocketPolicyMockResponse.getSocketPolicy() - -
-           
- SocketPolicyDispatcher.peekSocketPolicy() - -
-          Returns the socket policy of the next request.
-static SocketPolicySocketPolicy.valueOf(String name) - -
-          Returns the enum constant of this type with the specified name.
-static SocketPolicy[]SocketPolicy.values() - -
-          Returns an array containing the constants of this enum type, in -the order they are declared.
-  -

- - - - - - - - - -
Methods in com.google.mockwebserver with parameters of type SocketPolicy
- MockResponseMockResponse.setSocketPolicy(SocketPolicy socketPolicy) - -
-           
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/package-frame.html b/javadoc/com/google/mockwebserver/package-frame.html deleted file mode 100644 index 0f3f49e76..000000000 --- a/javadoc/com/google/mockwebserver/package-frame.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - -com.google.mockwebserver (mockwebserver 20120819 API) - - - - - - - - - - - -com.google.mockwebserver - - - - -
-Classes  - -
-Dispatcher -
-MockResponse -
-MockWebServer -
-RecordedRequest
- - - - - - -
-Enums  - -
-SocketPolicy
- - - - diff --git a/javadoc/com/google/mockwebserver/package-summary.html b/javadoc/com/google/mockwebserver/package-summary.html deleted file mode 100644 index 9f05d8662..000000000 --- a/javadoc/com/google/mockwebserver/package-summary.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - -com.google.mockwebserver (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-

-Package com.google.mockwebserver -

- - - - - - - - - - - - - - - - - - - - - -
-Class Summary
DispatcherHandler for mock server requests.
MockResponseA scripted response to be replayed by the mock web server.
MockWebServerA scriptable web server.
RecordedRequestAn HTTP request that came into the mock web server.
-  - -

- - - - - - - - - -
-Enum Summary
SocketPolicyWhat should be done with the incoming socket.
-  - -

-

-
-
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/package-tree.html b/javadoc/com/google/mockwebserver/package-tree.html deleted file mode 100644 index f1ec41452..000000000 --- a/javadoc/com/google/mockwebserver/package-tree.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - -com.google.mockwebserver Class Hierarchy (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For Package com.google.mockwebserver -

-
-

-Class Hierarchy -

- -

-Enum Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/com/google/mockwebserver/package-use.html b/javadoc/com/google/mockwebserver/package-use.html deleted file mode 100644 index ddc54e2e1..000000000 --- a/javadoc/com/google/mockwebserver/package-use.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - -Uses of Package com.google.mockwebserver (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Uses of Package
com.google.mockwebserver

-
- - - - - - - - - - - - - - - - - -
-Classes in com.google.mockwebserver used by com.google.mockwebserver
Dispatcher - -
-          Handler for mock server requests.
MockResponse - -
-          A scripted response to be replayed by the mock web server.
RecordedRequest - -
-          An HTTP request that came into the mock web server.
SocketPolicy - -
-          What should be done with the incoming socket.
-  -

-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/constant-values.html b/javadoc/constant-values.html deleted file mode 100644 index 9dfb18e76..000000000 --- a/javadoc/constant-values.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - -Constant Field Values (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Constant Field Values

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/deprecated-list.html b/javadoc/deprecated-list.html deleted file mode 100644 index d54eb0bfa..000000000 --- a/javadoc/deprecated-list.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - -Deprecated List (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Deprecated API

-
-
-Contents
    -
- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/help-doc.html b/javadoc/help-doc.html deleted file mode 100644 index bb807f4ee..000000000 --- a/javadoc/help-doc.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - -API Help (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-How This API Document Is Organized

-
-This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

-Package

-
- -

-Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    -
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
-
-

-Class/Interface

-
- -

-Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    -
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description -

    -

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary -

    -

  • Field Detail
  • Constructor Detail
  • Method Detail
-Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
- -

-Annotation Type

-
- -

-Each annotation type has its own separate page with the following sections:

    -
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
-
- -

-Enum

-
- -

-Each enum has its own separate page with the following sections:

    -
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
-
-

-Use

-
-Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.
-

-Tree (Class Hierarchy)

-
-There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    -
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
-
-

-Deprecated API

-
-The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
-

-Index

-
-The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
-

-Prev/Next

-These links take you to the next or previous class, interface, package, or related page.

-Frames/No Frames

-These links show and hide the HTML frames. All pages are available with or without frames. -

-

-Serialized Form

-Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. -

-

-Constant Field Values

-The Constant Field Values page lists the static final fields and their values. -

- - -This help file applies to API documentation generated using the standard doclet. - -
-


- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/index-all.html b/javadoc/index-all.html deleted file mode 100644 index 2ead9bbfd..000000000 --- a/javadoc/index-all.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - - - -Index (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -A C D E G M P R S T U V
-

-A

-
-
addHeader(String) - -Method in class com.google.mockwebserver.MockResponse -
Adds header as an HTTP header. -
addHeader(String, Object) - -Method in class com.google.mockwebserver.MockResponse -
Adds a new header with the name and value. -
-
-

-C

-
-
clearHeaders() - -Method in class com.google.mockwebserver.MockResponse -
Removes all HTTP headers including any "Content-Length" and - "Transfer-encoding" headers that were added by default. -
clone() - -Method in class com.google.mockwebserver.MockResponse -
  -
com.google.mockwebserver - package com.google.mockwebserver
 
-
-

-D

-
-
dispatch(RecordedRequest) - -Method in class com.google.mockwebserver.Dispatcher -
Returns a response to satisfy request. -
Dispatcher - Class in com.google.mockwebserver
Handler for mock server requests.
Dispatcher() - -Constructor for class com.google.mockwebserver.Dispatcher -
  -
-
-

-E

-
-
enqueue(MockResponse) - -Method in class com.google.mockwebserver.MockWebServer -
Scripts response to be returned to a request made in sequence. -
-
-

-G

-
-
getBody() - -Method in class com.google.mockwebserver.MockResponse -
Returns the raw HTTP payload. -
getBody() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the body of this POST request. -
getBodySize() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the total size of the body of this POST request (before - truncation). -
getBytesPerSecond() - -Method in class com.google.mockwebserver.MockResponse -
  -
getChunkSizes() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the sizes of the chunks of this request's body, or an empty list - if the request's body was empty or unchunked. -
getCookieDomain() - -Method in class com.google.mockwebserver.MockWebServer -
Returns a cookie domain for this server. -
getHeader(String) - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the first header named name, or null if no such header - exists. -
getHeaders() - -Method in class com.google.mockwebserver.MockResponse -
Returns the HTTP headers, such as "Content-Length: 0". -
getHeaders() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns all headers. -
getHeaders(String) - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the headers named name. -
getHostName() - -Method in class com.google.mockwebserver.MockWebServer -
  -
getMethod() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getPath() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getPort() - -Method in class com.google.mockwebserver.MockWebServer -
  -
getRequestCount() - -Method in class com.google.mockwebserver.MockWebServer -
Returns the number of HTTP requests received thus far by this server. -
getRequestLine() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
getSequenceNumber() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the index of this request on its HTTP connection. -
getSocketPolicy() - -Method in class com.google.mockwebserver.MockResponse -
  -
getSslProtocol() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the connection's SSL protocol like TLSv1, SSLv3, - NONE or null if the connection doesn't use SSL. -
getStatus() - -Method in class com.google.mockwebserver.MockResponse -
Returns the HTTP response line, such as "HTTP/1.1 200 OK". -
getUrl(String) - -Method in class com.google.mockwebserver.MockWebServer -
Returns a URL for connecting to this server. -
getUtf8Body() - -Method in class com.google.mockwebserver.RecordedRequest -
Returns the body of this POST request decoded as a UTF-8 string. -
-
-

-M

-
-
MockResponse - Class in com.google.mockwebserver
A scripted response to be replayed by the mock web server.
MockResponse() - -Constructor for class com.google.mockwebserver.MockResponse -
Creates a new mock response with an empty body. -
MockWebServer - Class in com.google.mockwebserver
A scriptable web server.
MockWebServer() - -Constructor for class com.google.mockwebserver.MockWebServer -
  -
-
-

-P

-
-
peekSocketPolicy() - -Method in class com.google.mockwebserver.Dispatcher -
Returns the socket policy of the next request. -
play() - -Method in class com.google.mockwebserver.MockWebServer -
Equivalent to play(0). -
play(int) - -Method in class com.google.mockwebserver.MockWebServer -
Starts the server, serves all enqueued requests, and shuts the server - down. -
-
-

-R

-
-
RecordedRequest - Class in com.google.mockwebserver
An HTTP request that came into the mock web server.
removeHeader(String) - -Method in class com.google.mockwebserver.MockResponse -
Removes all headers named name. -
-
-

-S

-
-
setBody(byte[]) - -Method in class com.google.mockwebserver.MockResponse -
  -
setBody(String) - -Method in class com.google.mockwebserver.MockResponse -
Sets the response body to the UTF-8 encoded bytes of body. -
setBodyLimit(int) - -Method in class com.google.mockwebserver.MockWebServer -
Sets the number of bytes of the POST body to keep in memory to the given - limit. -
setBytesPerSecond(int) - -Method in class com.google.mockwebserver.MockResponse -
Set simulated network speed, in bytes per second. -
setChunkedBody(byte[], int) - -Method in class com.google.mockwebserver.MockResponse -
Sets the response body to body, chunked every maxChunkSize bytes. -
setChunkedBody(String, int) - -Method in class com.google.mockwebserver.MockResponse -
Sets the response body to the UTF-8 encoded bytes of body, - chunked every maxChunkSize bytes. -
setDispatcher(Dispatcher) - -Method in class com.google.mockwebserver.MockWebServer -
Sets the dispatcher used to match incoming requests to mock responses. -
setHeader(String, Object) - -Method in class com.google.mockwebserver.MockResponse -
Removes all headers named name, then adds a new header with the - name and value. -
setResponseCode(int) - -Method in class com.google.mockwebserver.MockResponse -
  -
setSocketPolicy(SocketPolicy) - -Method in class com.google.mockwebserver.MockResponse -
  -
setStatus(String) - -Method in class com.google.mockwebserver.MockResponse -
  -
shutdown() - -Method in class com.google.mockwebserver.MockWebServer -
  -
SocketPolicy - Enum in com.google.mockwebserver
What should be done with the incoming socket.
-
-

-T

-
-
takeRequest() - -Method in class com.google.mockwebserver.MockWebServer -
Awaits the next HTTP request, removes it, and returns it. -
toProxyAddress() - -Method in class com.google.mockwebserver.MockWebServer -
  -
toString() - -Method in class com.google.mockwebserver.MockResponse -
  -
toString() - -Method in class com.google.mockwebserver.RecordedRequest -
  -
-
-

-U

-
-
useHttps(SSLSocketFactory, boolean) - -Method in class com.google.mockwebserver.MockWebServer -
Serve requests with HTTPS rather than otherwise. -
-
-

-V

-
-
valueOf(String) - -Static method in enum com.google.mockwebserver.SocketPolicy -
Returns the enum constant of this type with the specified name. -
values() - -Static method in enum com.google.mockwebserver.SocketPolicy -
Returns an array containing the constants of this enum type, in -the order they are declared. -
-
-A C D E G M P R S T U V - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/index.html b/javadoc/index.html deleted file mode 100644 index 62d9e9ea4..000000000 --- a/javadoc/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - -mockwebserver 20120819 API - - - - - - - - -<H2> -Frame Alert</H2> - -<P> -This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. -<BR> -Link to<A HREF="com/google/mockwebserver/package-summary.html">Non-frame version.</A> - - - diff --git a/javadoc/overview-tree.html b/javadoc/overview-tree.html deleted file mode 100644 index 29d9491f3..000000000 --- a/javadoc/overview-tree.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - -Class Hierarchy (mockwebserver 20120819 API) - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
- -
- - - -
-
-

-Hierarchy For All Packages

-
-
-
Package Hierarchies:
com.google.mockwebserver
-
-

-Class Hierarchy -

- -

-Enum Hierarchy -

- -
- - - - - - - - - - - - - - - -
- -
- - - -
-Copyright © 2011-2012. All Rights Reserved. - - diff --git a/javadoc/package-list b/javadoc/package-list deleted file mode 100644 index 89508e5d3..000000000 --- a/javadoc/package-list +++ /dev/null @@ -1 +0,0 @@ -com.google.mockwebserver diff --git a/javadoc/resources/inherit.gif b/javadoc/resources/inherit.gif deleted file mode 100644 index c814867a13deb0ca7ea2156c6ca1d5a03372af7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X diff --git a/javadoc/stylesheet.css b/javadoc/stylesheet.css deleted file mode 100644 index 6ea9e5161..000000000 --- a/javadoc/stylesheet.css +++ /dev/null @@ -1,29 +0,0 @@ -/* Javadoc style sheet */ - -/* Define colors, fonts and other style attributes here to override the defaults */ - -/* Page background color */ -body { background-color: #FFFFFF; color:#000000 } - -/* Headings */ -h1 { font-size: 145% } - -/* Table colors */ -.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ -.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ -.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ - -/* Font used in left-hand frame lists */ -.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } - -/* Navigation bar fonts and colors */ -.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ -.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ -.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} -.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} - -.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} -.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} - diff --git a/lib/junit.jar b/lib/junit.jar deleted file mode 100644 index 674d71e89ea154dbe2e3cd032821c22b39e8fd68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121070 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 F`9DH82$KK+ diff --git a/COPYING b/mockwebserver/COPYING similarity index 100% rename from COPYING rename to mockwebserver/COPYING diff --git a/src/main/java/com/google/mockwebserver/Dispatcher.java b/mockwebserver/src/main/java/com/google/mockwebserver/Dispatcher.java similarity index 100% rename from src/main/java/com/google/mockwebserver/Dispatcher.java rename to mockwebserver/src/main/java/com/google/mockwebserver/Dispatcher.java diff --git a/src/main/java/com/google/mockwebserver/MockResponse.java b/mockwebserver/src/main/java/com/google/mockwebserver/MockResponse.java similarity index 100% rename from src/main/java/com/google/mockwebserver/MockResponse.java rename to mockwebserver/src/main/java/com/google/mockwebserver/MockResponse.java diff --git a/src/main/java/com/google/mockwebserver/MockWebServer.java b/mockwebserver/src/main/java/com/google/mockwebserver/MockWebServer.java similarity index 100% rename from src/main/java/com/google/mockwebserver/MockWebServer.java rename to mockwebserver/src/main/java/com/google/mockwebserver/MockWebServer.java diff --git a/src/main/java/com/google/mockwebserver/QueueDispatcher.java b/mockwebserver/src/main/java/com/google/mockwebserver/QueueDispatcher.java similarity index 100% rename from src/main/java/com/google/mockwebserver/QueueDispatcher.java rename to mockwebserver/src/main/java/com/google/mockwebserver/QueueDispatcher.java diff --git a/src/main/java/com/google/mockwebserver/RecordedRequest.java b/mockwebserver/src/main/java/com/google/mockwebserver/RecordedRequest.java similarity index 100% rename from src/main/java/com/google/mockwebserver/RecordedRequest.java rename to mockwebserver/src/main/java/com/google/mockwebserver/RecordedRequest.java diff --git a/src/main/java/com/google/mockwebserver/SocketPolicy.java b/mockwebserver/src/main/java/com/google/mockwebserver/SocketPolicy.java similarity index 100% rename from src/main/java/com/google/mockwebserver/SocketPolicy.java rename to mockwebserver/src/main/java/com/google/mockwebserver/SocketPolicy.java diff --git a/src/test/java/com/google/mockwebserver/CustomDispatcherTest.java b/mockwebserver/src/test/java/com/google/mockwebserver/CustomDispatcherTest.java similarity index 100% rename from src/test/java/com/google/mockwebserver/CustomDispatcherTest.java rename to mockwebserver/src/test/java/com/google/mockwebserver/CustomDispatcherTest.java diff --git a/src/test/java/com/google/mockwebserver/MockWebServerTest.java b/mockwebserver/src/test/java/com/google/mockwebserver/MockWebServerTest.java similarity index 100% rename from src/test/java/com/google/mockwebserver/MockWebServerTest.java rename to mockwebserver/src/test/java/com/google/mockwebserver/MockWebServerTest.java diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 50b800140..000000000 --- a/pom.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - 4.0.0 - - org.sonatype.oss - oss-parent - 7 - - com.google.mockwebserver - mockwebserver - 20130706 - mockwebserver - http://code.google.com/p/mockwebserver - - code.google.com - http://code.google.com/p/mockwebserver/issues - - 2011 - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - 3.0.4 - - - - junit - junit - 3.8.1 - test - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-surefire-plugin - - - true - - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - verify - jar-no-fork - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - jar - - - - - org.apache.maven.plugins - maven-gpg-plugin - - - sign-artifacts - verify - - sign - - - - - - - - scm:svn:https://code.google.com/p/mockwebserver/ - scm:svn:https://code.google.com/p/mockwebserver/ - http://code.google.com/p/mockwebserver/source/browse - -