diff --git a/okhttp-tests/src/test/java/com/squareup/okhttp/internal/http/URLConnectionTest.java b/okhttp-tests/src/test/java/com/squareup/okhttp/internal/http/URLConnectionTest.java index 1cb3d29f6..abb65bbde 100644 --- a/okhttp-tests/src/test/java/com/squareup/okhttp/internal/http/URLConnectionTest.java +++ b/okhttp-tests/src/test/java/com/squareup/okhttp/internal/http/URLConnectionTest.java @@ -1340,6 +1340,7 @@ public final class URLConnectionTest { assertValidRequestMethod("POST"); assertValidRequestMethod("PUT"); assertValidRequestMethod("TRACE"); + assertValidRequestMethod("PATCH"); } private void assertValidRequestMethod(String requestMethod) throws Exception { diff --git a/okhttp/src/main/java/com/squareup/okhttp/HttpResponseCache.java b/okhttp/src/main/java/com/squareup/okhttp/HttpResponseCache.java index 8556e190e..ad0a22917 100644 --- a/okhttp/src/main/java/com/squareup/okhttp/HttpResponseCache.java +++ b/okhttp/src/main/java/com/squareup/okhttp/HttpResponseCache.java @@ -18,6 +18,7 @@ package com.squareup.okhttp; import com.squareup.okhttp.internal.DiskLruCache; import com.squareup.okhttp.internal.Util; +import com.squareup.okhttp.internal.http.HttpMethod; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.File; @@ -195,8 +196,7 @@ public final class HttpResponseCache extends ResponseCache implements OkResponse } @Override public boolean maybeRemove(Request request) { - String method = request.method(); - if (method.equals("POST") || method.equals("PUT") || method.equals("DELETE")) { + if (HttpMethod.invalidatesCache(request.method())) { try { cache.remove(urlToKey(request)); } catch (IOException ignored) { diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java b/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java index d683d6b27..1df047cf5 100644 --- a/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java +++ b/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java @@ -254,8 +254,7 @@ public class HttpEngine { } boolean hasRequestBody() { - String method = request.method(); - return method.equals("POST") || method.equals("PUT") || method.equals("PATCH"); + return HttpMethod.hasRequestBody(request.method()); } /** Returns the request body or null if this request doesn't have a body. */ diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpMethod.java b/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpMethod.java new file mode 100644 index 000000000..ab4635a34 --- /dev/null +++ b/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpMethod.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2014 Square, 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.squareup.okhttp.internal.http; + +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Set; + +public final class HttpMethod { + public static final Set METHODS = new LinkedHashSet(Arrays.asList( + "OPTIONS", "GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "PATCH")); + + public static boolean invalidatesCache(String method) { + return method.equals("POST") + || method.equals("PATCH") + || method.equals("PUT") + || method.equals("DELETE"); + } + + public static boolean hasRequestBody(String method) { + return method.equals("POST") + || method.equals("PUT") + || method.equals("PATCH"); + } + + private HttpMethod() { + } +} diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java b/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java index b51bbc6c6..da876cac4 100644 --- a/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java +++ b/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpURLConnectionImpl.java @@ -265,7 +265,7 @@ public class HttpURLConnectionImpl extends HttpURLConnection { if (method.equals("GET")) { // they are requesting a stream to write to. This implies a POST method method = "POST"; - } else if (!method.equals("POST") && !method.equals("PUT") && !method.equals("PATCH")) { + } else if (!HttpMethod.hasRequestBody(method)) { // If the request method is neither POST nor PUT nor PATCH, then you're not writing throw new ProtocolException(method + " does not support writing"); } @@ -570,6 +570,14 @@ public class HttpURLConnectionImpl extends HttpURLConnection { client.setProtocols(protocolsList); } + @Override public void setRequestMethod(String method) throws ProtocolException { + if (!HttpMethod.METHODS.contains(method)) { + throw new ProtocolException( + "Expected one of " + HttpMethod.METHODS + " but was " + method); + } + this.method = method; + } + @Override public void setFixedLengthStreamingMode(int contentLength) { setFixedLengthStreamingMode((long) contentLength); }