diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/network/OkHttpWebClient.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/network/OkHttpWebClient.kt index 4400f430..31a8c637 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/network/OkHttpWebClient.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/network/OkHttpWebClient.kt @@ -23,9 +23,7 @@ class OkHttpWebClient( .get() .url(url) .addTags() - if (extraHeaders != null) { - request.headers(extraHeaders) - } + .addExtraHeaders(extraHeaders) return httpClient.newCall(request.build()).await().ensureSuccess() } @@ -37,7 +35,7 @@ class OkHttpWebClient( return httpClient.newCall(request.build()).await().ensureSuccess() } - override suspend fun httpPost(url: HttpUrl, form: Map): Response { + override suspend fun httpPost(url: HttpUrl, form: Map, extraHeaders: Headers?): Response { val body = FormBody.Builder() form.forEach { (k, v) -> body.addEncoded(k, v) @@ -46,10 +44,11 @@ class OkHttpWebClient( .post(body.build()) .url(url) .addTags() + .addExtraHeaders(extraHeaders) return httpClient.newCall(request.build()).await().ensureSuccess() } - override suspend fun httpPost(url: HttpUrl, payload: String): Response { + override suspend fun httpPost(url: HttpUrl, payload: String, extraHeaders: Headers?): Response { val body = FormBody.Builder() payload.split('&').forEach { val pos = it.indexOf('=') @@ -63,16 +62,18 @@ class OkHttpWebClient( .post(body.build()) .url(url) .addTags() + .addExtraHeaders(extraHeaders) return httpClient.newCall(request.build()).await().ensureSuccess() } - override suspend fun httpPost(url: HttpUrl, body: JSONObject): Response { + override suspend fun httpPost(url: HttpUrl, body: JSONObject, extraHeaders: Headers?): Response { val mediaType = "application/json; charset=utf-8".toMediaType() val requestBody = body.toString().toRequestBody(mediaType) val request = Request.Builder() .post(requestBody) .url(url) .addTags() + .addExtraHeaders(extraHeaders) return httpClient.newCall(request.build()).await().ensureSuccess() } @@ -102,6 +103,13 @@ class OkHttpWebClient( return this } + private fun Request.Builder.addExtraHeaders(headers: Headers?): Request.Builder { + if (headers != null) { + headers(headers) + } + return this + } + private fun Response.ensureSuccess(): Response { val exception: Exception? = when (code) { // Catch some error codes, not all HttpURLConnection.HTTP_NOT_FOUND -> NotFoundException(message, request.url.toString()) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/network/WebClient.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/network/WebClient.kt index a486824d..bddbb270 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/network/WebClient.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/network/WebClient.kt @@ -22,6 +22,11 @@ interface WebClient { */ suspend fun httpGet(url: HttpUrl): Response = httpGet(url, null) + /** + * Do a GET http request to specific url + * @param url + * @param extraHeaders additional HTTP headers for request + */ suspend fun httpGet(url: HttpUrl, extraHeaders: Headers?): Response /** @@ -41,42 +46,66 @@ interface WebClient { * @param url * @param form payload as key=>value map */ - suspend fun httpPost(url: String, form: Map): Response = httpPost(url.toHttpUrl(), form) + suspend fun httpPost(url: String, form: Map): Response = httpPost(url.toHttpUrl(), form, null) /** * Do a POST http request to specific url with `multipart/form-data` payload * @param url * @param form payload as key=>value map */ - suspend fun httpPost(url: HttpUrl, form: Map): Response + suspend fun httpPost(url: HttpUrl, form: Map): Response = httpPost(url, form, null) + + /** + * Do a POST http request to specific url with `multipart/form-data` payload + * @param url + * @param form payload as key=>value map + * @param extraHeaders additional HTTP headers for request + */ + suspend fun httpPost(url: HttpUrl, form: Map, extraHeaders: Headers?): Response + + /** + * Do a POST http request to specific url with `multipart/form-data` payload + * @param url + * @param payload payload as `key=value` string with `&` separator + */ + suspend fun httpPost(url: String, payload: String): Response = httpPost(url.toHttpUrl(), payload, null) /** * Do a POST http request to specific url with `multipart/form-data` payload * @param url * @param payload payload as `key=value` string with `&` separator */ - suspend fun httpPost(url: String, payload: String): Response = httpPost(url.toHttpUrl(), payload) + suspend fun httpPost(url: HttpUrl, payload: String): Response = httpPost(url, payload, null) /** * Do a POST http request to specific url with `multipart/form-data` payload * @param url * @param payload payload as `key=value` string with `&` separator + * @param extraHeaders additional HTTP headers for request + */ + suspend fun httpPost(url: HttpUrl, payload: String, extraHeaders: Headers?): Response + + /** + * Do a POST http request to specific url with json payload + * @param url + * @param body */ - suspend fun httpPost(url: HttpUrl, payload: String): Response + suspend fun httpPost(url: String, body: JSONObject): Response = httpPost(url.toHttpUrl(), body, null) /** * Do a POST http request to specific url with json payload * @param url * @param body */ - suspend fun httpPost(url: String, body: JSONObject): Response = httpPost(url.toHttpUrl(), body) + suspend fun httpPost(url: HttpUrl, body: JSONObject): Response = httpPost(url, body, null) /** * Do a POST http request to specific url with json payload * @param url * @param body + * @param extraHeaders additional HTTP headers for request */ - suspend fun httpPost(url: HttpUrl, body: JSONObject): Response + suspend fun httpPost(url: HttpUrl, body: JSONObject, extraHeaders: Headers?): Response /** * Do a GraphQL request to specific url