org.sfs.util.SfsHttpUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.sfs.util.SfsHttpUtil.java

Source

/*
 * Copyright 2016 The Simple File Server Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.sfs.util;

import com.google.common.net.HttpHeaders;
import io.vertx.core.MultiMap;
import io.vertx.core.http.HttpServerRequest;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

public class SfsHttpUtil {

    public static int getPortOrDefault(URI uri) {
        int port = uri.getPort();
        if (port == -1) {
            String schema = uri.getScheme();
            if ("https".equalsIgnoreCase(schema)) {
                return 443;
            } else if ("http".equalsIgnoreCase(schema)) {
                return 80;
            }
        }
        return port;
    }

    public static String toRelativeURI(URI uri) {
        StringBuilder sb = new StringBuilder();
        if (uri.getRawPath() != null)
            sb.append(uri.getRawPath());
        if (uri.getRawQuery() != null) {
            sb.append('?');
            sb.append(uri.getRawQuery());
        }

        if (uri.getRawFragment() != null) {
            sb.append('#');
            sb.append(uri.getRawFragment());
        }
        return sb.toString();
    }

    public static String getRemoteServiceUrl(HttpServerRequest httpServerRequest) {
        try {
            URI absoluteRequestURI = new URI(httpServerRequest.absoluteURI());
            MultiMap headers = httpServerRequest.headers();

            String host = getFirstHeader(httpServerRequest, "X-Forwarded-Host");
            String contextRoot = getFirstHeader(httpServerRequest, SfsHttpHeaders.X_CONTEXT_ROOT);
            if (host == null)
                host = getFirstHeader(httpServerRequest, HttpHeaders.HOST);
            if (host == null)
                host = absoluteRequestURI.getHost();
            String proto = headers.get(HttpHeaders.X_FORWARDED_PROTO);
            if (proto == null)
                proto = absoluteRequestURI.getScheme();

            String serviceUrl;
            if (contextRoot != null) {
                serviceUrl = String.format("%s://%s/%s", proto, host, contextRoot);
            } else {
                serviceUrl = String.format("%s://%s", proto, host);
            }
            return serviceUrl;
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

    public static String getRemoteRequestUrl(HttpServerRequest httpServerRequest) {
        String path = httpServerRequest.path();
        String query = httpServerRequest.query();

        String serviceUrl = getRemoteServiceUrl(httpServerRequest);
        return String.format("%s/%s%s", serviceUrl, path, query != null ? ("?" + query) : "");
    }

    public static String getAuthority(HttpServerRequest httpServerRequest) {
        try {
            String uriAsString = getRemoteRequestUrl(httpServerRequest);
            URI uri = new URI(uriAsString);
            String authority = uri.getAuthority();
            Objects.requireNonNull(authority, "%s does not container Authority part");
            return authority;
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

    public static String getFirstParameter(HttpServerRequest httpServerRequest, CharSequence parameterName) {
        List<String> all = getParameters(httpServerRequest, parameterName);
        if (!all.isEmpty()) {
            return all.get(0);
        } else {
            return null;
        }
    }

    public static List<String> getParameters(HttpServerRequest httpServerRequest,
            final CharSequence parameterName) {
        List<String> all = httpServerRequest.params().getAll(parameterName);
        if (all != null) {
            return all;
        } else {
            return Collections.emptyList();
        }
    }

    public static String getFirstHeader(HttpServerRequest httpServerRequest, CharSequence parameterName) {
        List<String> all = getHeaders(httpServerRequest, parameterName);
        if (!all.isEmpty()) {
            return all.get(0);
        } else {
            return null;
        }
    }

    public static List<String> getHeaders(HttpServerRequest httpServerRequest, CharSequence headerName) {
        List<String> all = httpServerRequest.headers().getAll(headerName);
        if (all != null) {
            return all;
        } else {
            return Collections.emptyList();
        }
    }
}