Skip to content

Commit

Permalink
Merge pull request #35 from mrmike/support-options
Browse files Browse the repository at this point in the history
Support curl options
  • Loading branch information
mrmike committed Jan 21, 2018
2 parents 2abf6e3 + 577e208 commit e54678d
Show file tree
Hide file tree
Showing 9 changed files with 222 additions and 26 deletions.
29 changes: 27 additions & 2 deletions README.md
Expand Up @@ -13,7 +13,7 @@ dependencies {
// snapshot version
compile 'com.github.mrmike:Ok2Curl:master-SNAPSHOT'
// or use specific version
compile 'com.github.mrmike:Ok2Curl:0.3.1'
compile 'com.github.mrmike:Ok2Curl:0.4.0'
}
```

Expand Down Expand Up @@ -57,9 +57,34 @@ final List<HeaderModifier> modifiers = Collections.<HeaderModifier>singletonList
final CurlInterceptor curlInterceptor = new CurlInterceptor(new AndroidLogger(), modifiers);
```

## Options
Ok2Curl supports basic Curl options. In order to use options use the following code:
```
final Options options = Options.builder()
.insecure()
.connectTimeout(120)
.retry(5)
.build();
final CurlInterceptor interceptor = new CurlInterceptor(logger, options);
```
Since now every Curl command will start with `curl --insecure --connect-timeout 120 --retry 5...`

### Supported options
* --insecure
* --max-time seconds
* --connect-timeout seconds
* --retry num
* --compressed
* --location

