/*
* Copyright 2010 Kevin Gaudin
*
* 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 kidozen.client.crash;
import android.util.Log;
import org.apache.http.HttpStatus;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import kidozen.client.KZHttpMethod;
import kidozen.client.KZService;
import kidozen.client.ServiceEvent;
import kidozen.client.ServiceEventListener;
import kidozen.client.authentication.IdentityManager;
import kidozen.client.authentication.KidoZenUser;
import kidozen.client.internal.Constants;
import kidozen.client.internal.SNIConnectionManager;
import static kidozen.client.crash.CrashReporter.LOG_TAG;
public class HttpSender extends KZService implements ReportSender {
private String mCrashEndpoint;
private SNIConnectionManager mSniManager;
private long DEFAULT_TIMEOUT = 2;
private String mApplicationKey = "none";
private String mToken = "empty";
private ArrayList<String> mBreadCrumbs;
private static final String APPLICATION_BREADCRUMB = "APPLICATION_BREADCRUMB";
private ServiceEvent mEvent = null;
public HttpSender(String crashEndpoint, String token) {
mApplicationKey = token;
mCrashEndpoint = crashEndpoint;
mBreadCrumbs = new ArrayList<String>();
}
public void AddBreadCrumb(String value) {
mBreadCrumbs.add(value);
}
@Override
public void send(CrashReportData report) throws ReportSenderException {
try
{
final CountDownLatch cdl = new CountDownLatch(1);
IdentityManager.getInstance().GetRawToken(mApplicationKey, new ServiceEventListener() {
@Override
public void onFinish(ServiceEvent e) {
mEvent = e;
cdl.countDown();
}
});
cdl.await(DEFAULT_TIMEOUT, TimeUnit.MINUTES);
if (mEvent.Exception!=null || mEvent.StatusCode >= HttpStatus.SC_BAD_REQUEST) throw new ReportSenderException(mEvent.Body);
mToken = ((KidoZenUser) mEvent.Response).Token;
String authHeaderValue = String.format("WRAP access_token=\"%s\"", mToken);
Log.d(LOG_TAG, String.format("About to send log to Log V3 service: %s ", mCrashEndpoint));
JSONObject reportAsJson = report.toJSON();
String bc = new JSONArray(mBreadCrumbs).toString();
reportAsJson.put(APPLICATION_BREADCRUMB, bc);
Hashtable<String, String> headers = new Hashtable<String, String>();
headers.put(Constants.AUTHORIZATION_HEADER,authHeaderValue);
headers.put(Constants.CONTENT_TYPE, Constants.APPLICATION_JSON);
headers.put(Constants.ACCEPT, Constants.APPLICATION_JSON);
mSniManager = new SNIConnectionManager(mCrashEndpoint, reportAsJson.toString(), headers, null, true);
Hashtable<String, String> response = mSniManager.ExecuteHttp(KZHttpMethod.POST);
String body = response.get("responseBody");
Integer statusCode = Integer.parseInt(response.get("statusCode"));
if (statusCode>= HttpStatus.SC_MULTIPLE_CHOICES) {
String exceptionMessage = (body!=null ? body : "Unexpected HTTP Status Code: " + statusCode);
throw new Exception(exceptionMessage);
}
}
catch (InterruptedException e) {
throw new ReportSenderException("Timeout trying to send report to KidoZen services." , e);
}
catch (ReportSenderException e) {
throw e;
}
catch (Exception e) {
throw new ReportSenderException("Error while sending report to KidoZen services." , e);
}
}
}