CurlLogger: Log Http Request as cUrl Command


During development, we may want to log http request as cUrl command, so if the request failed, we can easily run it in cmd and check what's wrong, such as: are some header/params missing, ectc

Android already has CurlLogger.java, based on it, I wrote the following code in our spring application to log cUrl command in development mode.
CurlLoggerRequestInterceptor
@Component
public class CurlLoggerRequestInterceptor implements ClientHttpRequestInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(CurlLoggerRequestInterceptor.class);
    private static final Joiner JOINER = Joiner.on(",").skipNulls();

    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
            throws IOException {
        logger.info(toCurl(request, true));

        return execution.execute(request, body);
    }
    private static String toCurl(HttpRequest request, boolean logAuthToken) throws IOException {
        StringBuilder builder = new StringBuilder().append("curl ");
        for (Entry<String, List<String>> entry : request.getHeaders().entrySet()) {
            builder.append("--header \'");
            if (!logAuthToken && (entry.getKey().equals("Authorization") || entry.getKey().equals("Cookie"))) {
                builder.append(entry.getKey()).append(": ").append("${token}");
            } else {
                builder.append(entry.getKey()).append(": ").append(JOINER.join(entry.getValue()));
            }
            builder.append("\' ");
        }
        URI uri = request.getURI();
        if (request instanceof HttpRequestWrapper) {
            HttpRequest original = ((HttpRequestWrapper) request).getRequest();
            uri = original.getURI();
        }
        builder.append("\'").append(uri).append("\'");

        return builder.toString();
    }
}
RestTemplateConfig
@Configuration
public class RestTemplateConfig {
    @Value("${enable.curl.log:false}")
    private boolean enableCurlLog;
    @Autowired
    private ClientHttpRequestInterceptor curlLoggerRequestInterceptor;
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate template = new RestTemplate(clientFactory());
        ArrayList<ClientHttpRequestInterceptor> interceptors = Lists.newArrayList();
        if (enableCurlLog) {
            interceptors.add(curlLoggerRequestInterceptor);
        }
        template.setInterceptors(interceptors);
        return template;
    }
}

Resource
Android CurlLogger.java

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)