use of org.apache.commons.httpclient.contrib.ssl.EasySSLSocketFactory in project Anki-Android by Ramblurr.
the class BasicHttpSyncer method req.
public HttpResponse req(String method, InputStream fobj, int comp, boolean hkey, JSONObject registerData, Connection.CancelCallback cancelCallback) {
File tmpFileBuffer = null;
try {
String bdry = "--" + BOUNDARY;
StringWriter buf = new StringWriter();
HashMap<String, Object> vars = new HashMap<String, Object>();
// compression flag and session key as post vars
vars.put("c", comp != 0 ? 1 : 0);
if (hkey) {
vars.put("k", mHKey);
vars.put("s", mSKey);
}
for (String key : vars.keySet()) {
buf.write(bdry + "\r\n");
buf.write(String.format(Locale.US, "Content-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", key, vars.get(key)));
}
tmpFileBuffer = File.createTempFile("syncer", ".tmp", new File(AnkiDroidApp.getCacheStorageDirectory()));
FileOutputStream fos = new FileOutputStream(tmpFileBuffer);
BufferedOutputStream bos = new BufferedOutputStream(fos);
GZIPOutputStream tgt;
// payload as raw data or json
if (fobj != null) {
// header
buf.write(bdry + "\r\n");
buf.write("Content-Disposition: form-data; name=\"data\"; filename=\"data\"\r\nContent-Type: application/octet-stream\r\n\r\n");
buf.close();
bos.write(buf.toString().getBytes("UTF-8"));
// write file into buffer, optionally compressing
int len;
BufferedInputStream bfobj = new BufferedInputStream(fobj);
byte[] chunk = new byte[65536];
if (comp != 0) {
tgt = new GZIPOutputStream(bos);
while ((len = bfobj.read(chunk)) >= 0) {
tgt.write(chunk, 0, len);
}
tgt.close();
bos = new BufferedOutputStream(new FileOutputStream(tmpFileBuffer, true));
} else {
while ((len = bfobj.read(chunk)) >= 0) {
bos.write(chunk, 0, len);
}
}
bos.write(("\r\n" + bdry + "--\r\n").getBytes("UTF-8"));
} else {
buf.close();
bos.write(buf.toString().getBytes("UTF-8"));
}
bos.flush();
bos.close();
// connection headers
String url = Collection.SYNC_URL;
if (method.equals("register")) {
url = url + "account/signup" + "?username=" + registerData.getString("u") + "&password=" + registerData.getString("p");
} else if (method.startsWith("upgrade")) {
url = url + method;
} else {
url = url + "sync/" + method;
}
HttpPost httpPost = new HttpPost(url);
HttpEntity entity = new ProgressByteEntity(tmpFileBuffer);
// body
httpPost.setEntity(entity);
httpPost.setHeader("Content-type", "multipart/form-data; boundary=" + BOUNDARY);
// HttpParams
HttpParams params = new BasicHttpParams();
params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30);
params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30));
params.setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
params.setParameter(CoreProtocolPNames.USER_AGENT, "AnkiDroid-" + AnkiDroidApp.getPkgVersionName());
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpConnectionParams.setSoTimeout(params, Connection.CONN_TIMEOUT);
// Registry
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", new EasySSLSocketFactory(), 443));
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, registry);
if (cancelCallback != null) {
cancelCallback.setConnectionManager(cm);
}
try {
HttpClient httpClient = new DefaultHttpClient(cm, params);
return httpClient.execute(httpPost);
} catch (SSLException e) {
Log.e(AnkiDroidApp.TAG, "SSLException while building HttpClient", e);
return null;
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
Log.e(AnkiDroidApp.TAG, "BasicHttpSyncer.sync: IOException", e);
return null;
} catch (JSONException e) {
throw new RuntimeException(e);
} finally {
if (tmpFileBuffer != null && tmpFileBuffer.exists()) {
tmpFileBuffer.delete();
}
}
}
Aggregations