skolplattformen-backup/apps/skolplattformen-app/android/app/src/main/java/org/skolplattformen/app/CookieInterceptor.java

80 lines
3.1 KiB
Java

package org.skolplattformen.app;
import android.util.Log;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import kotlin.Pair;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
class CookieInterceptor implements Interceptor {
private final List<Cookie> cookies;
private final CookieJar cookieJar;
public CookieInterceptor(CookieJar cookieJar) {
this.cookies = new ArrayList<>();
this.cookieJar = cookieJar;
}
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
// TODO: Clean up the code so only the necessary feeding of cookies to
// the cookie jar remains. That is needed because of:
// https://reactnative.dev/docs/0.64/network#known-issues-with-fetch-and-cookie-based-authentication
// Specifically react native's fetch does not respect multiple `set-cookie` headers and only
// seem to set one cookie per request. Some of the login calls in the api-hjarntorget lib
// receives multiple `set-cookie` headers.
String domain = chain.request().url().topPrivateDomain();
Log.d("Skolplattformen", "requseting resource on domain: " + domain);
if(domain == null || !domain.contains("goteborg.se") && !domain.contains("funktionstjanster.se")) {
return chain.proceed(chain.request());
}
Log.d("Skolplattformen", "\n\n<<<<<<<<<<<<<<<<<<<<< BEGIN >>>>>>>>>>>>>>>>>>");
Log.d("Skolplattformen", "" + chain.request().method() + " " + chain.request().url());
Log.d("Skolplattformen", "url have length: " + chain.request().url().toString().length());
Iterator<Pair<String, String>> iterator = chain.request().headers().iterator();
while (iterator.hasNext()) {
Pair<String, String> header = iterator.next();
Log.d("Skolplattformen", "SENT " + header.getFirst() + ": " + header.getSecond() + "");
}
Request request = chain.request();
Response response = chain.proceed(request);
String location = response.header("Location");
location = location != null ? location : "";
Log.d("Skolplattformen", "url=" + response.request().url());
Log.d("Skolplattformen", "isRedirect=" + response.isRedirect());
Log.d("Skolplattformen", "responseCode=" + response.code());
Log.d("Skolplattformen", "redirectUri has length=" + location.length());
iterator = response.headers().iterator();
cookies.clear();
while (iterator.hasNext()) {
Pair<String, String> header = iterator.next();
Log.d("Skolplattformen", "RECEIVED " + header.getFirst() + ": " + header.getSecond() + "");
if (header.getFirst().equals("Set-Cookie")) {
Cookie c = Cookie.parse(response.request().url(), header.getSecond());
cookies.add(c);
}
}
HttpUrl url = new HttpUrl.Builder().host(request.url().host()).scheme("https").build();
cookieJar.saveFromResponse(url, cookies);
Log.d("Skolplattformen", "<<<<<<<<<<<<<<<<<<<<< END >>>>>>>>>>>>>>>>>>\n\n");
return response;
}
}