futokb/java/src/com/android/inputmethod/latin/network/BlockingHttpClient.java
Jatin Matani db1b736446 Changes related Sync Engine library that communicates to cloud server
This change updates some of the code that the library uses
to communicate with the cloud server
Specifically :
- Update BlockingHttpClient to use template ResponseProcessor
- Update HttpUrlConnectionBuilder to setAuthToken for HttpUrlConnection

Bug: 17464069
Bug: 17464805

Change-Id: I7d7b58dff594b920162f799d102e8582ff9fe6a4
2014-10-09 00:01:32 -07:00

104 lines
3.5 KiB
Java

/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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.android.inputmethod.latin.network;
import android.util.Log;
import com.android.inputmethod.annotations.UsedForTesting;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/**
* A client for executing HTTP requests synchronously.
* This must never be called from the main thread.
*
* TODO: Remove @UsedForTesting after this is actually used.
*/
@UsedForTesting
public class BlockingHttpClient {
private static final boolean DEBUG = false;
private static final String TAG = BlockingHttpClient.class.getSimpleName();
private final HttpURLConnection mConnection;
/**
* Interface that handles processing the response for a request.
*/
public interface ResponseProcessor<T> {
/**
* Called when the HTTP request finishes successfully.
* The {@link InputStream} is closed by the client after the method finishes,
* so any processing must be done in this method itself.
*
* @param response An input stream that can be used to read the HTTP response.
*/
T onSuccess(InputStream response) throws IOException;
}
/**
* TODO: Remove @UsedForTesting after this is actually used.
*/
@UsedForTesting
public BlockingHttpClient(HttpURLConnection connection) {
mConnection = connection;
}
/**
* Executes the request on the underlying {@link HttpURLConnection}.
*
* TODO: Remove @UsedForTesting after this is actually used.
*
* @param request The request payload, if any, or null.
* @param responseProcessor A processor for the HTTP response.
*/
@UsedForTesting
public <T> T execute(@Nullable byte[] request, @Nonnull ResponseProcessor<T> responseProcessor)
throws IOException, AuthException, HttpException {
try {
if (request != null) {
OutputStream out = new BufferedOutputStream(mConnection.getOutputStream());
out.write(request);
out.flush();
out.close();
}
final int responseCode = mConnection.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) {
if (DEBUG) {
Log.d(TAG, "Response error: " + responseCode + ", Message: "
+ mConnection.getResponseMessage());
}
if (responseCode == HttpURLConnection.HTTP_UNAUTHORIZED) {
throw new AuthException(mConnection.getResponseMessage());
}
throw new HttpException(responseCode);
} else {
return responseProcessor.onSuccess(mConnection.getInputStream());
}
} finally {
mConnection.disconnect();
}
}
}