All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nutz.http.Http Maven / Gradle / Ivy

Go to download

Nutz, which is a collections of lightweight frameworks, each of them can be used independently

There is a newer version: 1.r.72
Show newest version
package org.nutz.http;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.nutz.http.Request.METHOD;
import org.nutz.http.sender.FilePostSender;
import org.nutz.lang.Encoding;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;

public class Http {

    /**
     * @see https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
     */
    private static final Map code_text = new HashMap();

    {
        code_text.put(100, "Continue");
        code_text.put(101, "Switching Protocols");
        code_text.put(102, "Processing");
        code_text.put(200, "OK");
        code_text.put(201, "Created");
        code_text.put(202, "Accepted");
        code_text.put(203, "Non-Authoritative Information"); // (since HTTP/1.1)
        code_text.put(204, "No Content");
        code_text.put(205, "Reset Content");
        code_text.put(206, "Partial Content");
        code_text.put(207, "Multi-Status");
        code_text.put(208, "Already Reported");
        code_text.put(226, "IM Used");

        code_text.put(301, "Moved Permanently");
        code_text.put(302, "Found");
        code_text.put(303, "See Other"); // (since HTTP/1.1)
        code_text.put(304, "Not Modified ");
        code_text.put(305, "Use Proxy"); // (since HTTP/1.1)
        code_text.put(306, "Switch Proxy");
        code_text.put(307, "Temporary Redirect"); // (since HTTP/1.1)
        code_text.put(308, "Permanent Redirect");

        code_text.put(400, "Bad Request");
        code_text.put(401, "Unauthorized");
        code_text.put(402, "Payment Required");
        code_text.put(403, "Forbidden");
        code_text.put(404, "Not Found");
        code_text.put(405, "Method Not Allowed");
        code_text.put(406, "Not Acceptable");
        code_text.put(407, "Proxy Authentication Required ");
        code_text.put(408, "Request Timeout");
        code_text.put(409, "Conflict");
        code_text.put(410, "Gone");
        code_text.put(411, "Length Required");
        code_text.put(412, "Precondition Failed");
        code_text.put(413, "Payload Too Large");
        code_text.put(414, "URI Too Long");
        code_text.put(415, "Unsupported Media Type");
        code_text.put(416, "Range Not Satisfiable");
        code_text.put(417, "Expectation Failed");
        // ... 后面的 4xx 都是什么鬼 -_-! 先不抄了吧

        code_text.put(500, "Internal Server Error");
        code_text.put(501, "Not Implemented");
        code_text.put(502, "Bad Gateway");
        code_text.put(503, "Service Unavailable");
        code_text.put(504, "Gateway Timeout");
        code_text.put(505, "HTTP Version Not Supported");
        code_text.put(506, "Variant Also Negotiates");
        code_text.put(507, "Insufficient Storage ");
        code_text.put(508, "Loop Detected");
        code_text.put(509, "Bandwidth Limit Exceeded ");
        code_text.put(510, "Not Extended ");
        code_text.put(511, "Network Authentication Required");
        code_text.put(520, "Unknown Error");
        code_text.put(522, "Origin Connection Time-out");
        code_text.put(598, "Network read timeout error ");
        code_text.put(599, "Network connect timeout error");
    }

    public static String getStatusText(int statusCode) {
        return code_text.get(statusCode);
    }

    public static String getStatusText(int statusCode, String dft) {
        return Strings.sNull(code_text.get(statusCode), dft);
    }

    public static class multipart {
        public static String getBoundary(String contentType) {
            if (null == contentType)
                return null;
            for (String tmp : contentType.split(";")) {
                tmp = tmp.trim();
                if (tmp.startsWith("boundary=")) {
                    return tmp.substring("boundary=".length());
                }
            }
            return null;
        }

        public static String formatName(String name, String filename, String contentType) {
            StringBuilder sb = new StringBuilder();
            sb.append("Content-Disposition: form-data; name=\"");
            sb.append(name);
            sb.append("\"");
            if (null != filename)
                sb.append("; filename=\"" + filename + "\"");
            if (null != contentType)
                sb.append("\nContent-Type: " + contentType);
            sb.append('\n' + '\n');
            return sb.toString();
        }

        public static String formatName(String name) {
            return formatName(name, null, null);
        }
    }

    /**
     * 访问一个URL
     * 
     * @param url
     *            需要访问的URL
     * @return http响应
     */
    public static Response get(String url) {
        return Sender.create(Request.get(url)).send();
    }

    /**
     * 访问一个URL,并设置超时
     * 
     * @param url
     *            需要访问的URL
     * @param timeout
     *            超时设置,单位为毫秒
     * @return http响应
     */
    public static Response get(String url, int timeout) {
        return Sender.create(Request.get(url)).setTimeout(timeout).send();
    }

