Skip to content

Commit

Permalink
Merge pull request #55 from flocsy/configurable-builder
Browse files Browse the repository at this point in the history
Configurable builder
  • Loading branch information
mrmike committed Jan 24, 2021
2 parents 8e0d16f + 36ec940 commit 1866a4c
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 23 deletions.
@@ -0,0 +1,86 @@
package com.moczul.ok2curl;

import com.moczul.ok2curl.modifier.HeaderModifier;

import java.util.ArrayList;
import java.util.List;

import okhttp3.Request;

import static com.moczul.ok2curl.StringUtil.join;

public class ConfigurableCurlBuilder extends CurlBuilder {

public static final int PART_CURL = 0;
public static final int PART_OPTIONS = 1;
public static final int PART_METHOD = 2;
public static final int PART_HEADERS = 3;
public static final int PART_CONTENT_TYPE = 4;
public static final int PART_BODY = 5;
public static final int PART_URL = 6;
protected static final int[] DEFAULT_PARTS_ORDER = new int[]{PART_CURL, PART_OPTIONS, PART_METHOD, PART_HEADERS, PART_CONTENT_TYPE, PART_BODY, PART_URL};

protected final int[] partsOrder;

public ConfigurableCurlBuilder(Request request, long limit, List<HeaderModifier> headerModifiers, Options options, String delimiter) {
this(request, limit, headerModifiers, options, delimiter, DEFAULT_PARTS_ORDER);
}

public ConfigurableCurlBuilder(Request request, long limit, List<HeaderModifier> headerModifiers, Options options, String delimiter, int[] partsOrder) {
super(request, limit, headerModifiers, options, delimiter);
this.partsOrder = partsOrder;
}

@Override
public String build() {
List<String> parts = new ArrayList<>();
for (int part : partsOrder) {
switch (part) {
case PART_CURL: addCurl(parts); break;
case PART_OPTIONS: addOptions(parts); break;
case PART_METHOD: addMethod(parts); break;
case PART_HEADERS: addHeaders(parts); break;
case PART_CONTENT_TYPE: addContentType(parts); break;
case PART_BODY: addBody(parts); break;
case PART_URL: addUrl(parts); break;
}
}

return join(delimiter, parts);
}

private void addCurl(List<String> parts) {
parts.add("curl");
}

private void addOptions(List<String> parts) {
parts.addAll(options);
}

private void addMethod(List<String> parts) {
parts.add(String.format(FORMAT_METHOD, method.toUpperCase()));
}

private void addHeaders(List<String> parts) {
for (Header header : headers) {
final String headerPart = String.format(FORMAT_HEADER, header.name(), header.value());
parts.add(headerPart);
}
}

private void addContentType(List<String> parts) {
if (contentType != null && !containsName(CONTENT_TYPE, headers)) {
parts.add(String.format(FORMAT_HEADER, CONTENT_TYPE, contentType));
}
}

private void addBody(List<String> parts) {
if (body != null) {
parts.add(String.format(FORMAT_BODY, body));
}
}

private void addUrl(List<String> parts) {
parts.add(String.format(FORMAT_URL, url));
}
}
37 changes: 21 additions & 16 deletions ok2curl/src/main/java/com/moczul/ok2curl/CurlBuilder.java
Expand Up @@ -21,19 +21,19 @@

public class CurlBuilder {

private static final String FORMAT_HEADER = "-H \"%1$s:%2$s\"";
private static final String FORMAT_METHOD = "-X %1$s";
private static final String FORMAT_BODY = "-d '%1$s'";
private static final String FORMAT_URL = "\"%1$s\"";
private static final String CONTENT_TYPE = "Content-Type";

private final String url;
private String method;
private String contentType;
private String body;
private List<String> options;
private List<Header> headers = new LinkedList<>();
private String delimiter;
protected static final String FORMAT_HEADER = "-H \"%1$s:%2$s\"";
protected static final String FORMAT_METHOD = "-X %1$s";
protected static final String FORMAT_BODY = "-d '%1$s'";
protected static final String FORMAT_URL = "\"%1$s\"";
protected static final String CONTENT_TYPE = "Content-Type";

protected final String url;
protected final String method;
protected final String contentType;
protected final String body;
protected final List<String> options;
protected final List<Header> headers;
protected final String delimiter;

public CurlBuilder(Request request) {
this(request, -1L, Collections.emptyList(), Options.EMPTY);
Expand All @@ -46,22 +46,27 @@ public CurlBuilder(Request request, long limit, List<HeaderModifier> headerModif
public CurlBuilder(Request request, long limit, List<HeaderModifier> headerModifiers, Options options, String delimiter) {
this.url = request.url().toString();
this.method = request.method();
this.options = new ArrayList<>(options.list());
this.options = Collections.unmodifiableList(options.list());
this.delimiter = delimiter;
final RequestBody body = request.body();
if (body != null) {
this.contentType = getContentType(body);
this.body = getBodyAsString(body, limit);
} else {
this.contentType = null;
this.body = null;
}

final Headers headers = request.headers();
final List<Header> modifiableHeaders = new LinkedList<>();
for (int i = 0; i < headers.size(); i++) {
final Header header = new Header(headers.name(i), headers.value(i));
final Header modifiedHeader = modifyHeader(header, headerModifiers);
if (modifiedHeader != null) {
this.headers.add(modifiedHeader);
modifiableHeaders.add(modifiedHeader);
}
}
this.headers = Collections.unmodifiableList(modifiableHeaders);
}

private Header modifyHeader(Header header, List<HeaderModifier> headerModifiers) {
Expand Down Expand Up @@ -136,7 +141,7 @@ public String build() {
return join(delimiter, parts);
}

private boolean containsName(String name, List<Header> headers) {
protected boolean containsName(String name, List<Header> headers) {
for (Header header : headers) {
if (header.name().equals(name)) {
return true;
Expand Down
16 changes: 10 additions & 6 deletions ok2curl/src/main/java/com/moczul/ok2curl/CurlInterceptor.java
Expand Up @@ -17,11 +17,11 @@ public class CurlInterceptor implements Interceptor {
private static final long DEFAULT_LIMIT = 1024L * 1024L;
private static final String DEFAULT_DELIMITER = " ";

private final Loggable logger;
private final long limit;
private final List<HeaderModifier> headerModifiers = new ArrayList<>();
private final Options options;
private final String delimiter;
protected final Loggable logger;
protected final long limit;
protected final List<HeaderModifier> headerModifiers = new ArrayList<>();
protected final Options options;
protected final String delimiter;

/**
* Interceptor responsible for printing curl logs
Expand Down Expand Up @@ -98,10 +98,14 @@ 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, options, delimiter).build();
final String curl = getCurlBuilder(copy).build();

logger.log(curl);

return chain.proceed(request);
}

protected CurlBuilder getCurlBuilder(Request copy) {
return new CurlBuilder(copy, limit, headerModifiers, options, delimiter);
}
}
2 changes: 1 addition & 1 deletion ok2curl/src/main/java/com/moczul/ok2curl/StringUtil.java
@@ -1,6 +1,6 @@
package com.moczul.ok2curl;

/* package */ class StringUtil {
public class StringUtil {

/**
* Returns a string containing the tokens joined by delimiters.
Expand Down

0 comments on commit 1866a4c

Please sign in to comment.