package dev.inmo.micro_utils.ktor.client import dev.inmo.micro_utils.common.MPPFile import dev.inmo.micro_utils.common.filename import dev.inmo.micro_utils.ktor.common.* import io.ktor.client.HttpClient import io.ktor.client.call.body import io.ktor.client.request.* import io.ktor.client.request.forms.* import io.ktor.client.statement.readBytes import io.ktor.http.* import io.ktor.utils.io.core.ByteReadPacket import kotlinx.serialization.* @Deprecated("This class will be removed soon. It is now recommended to use built-in ktor features instead") class UnifiedRequester( val client: HttpClient = HttpClient(), val serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) { suspend fun uniget( url: String, resultDeserializer: DeserializationStrategy ): ResultType = client.uniget(url, resultDeserializer, serialFormat) fun encodeUrlQueryValue( serializationStrategy: SerializationStrategy, value: T ) = serializationStrategy.encodeUrlQueryValue( value, serialFormat ) suspend fun unipost( url: String, bodyInfo: Pair, BodyType>, resultDeserializer: DeserializationStrategy ) = client.unipost(url, bodyInfo, resultDeserializer, serialFormat) suspend fun unimultipart( url: String, filename: String, inputProvider: InputProvider, resultDeserializer: DeserializationStrategy, mimetype: String = "*/*", additionalParametersBuilder: FormBuilder.() -> Unit = {}, dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, requestBuilder: HttpRequestBuilder.() -> Unit = {}, ): ResultType = client.unimultipart(url, filename, inputProvider, resultDeserializer, mimetype, additionalParametersBuilder, dataHeadersBuilder, requestBuilder, serialFormat) suspend fun unimultipart( url: String, filename: String, inputProvider: InputProvider, otherData: Pair, BodyType>, resultDeserializer: DeserializationStrategy, mimetype: String = "*/*", additionalParametersBuilder: FormBuilder.() -> Unit = {}, dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, requestBuilder: HttpRequestBuilder.() -> Unit = {}, ): ResultType = client.unimultipart(url, filename, otherData, inputProvider, resultDeserializer, mimetype, additionalParametersBuilder, dataHeadersBuilder, requestBuilder, serialFormat) suspend fun unimultipart( url: String, mppFile: MPPFile, resultDeserializer: DeserializationStrategy, mimetype: String = "*/*", additionalParametersBuilder: FormBuilder.() -> Unit = {}, dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, requestBuilder: HttpRequestBuilder.() -> Unit = {} ): ResultType = client.unimultipart( url, mppFile, resultDeserializer, mimetype, additionalParametersBuilder, dataHeadersBuilder, requestBuilder, serialFormat ) suspend fun unimultipart( url: String, mppFile: MPPFile, otherData: Pair, BodyType>, resultDeserializer: DeserializationStrategy, mimetype: String = "*/*", additionalParametersBuilder: FormBuilder.() -> Unit = {}, dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, requestBuilder: HttpRequestBuilder.() -> Unit = {} ): ResultType = client.unimultipart( url, mppFile, otherData, resultDeserializer, mimetype, additionalParametersBuilder, dataHeadersBuilder, requestBuilder, serialFormat ) fun createStandardWebsocketFlow( url: String, checkReconnection: suspend (Throwable?) -> Boolean, deserializer: DeserializationStrategy, requestBuilder: HttpRequestBuilder.() -> Unit = {}, ) = client.createStandardWebsocketFlow(url, deserializer, checkReconnection, serialFormat, requestBuilder) fun createStandardWebsocketFlow( url: String, deserializer: DeserializationStrategy, requestBuilder: HttpRequestBuilder.() -> Unit = {}, ) = createStandardWebsocketFlow(url, { true }, deserializer, requestBuilder) } @Deprecated("This property will be removed soon. It is now recommended to use built-in ktor features instead") val defaultRequester = UnifiedRequester() @Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") suspend fun HttpClient.uniget( url: String, resultDeserializer: DeserializationStrategy, serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) = get(url).let { serialFormat.decodeDefault(resultDeserializer, it.body()) } @Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") fun SerializationStrategy.encodeUrlQueryValue( value: T, serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) = serialFormat.encodeHex( this, value ) @Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") suspend fun HttpClient.unipost( url: String, bodyInfo: Pair, BodyType>, resultDeserializer: DeserializationStrategy, serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ) = post(url) { setBody( serialFormat.encodeDefault(bodyInfo.first, bodyInfo.second) ) }.let { serialFormat.decodeDefault(resultDeserializer, it.body()) } @Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") suspend fun HttpClient.unimultipart( url: String, filename: String, inputProvider: InputProvider, resultDeserializer: DeserializationStrategy, mimetype: String = "*/*", additionalParametersBuilder: FormBuilder.() -> Unit = {}, dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, requestBuilder: HttpRequestBuilder.() -> Unit = {}, serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ): ResultType = submitFormWithBinaryData( url, formData = formData { append( "bytes", inputProvider, Headers.build { append(HttpHeaders.ContentType, mimetype) append(HttpHeaders.ContentDisposition, "filename=\"$filename\"") dataHeadersBuilder() } ) additionalParametersBuilder() } ) { requestBuilder() }.let { serialFormat.decodeDefault(resultDeserializer, it.body()) } @Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") suspend fun HttpClient.unimultipart( url: String, filename: String, otherData: Pair, BodyType>, inputProvider: InputProvider, resultDeserializer: DeserializationStrategy, mimetype: String = "*/*", additionalParametersBuilder: FormBuilder.() -> Unit = {}, dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, requestBuilder: HttpRequestBuilder.() -> Unit = {}, serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ): ResultType = unimultipart( url, filename, inputProvider, resultDeserializer, mimetype, additionalParametersBuilder = { val serialized = serialFormat.encodeDefault(otherData.first, otherData.second) append( "data", InputProvider(serialized.size.toLong()) { ByteReadPacket(serialized) }, Headers.build { append(HttpHeaders.ContentType, ContentType.Application.Cbor.contentType) append(HttpHeaders.ContentDisposition, "filename=data.bytes") dataHeadersBuilder() } ) additionalParametersBuilder() }, dataHeadersBuilder, requestBuilder, serialFormat ) @Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") suspend fun HttpClient.unimultipart( url: String, mppFile: MPPFile, resultDeserializer: DeserializationStrategy, mimetype: String = "*/*", additionalParametersBuilder: FormBuilder.() -> Unit = {}, dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, requestBuilder: HttpRequestBuilder.() -> Unit = {}, serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ): ResultType = unimultipart( url, mppFile.filename.string, mppFile.inputProvider(), resultDeserializer, mimetype, additionalParametersBuilder, dataHeadersBuilder, requestBuilder, serialFormat ) @Deprecated("This method will be removed soon. It is now recommended to use built-in ktor features instead") suspend fun HttpClient.unimultipart( url: String, mppFile: MPPFile, otherData: Pair, BodyType>, resultDeserializer: DeserializationStrategy, mimetype: String = "*/*", additionalParametersBuilder: FormBuilder.() -> Unit = {}, dataHeadersBuilder: HeadersBuilder.() -> Unit = {}, requestBuilder: HttpRequestBuilder.() -> Unit = {}, serialFormat: StandardKtorSerialFormat = standardKtorSerialFormat ): ResultType = unimultipart( url, mppFile, resultDeserializer, mimetype, additionalParametersBuilder = { val serialized = serialFormat.encodeDefault(otherData.first, otherData.second) append( "data", InputProvider(serialized.size.toLong()) { ByteReadPacket(serialized) }, Headers.build { append(HttpHeaders.ContentType, ContentType.Application.Cbor.contentType) append(HttpHeaders.ContentDisposition, "filename=data.bytes") dataHeadersBuilder() } ) additionalParametersBuilder() }, dataHeadersBuilder, requestBuilder, serialFormat )