package com.koushikdutta.ion.cookie;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.util.Log;
import com.koushikdutta.async.http.Headers;
import com.koushikdutta.async.http.SimpleMiddleware;
import com.koushikdutta.ion.Ion;
import java.net.CookieManager;
import java.net.CookieStore;
import java.net.HttpCookie;
import java.net.URI;
import java.util.List;
import java.util.Map;
/**
* Created by koush on 5/29/13.
*/
public class CookieMiddleware extends SimpleMiddleware {
CookieManager manager;
SharedPreferences preferences;
public CookieStore getCookieStore() {
return manager.getCookieStore();
}
public void clear() {
maybeInit();
getCookieStore().removeAll();
preferences.edit().clear().apply();
}
public CookieManager getCookieManager() {
maybeInit();
return manager;
}
Ion ion;
public CookieMiddleware(Ion ion) {
this.ion = ion;
}
public void reinit() {
manager = new CookieManager(null, null);
preferences = ion.getContext().getSharedPreferences(ion.getName() + "-cookies", Context.MODE_PRIVATE);
Map<String, ?> allPrefs = preferences.getAll();
for (String key: allPrefs.keySet()) {
try {
String value = preferences.getString(key, null);
Headers headers = new Headers();
String[] lines = value.split("\n");
boolean first = true;
for (String line: lines) {
if (first) {
first = false;
}
else if (!TextUtils.isEmpty(line)) {
headers.addLine(line);
}
}
manager.put(URI.create(key), headers.getMultiMap());
}
catch (Exception e) {
Log.e("Ion", "unable to load cookies", e);
}
}
}
public static void addCookies(Map<String, List<String>> allCookieHeaders, Headers headers) {
for (Map.Entry<String, List<String>> entry : allCookieHeaders.entrySet()) {
String key = entry.getKey();
if ("Cookie".equalsIgnoreCase(key) || "Cookie2".equalsIgnoreCase(key)) {
headers.addAll(key, entry.getValue());
}
}
}
private void maybeInit() {
if (manager == null)
reinit();
}
@Override
public void onRequest(OnRequestData data) {
maybeInit();
try {
Map<String, List<String>> cookies = manager.get(
URI.create(
data.request.getUri().toString()),
data.request.getHeaders().getMultiMap());
addCookies(cookies, data.request.getHeaders());
}
catch (Exception e) {
}
}
@Override
public void onHeadersReceived(OnHeadersReceivedDataOnRequestSentData data) {
maybeInit();
try {
put(URI.create(data.request.getUri().toString()), data.response.headers());
}
catch (Exception e) {
}
}
public void put(URI uri, Headers headers) {
maybeInit();
try {
manager.put(uri, headers.getMultiMap());
// no cookies to persist.
if (headers.get("Set-Cookie") == null)
return;
List<HttpCookie> cookies = manager.getCookieStore().get(uri);
Headers dump = new Headers();
for (HttpCookie cookie: cookies) {
dump.add("Set-Cookie", cookie.getName() + "=" + cookie.getValue());
}
String key = uri.getScheme() + "://" + uri.getAuthority();
preferences.edit().putString(key, dump.toPrefixString("HTTP/1.1 200 OK")).commit();
}
catch (Exception e) {
}
}
}