com.mobilesolutionworks.android.http.WorksHttpClient Maven / Gradle / Ivy
/*
* Copyright 2014-present Yunarta
*
* 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.mobilesolutionworks.android.http;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.net.http.AndroidHttpClient;
import com.mobilesolutionworks.android.util.IOUtils;
import com.mobilesolutionworks.android.util.TypeUtils;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicNameValuePair;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Works http client, the main class for this library execution.
*/
public class WorksHttpClient {
//-- class member --//
/**
* Application context
*/
private Context mContext;
/**
*
*/
private final String mName;
/**
* Constructor of http client
*
* @param context application context
*/
protected WorksHttpClient(Context context) {
mContext = context.getApplicationContext();
String name = mContext.getPackageName();
try {
PackageManager pm = mContext.getPackageManager();
if (pm != null) {
ApplicationInfo ai = pm.getApplicationInfo(mContext.getPackageName(), 128);
if ((ai != null) && (ai.metaData != null)) {
name = ai.metaData.getString("user_agent");
}
PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), 0);
if (pi != null) {
name = name + " ver-" + pi.versionName + " build-" + pi.versionCode;
}
}
} catch (PackageManager.NameNotFoundException e) {
}
mName = name;
}
/**
* Get the android http client configured for this context
*
* @return the Android http client configured for this context
*/
public AndroidHttpClient getHttpClient() {
return AndroidHttpClient.newInstance(System.getProperty("http.agent"), mContext);
}
/**
* Get the package name and version
*
* @return the package name and version;
*/
public String getName() {
return mName;
}
//-- static member --//
/**
* Works http client instance
*/
private static WorksHttpClient sInstance;
/**
* Get the works http client instance for this application context
*
* @param context application context
* @return works http client instance
*/
public static WorksHttpClient getInstance(Context context) {
if (sInstance == null) {
sInstance = new WorksHttpClient(context);
}
return sInstance;
}
/**
* Execute the request on this works http client.
*
* @param context application context
* @param request works http request
* @param listener works operation listener
* @return works http response
*/
public static WorksHttpResponse executeOperation(Context context, WorksHttpRequest request, final WorksHttpOperationListener listener) {
HttpUriRequest httpRequest;
HttpResponse httpResponse = null;
WorksHttpResponse response = new WorksHttpResponse();
response.request = request;
WorksHttpClient instance = WorksHttpClient.getInstance(context);
AndroidHttpClient client = instance.getHttpClient();
switch (request.method) {
default:
case GET: {
Uri.Builder builder = Uri.parse(request.url).buildUpon();
if (request.httpParams != null) {
for (Map.Entry entry : request.httpParams.entrySet()) {
builder.appendQueryParameter(entry.getKey(), entry.getValue());
}
}
httpRequest = new HttpGet(builder.build().toString());
break;
}
case POST: {
HttpPost httpPost = new HttpPost(request.url);
if (request.httpParams != null) {
List params = new ArrayList();
for (Map.Entry entry : request.httpParams.entrySet()) {
params.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
UrlEncodedFormEntity result;
try {
result = new UrlEncodedFormEntity(params, "UTF-8");
httpPost.setEntity(result);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
httpRequest = httpPost;
}
}
if (request.preExecutor != null) {
request.preExecutor.onPreExecute(request, httpRequest);
}
listener.onPreExecute(request, httpRequest);
httpRequest.addHeader("Works-Http-Client", instance.getName());
try {
httpResponse = client.execute(httpRequest);
if (listener.onValidateResponse(request, httpResponse)) {
boolean handled = false;
try {
handled = listener.onHandleResponse(request, httpRequest, response, httpResponse);
} catch (Exception e) {
response.markErrorInHandler(e);
handled = true;
}
if (!handled) {
int contentLength = -1;
Header[] headers = httpResponse.getHeaders("Content-Length");
if (headers != null) {
for (Header header : headers) {
String value = header.getValue();
contentLength = TypeUtils.parseInt(value);
}
}
if (request.returnTransfer) {
InputStream content = httpResponse.getEntity().getContent();
response.text = IOUtils.consumeAsString(new CountingInputStream(content, listener, contentLength));
} else if (request.out != null) {
InputStream content = httpResponse.getEntity().getContent();
IOUtils.copy(new CountingInputStream(content, listener, contentLength), request.out);
}
response.markSuccess();
}
} else {
response.markInvalidHttpStatus(httpResponse.getStatusLine().getStatusCode());
}
} catch (Exception e) {
response.markErrorInExecution(e);
} finally {
client.close();
if (httpResponse != null) {
try {
httpResponse.getEntity().consumeContent();
} catch (IOException e) {
// e.printStackTrace();
}
}
}
return response;
}
/**
* Input stream for counting purpose.
*/
static class CountingInputStream extends InputStream {
WorksHttpOperationListener mListener;
InputStream mIn;
int mCurrent;
int mMaxSize;
public CountingInputStream(InputStream in, WorksHttpOperationListener listener, int maxSize) {
mIn = in;
mListener = listener;
mMaxSize = maxSize;
}
@Override
public int read(byte[] buffer) throws IOException {
int read = mIn.read(buffer);
if (read != -1) {
mCurrent += read;
mListener.onReadProgressUpdate(mCurrent, mMaxSize);
}
return read;
}
@Override
public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException {
int read = mIn.read(buffer, byteOffset, byteCount);
if (read != -1) {
mCurrent += read;
mListener.onReadProgressUpdate(mCurrent, mMaxSize);
}
return read;
}
@Override
public int read() throws IOException {
int read = mIn.read();
if (read != -1) {
mCurrent += 1;
mListener.onReadProgressUpdate(mCurrent, mMaxSize);
}
return read;
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy