net.jadler.stubbing.server.jdk.RequestUtils.java Source code

Java tutorial

Introduction

Here is the source code for net.jadler.stubbing.server.jdk.RequestUtils.java

Source

/*
 * Copyright (c) 2012 - 2016 Jadler contributors
 * This program is made available under the terms of the MIT License.
 */
package net.jadler.stubbing.server.jdk;

import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import net.jadler.Request;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class RequestUtils {
    private static final Pattern CHARSET_PATTERN = Pattern.compile("(?i).*\\bcharset=\\s*\"?([^\\s;\"]*)");

    static Request convert(final HttpExchange httpExchange) throws IOException {
        final Request.Builder builder = Request.builder().method(httpExchange.getRequestMethod())
                .requestURI(httpExchange.getRequestURI()).body(IOUtils.toByteArray(httpExchange.getRequestBody()));

        addEncoding(builder, httpExchange);
        addHeaders(builder, httpExchange);

        return builder.build();
    }

    //package protected for testing purposes
    static void addEncoding(final Request.Builder builder, final HttpExchange httpExchange) {
        final String contentType = httpExchange.getRequestHeaders().getFirst("Content-Type");
        if (contentType != null) {
            final Matcher matcher = CHARSET_PATTERN.matcher(contentType);
            if (matcher.matches()) {
                try {
                    builder.encoding(Charset.forName(matcher.group(1)));
                } catch (UnsupportedCharsetException e) {
                    //just ignore, fallback encoding will be used instead
                }
            }
        }
    }

    private static void addHeaders(final Request.Builder builder, final HttpExchange httpExchange) {
        final Headers requestHeaders = httpExchange.getRequestHeaders();
        for (final String key : requestHeaders.keySet()) {
            for (final String value : requestHeaders.get(key)) {
                builder.header(key, value);
            }
        }
    }
}