com.landawn.abacus.http.HttpClient Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of abacus-util-se Show documentation
Show all versions of abacus-util-se Show documentation
A general programming library in Java/Android. It's easy to learn and simple to use with concise and powerful APIs.
/*
* Copyright (C) 2015 HaiYang Li
*
* 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 com.landawn.abacus.http;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSocketFactory;
import com.landawn.abacus.exception.UncheckedIOException;
import com.landawn.abacus.http.HttpHeaders.Names;
import com.landawn.abacus.logging.Logger;
import com.landawn.abacus.logging.LoggerFactory;
import com.landawn.abacus.type.Type;
import com.landawn.abacus.util.BufferedReader;
import com.landawn.abacus.util.BufferedWriter;
import com.landawn.abacus.util.IOUtil;
import com.landawn.abacus.util.N;
import com.landawn.abacus.util.Objectory;
import com.landawn.abacus.util.URLEncodedUtil;
/**
* Any header can be set into the parameter settings
*
*
HttpClient is thread safe.
*
* @author Haiyang Li
* @since 0.8
*/
public final class HttpClient extends AbstractHttpClient {
/** The Constant logger. */
static final Logger logger = LoggerFactory.getLogger(HttpClient.class);
static {
if (IOUtil.IS_PLATFORM_ANDROID) {
// ignore
} else {
final int maxConnections = IOUtil.CPU_CORES * 8;
System.setProperty("http.keepAlive", "true");
System.setProperty("http.maxConnections", String.valueOf(maxConnections));
}
}
/** The net URL. */
protected final URL _netURL;
/** The active connection counter. */
protected final AtomicInteger _activeConnectionCounter;
/**
* Instantiates a new http client.
*
* @param url
*/
protected HttpClient(String url) {
this(url, DEFAULT_MAX_CONNECTION);
}
/**
* Instantiates a new http client.
*
* @param url
* @param maxConnection
*/
protected HttpClient(String url, int maxConnection) {
this(url, maxConnection, DEFAULT_CONNECTION_TIMEOUT, DEFAULT_READ_TIMEOUT);
}
/**
* Instantiates a new http client.
*
* @param url
* @param maxConnection
* @param connectionTimeout
* @param readTimeout
*/
protected HttpClient(String url, int maxConnection, long connectionTimeout, long readTimeout) {
this(url, maxConnection, connectionTimeout, readTimeout, null);
}
/**
* Instantiates a new http client.
*
* @param url
* @param maxConnection
* @param connectionTimeout
* @param readTimeout
* @param settings
* @throws UncheckedIOException the unchecked IO exception
*/
protected HttpClient(String url, int maxConnection, long connectionTimeout, long readTimeout, HttpSettings settings) throws UncheckedIOException {
this(url, maxConnection, connectionTimeout, readTimeout, settings, new AtomicInteger(0));
}
/**
* Instantiates a new http client.
*
* @param url
* @param maxConnection
* @param connectionTimeout
* @param readTimeout
* @param settings
* @param sharedActiveConnectionCounter
*/
protected HttpClient(String url, int maxConnection, long connectionTimeout, long readTimeout, HttpSettings settings,
final AtomicInteger sharedActiveConnectionCounter) {
super(url, maxConnection, connectionTimeout, readTimeout, settings);
try {
this._netURL = new URL(url);
} catch (MalformedURLException e) {
throw N.toRuntimeException(e);
}
this._activeConnectionCounter = sharedActiveConnectionCounter;
}
/**
*
* @param url
* @return
*/
public static HttpClient create(String url) {
return new HttpClient(url);
}
/**
*
* @param url
* @param maxConnection
* @return
*/
public static HttpClient create(String url, int maxConnection) {
return new HttpClient(url, maxConnection);
}
/**
*
* @param url
* @param connectionTimeout
* @param readTimeout
* @return
*/
public static HttpClient create(String url, long connectionTimeout, long readTimeout) {
return new HttpClient(url, DEFAULT_MAX_CONNECTION, connectionTimeout, readTimeout);
}
/**
*
* @param url
* @param maxConnection
* @param connectionTimeout
* @param readTimeout
* @return
*/
public static HttpClient create(String url, int maxConnection, long connectionTimeout, long readTimeout) {
return new HttpClient(url, maxConnection, connectionTimeout, readTimeout);
}
/**
*
* @param url
* @param maxConnection
* @param connectionTimeout
* @param readTimeout
* @param settings
* @return
* @throws UncheckedIOException the unchecked IO exception
*/
public static HttpClient create(String url, int maxConnection, long connectionTimeout, long readTimeout, HttpSettings settings)
throws UncheckedIOException {
return new HttpClient(url, maxConnection, connectionTimeout, readTimeout, settings);
}
/**
*
* @param url
* @param maxConnection
* @param connectionTimeout
* @param readTimeout
* @param settings
* @param sharedActiveConnectionCounter
* @return
*/
public static HttpClient create(String url, int maxConnection, long connectionTimeout, long readTimeout, HttpSettings settings,
final AtomicInteger sharedActiveConnectionCounter) {
return new HttpClient(url, maxConnection, connectionTimeout, readTimeout, settings, sharedActiveConnectionCounter);
}
/**
*
* @param
* @param resultClass
* @param httpMethod
* @param request
* @param settings
* @return
* @throws UncheckedIOException the unchecked IO exception
*/
@Override
public T execute(final Class resultClass, final HttpMethod httpMethod, final Object request, final HttpSettings settings)
throws UncheckedIOException {
return execute(resultClass, null, null, httpMethod, request, settings);
}
/**
*
* @param output
* @param httpMethod
* @param request
* @param settings
* @throws UncheckedIOException the unchecked IO exception
*/
@Override
public void execute(final File output, final HttpMethod httpMethod, final Object request, final HttpSettings settings) throws UncheckedIOException {
OutputStream os = null;
try {
os = new FileOutputStream(output);
execute(os, httpMethod, request, settings);
} catch (FileNotFoundException e) {
throw new UncheckedIOException(e);
} finally {
IOUtil.close(os);
}
}
/**
*
* @param output
* @param httpMethod
* @param request
* @param settings
* @throws UncheckedIOException the unchecked IO exception
*/
@Override
public void execute(final OutputStream output, final HttpMethod httpMethod, final Object request, final HttpSettings settings) throws UncheckedIOException {
execute(null, output, null, httpMethod, request, settings);
}
/**
*
* @param output
* @param httpMethod
* @param request
* @param settings
* @throws UncheckedIOException the unchecked IO exception
*/
@Override
public void execute(final Writer output, final HttpMethod httpMethod, final Object request, final HttpSettings settings) throws UncheckedIOException {
execute(null, null, output, httpMethod, request, settings);
}
/**
*
* @param
* @param resultClass
* @param outputStream
* @param outputWriter
* @param httpMethod
* @param request
* @param settings
* @return
* @throws UncheckedIOException the unchecked IO exception
*/
private T execute(final Class resultClass, final OutputStream outputStream, final Writer outputWriter, final HttpMethod httpMethod,
final Object request, final HttpSettings settings) throws UncheckedIOException {
final Charset requestCharset = HttpUtil.getRequestCharset(settings == null || settings.headers().isEmpty() ? _settings.headers() : settings.headers());
final ContentFormat requestContentFormat = getContentFormat(settings);
final boolean doOutput = request != null && !(httpMethod.equals(HttpMethod.GET) || httpMethod.equals(HttpMethod.DELETE));
final HttpURLConnection connection = openConnection(httpMethod, request, doOutput, settings);
final long sentRequestAtMillis = System.currentTimeMillis();
InputStream is = null;
OutputStream os = null;
try {
if (request != null && (httpMethod.equals(HttpMethod.POST) || httpMethod.equals(HttpMethod.PUT))) {
os = HttpUtil.getOutputStream(connection, requestContentFormat, getContentType(settings), getContentEncoding(settings));
Type
© 2015 - 2025 Weber Informatics LLC | Privacy Policy