diff --git a/ok2curl/src/main/java/com/moczul/ok2curl/ConfigurableCurlBuilder.java b/ok2curl/src/main/java/com/moczul/ok2curl/ConfigurableCurlBuilder.java new file mode 100644 index 0000000..b1a575f --- /dev/null +++ b/ok2curl/src/main/java/com/moczul/ok2curl/ConfigurableCurlBuilder.java @@ -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 headerModifiers, Options options, String delimiter) { + this(request, limit, headerModifiers, options, delimiter, DEFAULT_PARTS_ORDER); + } + + public ConfigurableCurlBuilder(Request request, long limit, List headerModifiers, Options options, String delimiter, int[] partsOrder) { + super(request, limit, headerModifiers, options, delimiter); + this.partsOrder = partsOrder; + } + + @Override + public String build() { + List 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 parts) { + parts.add("curl"); + } + + private void addOptions(List parts) { + parts.addAll(options); + } + + private void addMethod(List parts) { + parts.add(String.format(FORMAT_METHOD, method.toUpperCase())); + } + + private void addHeaders(List parts) { + for (Header header : headers) { + final String headerPart = String.format(FORMAT_HEADER, header.name(), header.value()); + parts.add(headerPart); + } + } + + private void addContentType(List parts) { + if (contentType != null && !containsName(CONTENT_TYPE, headers)) { + parts.add(String.format(FORMAT_HEADER, CONTENT_TYPE, contentType)); + } + } + + private void addBody(List parts) { + if (body != null) { + parts.add(String.format(FORMAT_BODY, body)); + } + } + + private void addUrl(List parts) { + parts.add(String.format(FORMAT_URL, url)); + } +} diff --git a/ok2curl/src/main/java/com/moczul/ok2curl/CurlBuilder.java b/ok2curl/src/main/java/com/moczul/ok2curl/CurlBuilder.java index a51a83f..9bb98cf 100644 --- a/ok2curl/src/main/java/com/moczul/ok2curl/CurlBuilder.java +++ b/ok2curl/src/main/java/com/moczul/ok2curl/CurlBuilder.java @@ -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 options; - private List
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 options; + protected final List
headers; + protected final String delimiter; public CurlBuilder(Request request) { this(request, -1L, Collections.emptyList(), Options.EMPTY); @@ -46,22 +46,27 @@ public CurlBuilder(Request request, long limit, List headerModif public CurlBuilder(Request request, long limit, List 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
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 headerModifiers) { @@ -136,7 +141,7 @@ public String build() { return join(delimiter, parts); } - private boolean containsName(String name, List
headers) { + protected boolean containsName(String name, List
headers) { for (Header header : headers) { if (header.name().equals(name)) { return true; diff --git a/ok2curl/src/main/java/com/moczul/ok2curl/CurlInterceptor.java b/ok2curl/src/main/java/com/moczul/ok2curl/CurlInterceptor.java index 8830fc7..0b157db 100644 --- a/ok2curl/src/main/java/com/moczul/ok2curl/CurlInterceptor.java +++ b/ok2curl/src/main/java/com/moczul/ok2curl/CurlInterceptor.java @@ -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 headerModifiers = new ArrayList<>(); - private final Options options; - private final String delimiter; + protected final Loggable logger; + protected final long limit; + protected final List headerModifiers = new ArrayList<>(); + protected final Options options; + protected final String delimiter; /** * Interceptor responsible for printing curl logs @@ -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); + } } diff --git a/ok2curl/src/main/java/com/moczul/ok2curl/StringUtil.java b/ok2curl/src/main/java/com/moczul/ok2curl/StringUtil.java index 00c6013..450432f 100644 --- a/ok2curl/src/main/java/com/moczul/ok2curl/StringUtil.java +++ b/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.