// Copyright 2013 Square, Inc. package retrofit; import retrofit.client.Header; import retrofit.client.Response; import retrofit.converter.Converter; import java.util.ArrayList; import java.util.List; import static java.net.HttpURLConnection.*; /** * An exception used to trigger the simulation of an HTTP error for mock services. * * @see MockRestAdapter */ public class MockHttpException extends RuntimeException { /** * Create a new {@link MockHttpException} for HTTP 301 Moved Permanently. */ public static MockHttpException newMovedPermanentely(String location, Object responseBody) { if (location == null || "".equals(location.trim())) { throw new IllegalArgumentException("Location must not be blank."); } return new MockHttpException(HTTP_MOVED_PERM, "Moved Permanently", responseBody) .withHeader("Location", location); } /** * Create a new {@link MockHttpException} for HTTP 302 Moved Temporarily. */ public static MockHttpException newMovedTemporarily(String location, Object responseBody) { if (location == null || "".equals(location.trim())) { throw new IllegalArgumentException("Location must not be blank."); } return new MockHttpException(HTTP_MOVED_TEMP, "Moved Temporarily", responseBody) .withHeader("Location", location); } /** * Create a new {@link MockHttpException} for HTTP 400 Bad Request. */ public static MockHttpException newBadRequest(Object responseBody) { return new MockHttpException(HTTP_BAD_REQUEST, "Bad Request", responseBody); } /** * Create a new {@link MockHttpException} for HTTP 401 Unauthorized. */ public static MockHttpException newUnauthorized(Object responseBody) { return new MockHttpException(HTTP_UNAUTHORIZED, "Unauthorized", responseBody); } /** * Create a new {@link MockHttpException} for HTTP 403 Forbidden. */ public static MockHttpException newForbidden(Object responseBody) { return new MockHttpException(HTTP_FORBIDDEN, "Forbidded", responseBody); } /** * Create a new {@link MockHttpException} for HTTP 404 Not Found. */ public static MockHttpException newNotFound(Object responseBody) { return new MockHttpException(HTTP_NOT_FOUND, "Not Found", responseBody); } /** * Create a new {@link MockHttpException} for HTTP 500 Internal Server Error. */ public static MockHttpException newInternalError(Object responseBody) { return new MockHttpException(HTTP_INTERNAL_ERROR, "Internal Server Error", responseBody); } final int code; final String reason; final Object responseBody; final List<Header> headers = new ArrayList<Header>(2); /** * Create a new HTTP exception. * * @param code HTTP status code to trigger. Must be 300 or higher. * @param reason HTTP status reason message. * @param responseBody Object to use as the contents of the response body. */ public MockHttpException(int code, String reason, Object responseBody) { super("HTTP " + code + " " + reason); if (code < 300 || code > 599) { throw new IllegalArgumentException("Unsupported HTTP error code: " + code); } if (reason == null || "".equals(reason.trim())) { throw new IllegalArgumentException("Reason must not be blank."); } this.code = code; this.reason = reason; this.responseBody = responseBody; } /** * Add a header to the response. */ public MockHttpException withHeader(String name, String value) { if (name == null || "".equals(name.trim())) { throw new IllegalArgumentException("HeaderParam name must not be blank."); } if (value == null || "".equals(value.trim())) { throw new IllegalArgumentException("HeaderParam value must not be blank."); } headers.add(new Header(name, value)); return this; } Response toResponse(Converter converter) { return new Response(code, reason, headers, new MockTypedInput(converter, responseBody)); } }