Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Configurable builder #55

Merged
merged 2 commits into from Jan 24, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -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