Вот начало трассировки стека :
Код: Выделить всё
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String okhttp3.Cookie.name()' on a null object reference
at okhttp3.internal.http.BridgeInterceptor.cookieHeader(SourceFile:39)
Код: Выделить всё
private fun cookieHeader(cookies: List): String = buildString {
cookies.forEachIndexed { index, cookie ->
if (index > 0) append("; ")
append(cookie.name).append('=').append(cookie.value) // here
}
}
Код: Выделить всё
// ...
val cookies = cookieJar.loadForRequest(userRequest.url)
if (cookies.isNotEmpty()) {
requestBuilder.header("Cookie", cookieHeader(cookies)) // only called here
}
// ...
Код: Выделить всё
interface CookieJar {
/**
* Saves [cookies] from an HTTP response to this store according to this jar's policy.
*
* Note that this method may be called a second time for a single HTTP response if the response
* includes a trailer. For this obscure HTTP feature, [cookies] contains only the trailer's
* cookies.
*/
fun saveFromResponse(url: HttpUrl, cookies: List)
/**
* Load cookies from the jar for an HTTP request to [url]. This method returns a possibly
* empty list of cookies for the network request.
*
* Simple implementations will return the accepted cookies that have not yet expired and that
* [match][Cookie.matches] [url].
*/
fun loadForRequest(url: HttpUrl): List
Код: Выделить всё
class OkHttpCookieJar() : CookieJar {
companion object {
var cookieStore = mutableMapOf()
fun clearCookies() {
cookieStore = mutableMapOf()
}
}
override fun saveFromResponse(url: HttpUrl, cookies: List) {
if (cookies.isEmpty()) {
return
}
val urlString = url.toString()
for (cookie in cookies) {
cookieStore[cookie.name] = cookie
}
}
override fun loadForRequest(url: HttpUrl): List {
return cookieStore.values.toList()
}
}
Код: Выделить всё
fun CookieJar.receiveHeaders(url: HttpUrl, headers: Headers) {
if (this === CookieJar.NO_COOKIES) return
val cookies = Cookie.parseAll(url, headers)
if (cookies.isEmpty()) return
saveFromResponse(url, cookies) // here
}
Код: Выделить всё
@JvmStatic
fun parseAll(url: HttpUrl, headers: Headers): List {
val cookieStrings = headers.values("Set-Cookie")
var cookies: MutableList? = null
for (i in 0 until cookieStrings.size) {
val cookie = parse(url, cookieStrings[i]) ?: continue // skips to next iteration if null
if (cookies == null) cookies = mutableListOf()
cookies.add(cookie)
}
return if (cookies != null) {
Collections.unmodifiableList(cookies)
} else {
emptyList()
}
}
Моя первая теория заключалась в том, что какой-то Java-код в okhttp каким-то образом удалось проникнуть в нулевой файл cookie, но код в версии, которую я использую (4.10.0), полностью написан на Kotlin.
Заранее благодарен за любую предоставленную информацию.
Подробнее здесь: https://stackoverflow.com/questions/789 ... ookie-name
Мобильная версия