| /* |
| * libjingle |
| * Copyright 2015 Google Inc. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * 3. The name of the author may not be used to endorse or promote products |
| * derived from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
| * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
| * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| package org.appspot.apprtc.util; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.net.HttpURLConnection; |
| import java.net.SocketTimeoutException; |
| import java.net.URL; |
| import java.util.Scanner; |
| |
| /** |
| * Asynchronous http requests implementation. |
| */ |
| public class AsyncHttpURLConnection { |
| private static final int HTTP_TIMEOUT_MS = 5000; |
| private final String method; |
| private final String url; |
| private final String message; |
| private final AsyncHttpEvents events; |
| |
| /** |
| * Http requests callbacks. |
| */ |
| public interface AsyncHttpEvents { |
| public void onHttpError(String errorMessage); |
| public void onHttpComplete(String response); |
| } |
| |
| public AsyncHttpURLConnection(String method, String url, String message, |
| AsyncHttpEvents events) { |
| this.method = method; |
| this.url = url; |
| this.message = message; |
| this.events = events; |
| } |
| |
| public void send() { |
| Runnable runHttp = new Runnable() { |
| public void run() { |
| sendHttpMessage(); |
| } |
| }; |
| new Thread(runHttp).start(); |
| } |
| |
| private void sendHttpMessage() { |
| try { |
| HttpURLConnection connection = |
| (HttpURLConnection) new URL(url).openConnection(); |
| byte[] postData = new byte[0]; |
| if (message != null) { |
| postData = message.getBytes("UTF-8"); |
| } |
| connection.setRequestMethod(method); |
| connection.setUseCaches(false); |
| connection.setDoInput(true); |
| connection.setConnectTimeout(HTTP_TIMEOUT_MS); |
| connection.setReadTimeout(HTTP_TIMEOUT_MS); |
| boolean doOutput = false; |
| if (method.equals("POST")) { |
| doOutput = true; |
| connection.setDoOutput(true); |
| connection.setFixedLengthStreamingMode(postData.length); |
| } |
| connection.setRequestProperty( |
| "content-type", "text/plain; charset=utf-8"); |
| |
| // Send POST request. |
| if (doOutput && postData.length > 0) { |
| OutputStream outStream = connection.getOutputStream(); |
| outStream.write(postData); |
| outStream.close(); |
| } |
| |
| // Get response. |
| int responseCode = connection.getResponseCode(); |
| if (responseCode != 200) { |
| events.onHttpError("Non-200 response to " + method + " to URL: " |
| + url + " : " + connection.getHeaderField(null)); |
| return; |
| } |
| InputStream responseStream = connection.getInputStream(); |
| String response = drainStream(responseStream); |
| responseStream.close(); |
| events.onHttpComplete(response); |
| } catch (SocketTimeoutException e) { |
| events.onHttpError("HTTP " + method + " to " + url + " timeout"); |
| } catch (IOException e) { |
| events.onHttpError("HTTP " + method + " to " + url + " error: " |
| + e.getMessage()); |
| } |
| } |
| |
| // Return the contents of an InputStream as a String. |
| private static String drainStream(InputStream in) { |
| Scanner s = new Scanner(in).useDelimiter("\\A"); |
| return s.hasNext() ? s.next() : ""; |
| } |
| } |