From 5f1491975587b3f4b1c4502ff3ee7243d6dc828b Mon Sep 17 00:00:00 2001 From: tarsin Date: Tue, 25 Apr 2023 14:29:23 +0800 Subject: [PATCH] Cleanup Okhttp API usage --- .../com/hippo/ehviewer/client/EhEngine.kt | 77 ++++++++----------- .../hippo/ehviewer/client/EhRequestBuilder.kt | 22 +++--- .../com/hippo/ehviewer/spider/SpiderQueen.kt | 16 +--- .../com/hippo/okhttp/ChromeRequestBuilder.kt | 35 --------- 4 files changed, 46 insertions(+), 104 deletions(-) delete mode 100644 app/src/main/java/com/hippo/okhttp/ChromeRequestBuilder.kt diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt index e86f8afbe..5fa2687a2 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.kt @@ -125,8 +125,8 @@ private fun rethrowExactly(code: Int, headers: Headers, body: String, e: Throwab throw e } -private suspend inline fun Request.Builder.executeAndParsingWith(block: String.() -> T): T { - return okHttpClient.newCall(this.build()).executeAsync().use { response -> +private suspend inline fun Request.executeAndParsingWith(block: String.() -> T): T { + return okHttpClient.newCall(this).executeAsync().use { response -> val body = response.body.string() runCatching { block(body) @@ -149,8 +149,7 @@ object EhEngine { val url = EhUrl.API_SIGN_IN val origin = "https://forums.e-hentai.org" Log.d(TAG, url) - return EhRequestBuilder(url, referer, origin) - .post(builder.build()) + return ehRequest(url, referer, origin) { post(builder.build()) } .executeAndParsingWith(SignInParser::parse) } @@ -196,7 +195,7 @@ object EhEngine { suspend fun getGalleryList(url: String): GalleryListParser.Result { val referer = EhUrl.referer Log.d(TAG, url) - return EhRequestBuilder(url, referer).executeAndParsingWith(GalleryListParser::parse) + return ehRequest(url, referer).executeAndParsingWith(GalleryListParser::parse) .apply { fillGalleryList(galleryInfoList, url, true) } } @@ -240,17 +239,14 @@ object EhEngine { val url = EhUrl.apiUrl val origin = EhUrl.origin Log.d(TAG, url) - return EhRequestBuilder(url, referer, origin) - .post(json.toString().toRequestBody(MEDIA_TYPE_JSON)) - .executeAndParsingWith { - GalleryApiParser.parse(this, galleryInfoList) - } + return ehRequest(url, referer, origin) { post(json.toString().toRequestBody(MEDIA_TYPE_JSON)) } + .executeAndParsingWith { GalleryApiParser.parse(this, galleryInfoList) } } suspend fun getGalleryDetail(url: String): GalleryDetail { val referer = EhUrl.referer Log.d(TAG, url) - return EhRequestBuilder(url, referer).executeAndParsingWith { + return ehRequest(url, referer).executeAndParsingWith { EventPaneParser.parse(this)?.let { Settings.lastDawnDay = today showEventNotification(it) @@ -262,7 +258,7 @@ object EhEngine { suspend fun getPreviewList(url: String): Pair, Int> { val referer = EhUrl.referer Log.d(TAG, url) - return EhRequestBuilder(url, referer).executeAndParsingWith { + return ehRequest(url, referer).executeAndParsingWith { GalleryDetailParser.parsePreviewList(this) to GalleryDetailParser.parsePreviewPages(this) } @@ -288,8 +284,7 @@ object EhEngine { val referer = EhUrl.getGalleryDetailUrl(gid, token) val origin = EhUrl.origin Log.d(TAG, url) - return EhRequestBuilder(url, referer, origin) - .post(requestBody) + return ehRequest(url, referer, origin) { post(requestBody) } .executeAndParsingWith(RateGalleryParser::parse) } @@ -307,8 +302,7 @@ object EhEngine { } val origin = EhUrl.origin Log.d(TAG, url!!) - return EhRequestBuilder(url, url, origin) - .post(builder.build()) + return ehRequest(url, url, origin) { post(builder.build()) } .executeAndParsingWith { val document = Jsoup.parse(this) val elements = document.select("#chd + p") @@ -337,8 +331,7 @@ object EhEngine { val referer = EhUrl.referer val origin = EhUrl.origin Log.d(TAG, url) - return EhRequestBuilder(url, referer, origin) - .post(requestBody) + return ehRequest(url, referer, origin) { post(requestBody) } .executeAndParsingWith(GalleryTokenApiParser::parse) } @@ -347,7 +340,7 @@ object EhEngine { ): FavoritesParser.Result { val referer = EhUrl.referer Log.d(TAG, url) - return EhRequestBuilder(url, referer).executeAndParsingWith(FavoritesParser::parse) + return ehRequest(url, referer).executeAndParsingWith(FavoritesParser::parse) .apply { fillGalleryList(galleryInfoList, url, false) } } @@ -383,8 +376,7 @@ object EhEngine { val url = EhUrl.getAddFavorites(gid, token) val origin = EhUrl.origin Log.d(TAG, url) - return EhRequestBuilder(url, url, origin) - .post(builder.build()) + return ehRequest(url, url, origin) { post(builder.build()) } .executeAndParsingWith { } } @@ -429,8 +421,7 @@ object EhEngine { builder.add("apply", "Apply") val origin = EhUrl.origin Log.d(TAG, url) - return EhRequestBuilder(url, url, origin) - .post(builder.build()) + return ehRequest(url, url, origin) { post(builder.build()) } .executeAndParsingWith(FavoritesParser::parse) .apply { fillGalleryList(galleryInfoList, url, false) } } @@ -442,7 +433,7 @@ object EhEngine { ): List { val referer = EhUrl.getGalleryDetailUrl(gid, token) Log.d(TAG, url) - return EhRequestBuilder(url, referer).executeAndParsingWith(TorrentParser::parse) + return ehRequest(url, referer).executeAndParsingWith(TorrentParser::parse) } suspend fun getArchiveList( @@ -452,7 +443,7 @@ object EhEngine { ): ArchiveParser.Result { val referer = EhUrl.getGalleryDetailUrl(gid, token) Log.d(TAG, url) - return EhRequestBuilder(url, referer).executeAndParsingWith(ArchiveParser::parse)!! + return ehRequest(url, referer).executeAndParsingWith(ArchiveParser::parse)!! .apply { funds = funds ?: getFunds() } } @@ -484,8 +475,7 @@ object EhEngine { val referer = EhUrl.getGalleryDetailUrl(gid, token) val origin = EhUrl.origin Log.d(TAG, url) - val request = EhRequestBuilder(url, referer, origin) - .post(builder.build()) + val request = ehRequest(url, referer, origin) { builder.build() } var result = request.executeAndParsingWith(ArchiveParser::parseArchiveUrl) if (!isHAtH) { if (result == null) { @@ -504,13 +494,13 @@ object EhEngine { private suspend fun getFunds(): HomeParser.Funds { val url = EhUrl.URL_FUNDS Log.d(TAG, url) - return EhRequestBuilder(url).executeAndParsingWith(HomeParser::parseFunds) + return ehRequest(url).executeAndParsingWith(HomeParser::parseFunds) } private suspend fun getImageLimitsInternal(): HomeParser.Limits { val url = EhUrl.URL_HOME Log.d(TAG, url) - return EhRequestBuilder(url).executeAndParsingWith(HomeParser::parse) + return ehRequest(url).executeAndParsingWith(HomeParser::parse) } suspend fun getImageLimits(): HomeParser.Result = coroutineScope { @@ -529,8 +519,7 @@ object EhEngine { .add("reset", "Reset Limit") val url = EhUrl.URL_HOME Log.d(TAG, url) - return EhRequestBuilder(url) - .post(builder.build()) + return ehRequest(url) { post(builder.build()) } .executeAndParsingWith(HomeParser::parseResetLimits) } @@ -538,7 +527,7 @@ object EhEngine { val url = EhUrl.URL_NEWS val referer = EhUrl.REFERER_E Log.d(TAG, url) - return EhRequestBuilder(url, referer).executeAndParsingWith { + return ehRequest(url, referer).executeAndParsingWith { if (parse) EventPaneParser.parse(this) else null } } @@ -548,21 +537,21 @@ object EhEngine { referer: String, ): ProfileParser.Result { Log.d(TAG, url) - return EhRequestBuilder(url, referer).executeAndParsingWith(ProfileParser::parse) + return ehRequest(url, referer).executeAndParsingWith(ProfileParser::parse) } suspend fun getProfile(): ProfileParser.Result { val url = EhUrl.URL_FORUMS Log.d(TAG, url) return getProfileInternal( - EhRequestBuilder(url).executeAndParsingWith(ForumsParser::parse), + ehRequest(url).executeAndParsingWith(ForumsParser::parse), url, ) } private suspend fun getUConfigInternal(url: String) { Log.d(TAG, url) - EhRequestBuilder(url).executeAndParsingWith { + ehRequest(url).executeAndParsingWith { check(contains(U_CONFIG_TEXT)) { "U_CONFIG_TEXT not found!" } } } @@ -602,11 +591,8 @@ object EhEngine { val referer = EhUrl.referer val origin = EhUrl.origin Log.d(TAG, url) - return EhRequestBuilder(url, referer, origin) - .post(requestBody) - .executeAndParsingWith { - VoteCommentParser.parse(this, commentVote) - } + return ehRequest(url, referer, origin) { post(requestBody) } + .executeAndParsingWith { VoteCommentParser.parse(this, commentVote) } } suspend fun voteTag( @@ -630,8 +616,7 @@ object EhEngine { val referer = EhUrl.referer val origin = EhUrl.origin Log.d(TAG, url) - return EhRequestBuilder(url, referer, origin) - .post(requestBody) + return ehRequest(url, referer, origin) { post(requestBody) } .executeAndParsingWith(VoteTagParser::parse) } @@ -679,8 +664,7 @@ object EhEngine { val referer = EhUrl.referer val origin = EhUrl.origin Log.d(TAG, url) - return EhRequestBuilder(url, referer, origin) - .post(builder.build()) + return ehRequest(url, referer, origin) { builder.build() } .executeAndParsingWith(GalleryListParser::parse) .apply { fillGalleryList(galleryInfoList, url, true) } } @@ -692,7 +676,7 @@ object EhEngine { ): GalleryPageParser.Result { val referer = EhUrl.getGalleryDetailUrl(gid, token) Log.d(TAG, url!!) - return EhRequestBuilder(url, referer).executeAndParsingWith(GalleryPageParser::parse) + return ehRequest(url, referer).executeAndParsingWith(GalleryPageParser::parse) } suspend fun getGalleryPageApi( @@ -716,8 +700,7 @@ object EhEngine { } val origin = EhUrl.origin Log.d(TAG, url) - return EhRequestBuilder(url, referer, origin) - .post(requestBody) + return ehRequest(url, referer, origin) { post(requestBody) } .executeAndParsingWith(GalleryPageApiParser::parse) } } diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhRequestBuilder.kt b/app/src/main/java/com/hippo/ehviewer/client/EhRequestBuilder.kt index adf9831fe..03dd67eb9 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhRequestBuilder.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhRequestBuilder.kt @@ -15,16 +15,18 @@ */ package com.hippo.ehviewer.client -import com.hippo.okhttp.ChromeRequestBuilder import io.ktor.http.HttpMessageBuilder +import okhttp3.Request +inline fun ehRequest(url: String, referer: String? = null, origin: String? = null, builder: Request.Builder.() -> Unit = {}) = Request.Builder().url(url).apply { + addHeader("User-Agent", CHROME_USER_AGENT) + addHeader("Accept", CHROME_ACCEPT) + addHeader("Accept-Language", CHROME_ACCEPT_LANGUAGE) + referer?.let { addHeader("Referer", it) } + origin?.let { addHeader("Origin", it) } +}.apply(builder).build() -class EhRequestBuilder(url: String, referer: String? = null, origin: String? = null) : - ChromeRequestBuilder(url) { - init { - referer?.let { addHeader("Referer", it) } - origin?.let { addHeader("Origin", it) } - } -} +fun HttpMessageBuilder.referer(value: String?): Unit = value?.let { headers.append("Referer", it) } ?: Unit -fun HttpMessageBuilder.referer(value: String?): Unit = - value?.let { headers.append("Referer", it) } ?: Unit +const val CHROME_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" +const val CHROME_ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" +const val CHROME_ACCEPT_LANGUAGE = "en-US,en;q=0.5" diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt index ca5710c51..e63317fe1 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.kt @@ -24,12 +24,12 @@ import com.hippo.ehviewer.GetText import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhEngine -import com.hippo.ehviewer.client.EhRequestBuilder import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUrl.getGalleryDetailUrl import com.hippo.ehviewer.client.EhUrl.getGalleryMultiPageViewerUrl import com.hippo.ehviewer.client.EhUrl.referer import com.hippo.ehviewer.client.data.GalleryInfo +import com.hippo.ehviewer.client.ehRequest import com.hippo.ehviewer.client.exception.ParseException import com.hippo.ehviewer.client.parser.GalleryDetailParser.parsePages import com.hippo.ehviewer.client.parser.GalleryDetailParser.parsePreviewList @@ -360,15 +360,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS } private suspend fun readSpiderInfoFromInternet(): SpiderInfo? { - val request = EhRequestBuilder( - getGalleryDetailUrl( - galleryInfo.gid, - galleryInfo.token, - 0, - false, - ), - referer, - ).build() + val request = ehRequest(getGalleryDetailUrl(galleryInfo.gid, galleryInfo.token, 0, false), referer) return runSuspendCatching { plainTextOkHttpClient.newCall(request).executeAsync().use { response -> val body = response.body.string() @@ -390,7 +382,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS galleryInfo.token!!, ) val referer = referer - val request = EhRequestBuilder(url, referer).build() + val request = ehRequest(url, referer) try { plainTextOkHttpClient.newCall(request).executeAsync().use { response -> val body = response.body.string() @@ -426,7 +418,7 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS false, ) val referer = referer - val request = EhRequestBuilder(url, referer).build() + val request = ehRequest(url, referer) try { plainTextOkHttpClient.newCall(request).executeAsync().use { response -> val body = response.body.string() diff --git a/app/src/main/java/com/hippo/okhttp/ChromeRequestBuilder.kt b/app/src/main/java/com/hippo/okhttp/ChromeRequestBuilder.kt deleted file mode 100644 index 21ebbc597..000000000 --- a/app/src/main/java/com/hippo/okhttp/ChromeRequestBuilder.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2016 Hippo Seven - * - * 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 com.hippo.okhttp - -import okhttp3.Request - -open class ChromeRequestBuilder(url: String) : Request.Builder() { - companion object { - private const val CHROME_USER_AGENT = - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" - private const val CHROME_ACCEPT = - "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" - private const val CHROME_ACCEPT_LANGUAGE = "en-US,en;q=0.5" - } - - init { - this.url(url) - this.addHeader("User-Agent", CHROME_USER_AGENT) - this.addHeader("Accept", CHROME_ACCEPT) - this.addHeader("Accept-Language", CHROME_ACCEPT_LANGUAGE) - } -}