    /**
     * 访问一个URL,并设置超时及参数
     * 
     * @param url
     *            需要访问的URL
     * @param params
     *            参数
     * @param timeout
     *            超时设置,单位为毫秒
     * @return http响应
     */
    public static String post(String url, Map params, int timeout) {
        return Sender.create(Request.create(url, METHOD.POST, params, null))
                     .setTimeout(timeout)
                     .send()
                     .getContent();
    }

    /**
     * 访问一个URL,并设置超时及参数
     * 
     * @param url
     *            需要访问的URL
     * @param params
     *            参数
     * @param timeout
     *            超时设置,单位为毫秒
     * @return http响应
     */
    public static Response post2(String url, Map params, int timeout) {
        return Sender.create(Request.create(url, METHOD.POST, params, null))
                     .setTimeout(timeout)
                     .send();
    }

    public static Response post3(String url, Object body, Header header, int timeout) {
        Request req = Request.create(url, METHOD.POST).setHeader(header);
        if (body != null) {
            if (body instanceof InputStream) {
                req.setInputStream((InputStream) body);
            } else if (body instanceof byte[]) {
                req.setData((byte[]) body);
            } else {
                req.setData(String.valueOf(body));
            }
        }
        return Sender.create(req).setTimeout(timeout).send();
    }

    public static Response upload(String url,
                                  Map params,
                                  Header header,
                                  int timeout) {
        Request req = Request.create(url, METHOD.POST, params, header);
        return new FilePostSender(req).setTimeout(timeout).send();
    }

    public static String encode(Object s) {
        return encode(s, null);
    }

    public static String encode(Object s, String enc) {
        if (null == s)
            return "";
        try {
            // Fix issue 283, 按照“茶几”的意见再次修改
            return URLEncoder.encode(s.toString(),
                                     enc == null ? Encoding.CHARSET_UTF8.name() : enc);
        }
        catch (UnsupportedEncodingException e) {
            throw Lang.wrapThrow(e);
        }
    }

    public static String post(String url, Map params, String inenc, String reenc) {
        return Sender.create(Request.create(url, METHOD.POST, params, null).setEnc(inenc))
                     .send()
                     .getContent(reenc);
    }

    protected static ProxySwitcher proxySwitcher;

    protected static boolean autoSwitch;

    public static void setAutoSwitch(boolean use) {
        autoSwitch = use;
    }

    public static void setHttpProxy(String host, int port) {
        final Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));
        proxySwitcher = new ProxySwitcher() {
            public Proxy getProxy(URL url) {
                return proxy;
            }

            public Proxy getProxy(Request req) {
                if ("close".equals(req.getHeader().get("NoProxy")))
                    return null;
                String url = req.getUrl().toString();
                if (url.startsWith("http")
                    && url.contains("://")
                    && url.length() > "https://".length()) {
                    url = url.substring(url.indexOf("://") + "://".length());
                    if (url.startsWith("127.0.0") || url.startsWith("localhost"))
                        return null;
                }
                req.getHeader().set("Connection", "close");
                return getProxy(req.getUrl());
            }
        };
    }

    public static void setSocktProxy(String host, int port) {
        final Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(host, port));
        proxySwitcher = new ProxySwitcher() {
            public Proxy getProxy(URL url) {
                return proxy;
            }

            public Proxy getProxy(Request req) {
                if ("close".equals(req.getHeader().get("NoProxy")))
                    return null;
                String url = req.getUrl().toString();
                if (url.startsWith("http")
                    && url.contains("://")
                    && url.length() > "https://".length()) {
                    url = url.substring(url.indexOf("://"));
                    if (url.startsWith("127.0.0") || url.startsWith("localhost"))
                        return null;
                }
                req.getHeader().set("Connection", "close");
                return getProxy(req.getUrl());
            }
        };
    }

    public static ProxySwitcher getProxySwitcher() {
        return proxySwitcher;
    }

    public static void setProxySwitcher(ProxySwitcher proxySwitcher) {
        Http.proxySwitcher = proxySwitcher;
    }

    /**
     * 禁用JVM的https证书验证机制, 例如访问12306, 360 openapi之类的自签名证书
     * 
     * @return 禁用成功与否
     */
    public static boolean disableJvmHttpsCheck() {
        try {
            SSLContext sc = SSLContext.getInstance("SSL");
            TrustManager[] tmArr = {new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate,
                                               String paramString) throws CertificateException {}

                public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate,
                                               String paramString) throws CertificateException {}

                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            }};
            sc.init(null, tmArr, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            return true;
        }
        catch (KeyManagementException e) {
            return false;
        }
        catch (NoSuchAlgorithmException e) {
            return false;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy