Skip to content

Commit

Permalink
✨ Add PATCH method for Fuel (#156)
Browse files Browse the repository at this point in the history
  • Loading branch information
kittinunf authored May 6, 2017
1 parent 73a9975 commit ee3d422
Show file tree
Hide file tree
Showing 8 changed files with 187 additions and 7 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ buildscript {
}

dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'com.android.tools.build:gradle:2.3.1'
classpath 'com.dicedmelon.gradle:jacoco-android:0.1.1'

classpath 'com.novoda:bintray-release:0.3.4'
Expand Down
21 changes: 21 additions & 0 deletions fuel/src/main/kotlin/com/github/kittinunf/fuel/Fuel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,17 @@ class Fuel {
return request(Method.PUT, convertible, parameters)
}

//patch
@JvmStatic @JvmOverloads
fun patch(path: String, parameters: List<Pair<String, Any?>>? = null): Request {
return request(Method.PATCH, path, parameters)
}

@JvmStatic @JvmOverloads
fun patch(convertible: PathStringConvertible, parameters: List<Pair<String, Any?>>? = null): Request {
return request(Method.PATCH, convertible, parameters)
}

//delete
@JvmStatic @JvmOverloads
fun delete(path: String, parameters: List<Pair<String, Any?>>? = null): Request {
Expand Down Expand Up @@ -151,6 +162,16 @@ fun Fuel.PathStringConvertible.httpPut(parameter: List<Pair<String, Any?>>? = nu
return Fuel.put(this, parameter)
}

@JvmOverloads
fun String.httpPatch(parameters: List<Pair<String, Any?>>? = null): Request {
return Fuel.patch(this, parameters)
}

@JvmOverloads
fun Fuel.PathStringConvertible.httpPatch(parameter: List<Pair<String, Any?>>? = null): Request {
return Fuel.patch(this, parameter)
}

@JvmOverloads
fun String.httpDelete(parameters: List<Pair<String, Any?>>? = null): Request {
return Fuel.delete(this, parameters)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ class Request : Fuel.RequestConvertible {

fun responseString(handler: Handler<String>) = response(stringDeserializer(), handler)

@JvmOverloads
fun responseString(charset: Charset = Charsets.UTF_8) = response(stringDeserializer(charset))

//object
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,13 @@ class HttpClient(val proxy: Proxy? = null) : Client {
readTimeout = timeoutRead
doInput = true
useCaches = false
requestMethod = request.httpMethod.value
requestMethod = if (request.httpMethod == Method.PATCH) Method.POST.value else request.httpMethod.value
setDoOutput(connection, request.httpMethod)
instanceFollowRedirects = false
for ((key, value) in request.httpHeaders) {
setRequestProperty(key, value)
}
if (request.httpMethod == Method.PATCH) setRequestProperty("X-HTTP-Method-Override", "PATCH")
setBodyIfAny(connection, request.httpBody)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ class RequestPathStringConvertibleExtensionTest : BaseTestCase() {
override val path = "/$relativePath"
}

enum class MockBin(path: String) : Fuel.PathStringConvertible {
PATH("");

override val path = "https://mockbin.org/request/$path"
}

@Test
fun httpGetRequestWithSharedInstance() {
var request: Request? = null
Expand Down Expand Up @@ -111,6 +117,35 @@ class RequestPathStringConvertibleExtensionTest : BaseTestCase() {
assertThat(string, containsString("https"))
}

@Test
fun httpPatchRequestWithSharedInstance() {
var request: Request? = null
var response: Response? = null
var data: Any? = null
var error: FuelError? = null

MockBin.PATH.httpPatch().responseString { req, res, result ->
request = req
response = res

val (d, err) = result
data = d
error = err
}

val string = data as String

assertThat(request, notNullValue())
assertThat(response, notNullValue())
assertThat(error, nullValue())
assertThat(data, notNullValue())

val statusCode = HttpURLConnection.HTTP_OK
assertThat(response?.httpStatusCode, isEqualTo(statusCode))

assertThat(string, containsString("https"))
}

@Test
fun httpDeleteRequestWithSharedInstance() {
var request: Request? = null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package com.github.kittinunf.fuel

import com.github.kittinunf.fuel.core.*
import com.github.kittinunf.fuel.core.FuelError
import com.github.kittinunf.fuel.core.FuelManager
import com.github.kittinunf.fuel.core.Method
import com.github.kittinunf.fuel.core.Request
import com.github.kittinunf.fuel.core.Response
import org.hamcrest.CoreMatchers.notNullValue
import org.hamcrest.CoreMatchers.nullValue
import org.junit.Assert.assertThat
Expand Down Expand Up @@ -89,6 +93,30 @@ class RequestStringExtensionTest : BaseTestCase() {
assertThat(response?.httpStatusCode, isEqualTo(statusCode))
}

@Test
fun httpPatch() {
var request: Request? = null
var response: Response? = null
var data: Any? = null
var error: FuelError? = null

"https://mockbin.org/request".httpPatch().responseString { req, res, result ->
request = req
response = res
val (d, err) = result
data = d
error = err
}

assertThat(request, notNullValue())
assertThat(response, notNullValue())
assertThat(error, nullValue())
assertThat(data, notNullValue())

val statusCode = HttpURLConnection.HTTP_OK
assertThat(response?.httpStatusCode, isEqualTo(statusCode))
}

@Test
fun httpDelete() {
var request: Request? = null
Expand Down
100 changes: 96 additions & 4 deletions fuel/src/test/kotlin/com/github/kittinunf/fuel/RequestTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ import org.hamcrest.CoreMatchers.*
import org.junit.Assert.assertThat
import org.junit.Test
import java.net.HttpURLConnection
import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager
import org.hamcrest.CoreMatchers.`is` as isEqualTo

class RequestTest : BaseTestCase() {
Expand All @@ -20,11 +25,18 @@ class RequestTest : BaseTestCase() {
USER_AGENT("user-agent"),
POST("post"),
PUT("put"),
PATCH("patch"),
DELETE("delete");

override val path = "https://httpbin.org/$relativePath"
}

enum class MockBin(path: String) : Fuel.PathStringConvertible {
PATH("");

override val path = "http://mockbin.org/request/$path"
}

class HttpBinConvertible(val method: Method, val relativePath: String) : Fuel.RequestConvertible {
override val request = createRequest()

Expand All @@ -38,6 +50,23 @@ class RequestTest : BaseTestCase() {
}
}

init {
val acceptsAllTrustManager = object : X509TrustManager {
override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {}

override fun getAcceptedIssuers(): Array<X509Certificate>? = null

override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {}
}

manager.socketFactory = {
val context = SSLContext.getInstance("TLS")
context.init(null, arrayOf<TrustManager>(acceptsAllTrustManager), SecureRandom())
SSLContext.setDefault(context)
context.socketFactory
}()
}

@Test
fun httpGetRequestWithDataResponse() {
var request: Request? = null
Expand Down Expand Up @@ -131,7 +160,7 @@ class RequestTest : BaseTestCase() {
val paramKey = "foo"
val paramValue = "bar"

manager.request(Method.GET, "http://httpbin.org/get", listOf(paramKey to paramValue)).responseString { req, res, result ->
manager.request(Method.POST, "http://httpbin.org/post", listOf(paramKey to paramValue)).responseString { req, res, result ->
request = req
response = res

Expand Down Expand Up @@ -221,6 +250,40 @@ class RequestTest : BaseTestCase() {
assertThat(string, containsString(paramValue))
}

@Test
fun httpPatchRequestWithParameters() {
var request: Request? = null
var response: Response? = null
var data: Any? = null
var error: FuelError? = null

val paramKey = "foo2"
val paramValue = "bar2"

// for some reason httpbin doesn't support underlying POST for PATCH endpoint
manager.request(Method.PATCH, "http://mockbin.org/request", listOf(paramKey to paramValue)).responseString { req, res, result ->
request = req
response = res

val (d, err) = result
data = d
error = err
}

val string = data as String

assertThat(request, notNullValue())
assertThat(response, notNullValue())
assertThat(error, nullValue())
assertThat(data, notNullValue())

val statusCode = HttpURLConnection.HTTP_OK
assertThat(response?.httpStatusCode, isEqualTo(statusCode))

assertThat(string, containsString(paramKey))
assertThat(string, containsString(paramValue))
}

@Test
fun httpDeleteRequestWithParameters() {
var request: Request? = null
Expand Down Expand Up @@ -287,7 +350,7 @@ class RequestTest : BaseTestCase() {
}

@Test
fun httpGetRequestWithPathStringConvertible() {
fun httpGetRequestUserAgentWithPathStringConvertible() {
var request: Request? = null
var response: Response? = null
var data: Any? = null
Expand Down Expand Up @@ -343,7 +406,37 @@ class RequestTest : BaseTestCase() {
}

@Test
fun httpGetRequestWithRequestConvertibleAndOverriddenParameters() {
fun httpPatchRequestWithRequestConvertible() {
var request: Request? = null
var response: Response? = null
var data: Any? = null
var error: FuelError? = null

val paramKey = "foo"
val paramValue = "bar"

manager.request(Method.PATCH, MockBin.PATH, listOf(paramKey to paramValue)).responseString { req, res, result ->
request = req
response = res

result.fold({
data = it
}, {
error = it
})
}

assertThat(request, notNullValue())
assertThat(response, notNullValue())
assertThat(error, nullValue())
assertThat(data, notNullValue())

val statusCode = HttpURLConnection.HTTP_OK
assertThat(response?.httpStatusCode, isEqualTo(statusCode))
}

@Test
fun httpPostRequestWithRequestConvertibleAndOverriddenParameters() {
var request: Request? = null
var response: Response? = null
var data: Any? = null
Expand Down Expand Up @@ -391,7 +484,6 @@ class RequestTest : BaseTestCase() {

request.cancel()

println(request.cUrlString())
assertThat(request, notNullValue())
assertThat(response, nullValue())
assertThat(data, nullValue())
Expand Down
2 changes: 2 additions & 0 deletions sample-java/src/main/java/com/example/fuel/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ public void success(@NotNull Request request, @NotNull Response response, String
}
});

Fuel.get("http://httpbin.org/get", params).responseString();

//put
Fuel.put("http://httpbin.org/put").responseString(new Handler<String>() {
@Override
Expand Down

0 comments on commit ee3d422

Please sign in to comment.