If would like to support any new options please feel free to open PR. Full list of curl options is
available [here](https://curl.haxx.se/docs/manpage.html).


## License

Copyright 2015 Michał Moczulski
Copyright 2018 Michał Moczulski

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
2 changes: 1 addition & 1 deletion ok2curl/build.gradle
Expand Up @@ -2,7 +2,7 @@ apply plugin: 'java'
apply plugin: 'maven'

group='com.github.mrmike'
version='0.3.2'
version='0.4.0'

targetCompatibility = '1.7'
sourceCompatibility = '1.7'
Expand Down
7 changes: 5 additions & 2 deletions ok2curl/src/main/java/com/moczul/ok2curl/CurlBuilder.java
Expand Up @@ -30,15 +30,17 @@ public class CurlBuilder {
private String method;
private String contentType;
private String body;
private List<String> options;
private List<Header> headers = new LinkedList<>();

public CurlBuilder(Request request) {
this(request, -1L, Collections.<HeaderModifier>emptyList());
this(request, -1L, Collections.<HeaderModifier>emptyList(), Options.EMPTY);
}

public CurlBuilder(Request request, long limit, List<HeaderModifier> headerModifiers) {
public CurlBuilder(Request request, long limit, List<HeaderModifier> headerModifiers, Options options) {
this.url = request.url().toString();
this.method = request.method();
this.options = new ArrayList<>(options.list());
final RequestBody body = request.body();
if (body != null) {
this.contentType = getContentType(body);
Expand Down Expand Up @@ -106,6 +108,7 @@ private Charset getCharset(MediaType mediaType) {
public String build() {
List<String> parts = new ArrayList<>();
parts.add("curl");
parts.addAll(options);
parts.add(String.format(FORMAT_METHOD, method.toUpperCase()));

for (Header header : headers) {
Expand Down
25 changes: 20 additions & 5 deletions ok2curl/src/main/java/com/moczul/ok2curl/CurlInterceptor.java
Expand Up @@ -19,6 +19,7 @@ public class CurlInterceptor implements Interceptor {
private final Loggable logger;
private final long limit;
private final List<HeaderModifier> headerModifiers = new ArrayList<>();
private final Options options;

/**
* Interceptor responsible for printing curl logs
Expand All @@ -28,7 +29,19 @@ public class CurlInterceptor implements Interceptor {
* @param logger output of logging
*/
public CurlInterceptor(Loggable logger) {
this(logger, DEFAULT_LIMIT, Collections.<HeaderModifier>emptyList());
this(logger, DEFAULT_LIMIT, Collections.<HeaderModifier>emptyList(), Options.EMPTY);
}

/**
* Interceptor responsible for printing curl logs
*
* Logs are pushed to stdout with 1MB limit
*
* @param logger output of logging
* @param options list of curl options
*/
public CurlInterceptor(Loggable logger, Options options) {
this(logger, DEFAULT_LIMIT, Collections.<HeaderModifier>emptyList(), options);
}

/**
Expand All @@ -38,7 +51,7 @@ public CurlInterceptor(Loggable logger) {
* @param headerModifiers list of header modifiers
*/
public CurlInterceptor(Loggable logger, List<HeaderModifier> headerModifiers) {
this(logger, DEFAULT_LIMIT, headerModifiers);
this(logger, DEFAULT_LIMIT, headerModifiers, Options.EMPTY);
}

/**
Expand All @@ -48,27 +61,29 @@ public CurlInterceptor(Loggable logger, List<HeaderModifier> headerModifiers) {
* @param limit limit maximal bytes logged, if negative - non limited
*/
public CurlInterceptor(Loggable logger, long limit) {
this(logger, limit, Collections.<HeaderModifier>emptyList());
this(logger, limit, Collections.<HeaderModifier>emptyList(), Options.EMPTY);
}

/**
* Interceptor responsible for printing curl logs
* @param logger output of logging
* @param limit limit maximal bytes logged, if negative - non limited
* @param headerModifiers list of header modifiers
* @param options list of curl options
*/
public CurlInterceptor(Loggable logger, long limit, List<HeaderModifier> headerModifiers) {
public CurlInterceptor(Loggable logger, long limit, List<HeaderModifier> headerModifiers, Options options) {
this.logger = logger;
this.limit = limit;
this.headerModifiers.addAll(headerModifiers);
this.options = options;
}

@Override
public Response intercept(Chain chain) throws IOException {
final Request request = chain.request();

final Request copy = request.newBuilder().build();
final String curl = new CurlBuilder(copy, limit, headerModifiers).build();
final String curl = new CurlBuilder(copy, limit, headerModifiers, options).build();

logger.log(curl);

Expand Down
68 changes: 68 additions & 0 deletions ok2curl/src/main/java/com/moczul/ok2curl/Options.java
@@ -0,0 +1,68 @@
package com.moczul.ok2curl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;

public class Options {

public static final Options EMPTY = new Options(Collections.<String>emptyList());

private final List<String> options;

public static Builder builder() {
return new Builder();
}

private Options(Collection<String> options) {
this.options = new ArrayList<>(options);
}

public List<String> list() {
return options;
}

public static class Builder {

private final Set<String> options = new HashSet<>();

public Builder insecure() {
options.add("--insecure");
return this;
}

public Builder maxTime(int seconds) {
options.add(String.format(Locale.getDefault(), "--max-time %d", seconds));
return this;
}

public Builder connectTimeout(int seconds) {
options.add(String.format(Locale.getDefault(), "--connect-timeout %d", seconds));
return this;
}

public Builder retry(int num) {
options.add(String.format(Locale.getDefault(), "--retry %d", num));
return this;
}

public Builder compressed() {
options.add("--compressed");
return this;
}

public Builder location() {
options.add("--location");
return this;
}

public Options build() {
return new Options(options);
}
}

}
41 changes: 33 additions & 8 deletions ok2curl/src/test/java/com/moczul/ok2curl/CurlBuilderTest.java
@@ -1,9 +1,10 @@
package com.moczul.ok2curl;

import com.moczul.ok2curl.modifier.HeaderModifier;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.util.Collections;
import java.util.concurrent.TimeUnit;

import okhttp3.CacheControl;
Expand All @@ -16,26 +17,28 @@
public class CurlBuilderTest {

@Test
public void getRequest_hasCorrectCommand() {
public void getRequestHasCorrectCommand() {
final Request request = new Request.Builder().url("http://example.com/").build();

final String command = new CurlBuilder(request).build();

assertEquals("curl -X GET http://example.com/", command);
}

@Test
public void getRequest_hasCorrectHeader() {
public void getRequestHasCorrectHeader() {
final Request request = new Request.Builder()
.url("http://example.com/")
.header("Accept", "application/json")
.build();

final String command = new CurlBuilder(request).build();

assertEquals("curl -X GET -H \"Accept:application/json\" http://example.com/", command);
}

@Test
public void getRequest_hasCorrectCacheHeader() {
public void getRequestHasCorrectCacheHeader() {
final CacheControl cache = new CacheControl.Builder()
.maxAge(1, TimeUnit.DAYS)
.onlyIfCached()
Expand All @@ -52,26 +55,28 @@ public void getRequest_hasCorrectCacheHeader() {
}

@Test
public void postRequest_hasCorrectPostData() {
public void postRequestHasCorrectPostData() {
final Request request = new Request.Builder().url("http://example.com/").post(body()).build();

final String command = new CurlBuilder(request).build();

final String expected = "curl -X POST -H \"Content-Type:application/x-www-form-urlencoded\" -d 'key1=value1' http://example.com/";
assertEquals(expected, command);
}

@Test
public void postRequest_bodyWithNullMediaType() {
public void postRequestBodyWithNullMediaType() {
final RequestBody body = RequestBody.create(null, "StringBody");
final Request request = new Request.Builder().url("http://example.com/").post(body).build();

final String command = new CurlBuilder(request).build();

final String expected = "curl -X POST -d 'StringBody' http://example.com/";
assertEquals(expected, command);
}

@Test
public void multipleHeadersWithTheSameName_shouldBeAddedToCurlCommand() {
public void multipleHeadersWithTheSameNameShouldBeAddedToCurlCommand() {
final Request request = new Request.Builder()
.url("http://example.com/")
.addHeader("Cookie", "FIRST=foo")
Expand All @@ -83,6 +88,26 @@ public void multipleHeadersWithTheSameName_shouldBeAddedToCurlCommand() {
assertEquals("curl -X GET -H \"Cookie:FIRST=foo\" -H \"Cookie:SECOND=bar\" http://example.com/", command);
}

@Test
public void getRequestContainsInsecureOption() {
final Request request = new Request.Builder().url("http://example.com/").build();
final Options options = Options.builder().insecure().build();

final String command = new CurlBuilder(request, 1024, Collections.<HeaderModifier>emptyList(), options).build();

assertEquals("curl --insecure -X GET http://example.com/", command);
}

@Test
public void getRequestContainsConnectTimeoutOptions() {
final Request request = new Request.Builder().url("http://example.com/").build();
final Options options = Options.builder().connectTimeout(120).build();

final String command = new CurlBuilder(request, 1024, Collections.<HeaderModifier>emptyList(), options).build();

assertEquals("curl --connect-timeout 120 -X GET http://example.com/", command);
}

private RequestBody body() {
return new FormBody.Builder().add("key1", "value1").build();
}
Expand Down
58 changes: 58 additions & 0 deletions ok2curl/src/test/java/com/moczul/ok2curl/OptionsTest.java
@@ -0,0 +1,58 @@
package com.moczul.ok2curl;

import org.junit.Test;

import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

public class OptionsTest {

@Test
public void defaultBuilderShouldReturnEmptyOptions() {
final Options options = Options.builder().build();

assertThat(options.list().size(), is(0));
}

@Test
public void shouldCorrectlyHandleOptionsParameters() {
final Options options = Options
.builder()
.maxTime(120)
.connectTimeout(60)
.retry(3)
.build();

assertThat(options.list().size(), is(3));
assertThat(options.list(), hasItem("--max-time 120"));
assertThat(options.list(), hasItem("--connect-timeout 60"));
assertThat(options.list(), hasItem("--retry 3"));
}

@Test
public void shouldReturnCorrectListOfParameters() {
final Options options = Options.builder()
.insecure()
.compressed()
.location()
.build();

assertThat(options.list().size(), is(3));
assertThat(options.list(), hasItem("--insecure"));
assertThat(options.list(), hasItem("--compressed"));
assertThat(options.list(), hasItem("--location"));
}

@Test
public void shouldIgnoreDuplicatedParameteres() {
final Options options = Options.builder()
.insecure()
.insecure()
.insecure()
.build();

assertThat(options.list().size(), is(1));
assertThat(options.list(), hasItem("--insecure"));
}
}

0 comments on commit e54678d

Please sign in to comment.