ktorio / ktor

Framework for quickly creating connected applications in Kotlin with minimal effort
https://ktor.io
Apache License 2.0
13.02k stars 1.06k forks source link

URLConnection works fine but ktor client returns 403 forbidden during a get request #1994

Open dylech30th opened 4 years ago

dylech30th commented 4 years ago

I'm using ktor 1.3.2 with CIO engine, when I try to send a get request to URL https://1.0.0.1/dns-query?ct=application/dns-json&cd=false&do=false&type=A&name=google.com by the following code:

suspend fun requestJson(hostname: String): DnsResponse {
            HttpClient(CIO) {
                install(JsonFeature) {
                    serializer = KotlinxSerializer()
                }
                install(HttpTimeout)
            }.use {
                return withContext(Dispatchers.IO) {
                    it.get<DnsResponse>("https://1.0.0.1/dns-query?ct=application/dns-json&cd=false&do=false&type=A&name=google.com") {
                        timeout {
                            requestTimeoutMillis = 5000
                        }
                    }
                }
            }
        }

an error occurred with the message Exception in thread "main" io.ktor.client.features.ClientRequestException: Client request(https://1.0.0.1/dns-query?ct=application%2Fdns-json&cd=false&do=false&type=A&name=google.com) invalid: 403 Forbidden, but when I try to access this URL by using a browser or postman or even using the old-school URLConnection in java, it works fine and returns the correct response, for example, the code

val url = URL("https://1.0.0.1/dns-query?ct=application/dns-json&cd=false&do=false&type=A&name=google.com")
    val conn = url.openConnection() as HttpURLConnection
    conn.connect()
    val bf = BufferedReader(InputStreamReader(conn.inputStream))
    var line: String = ""
    while (bf.readLine().let { if (it == null) false else {line += it; true} }) {

    }
    println(line)

will print

{"Status":0,"TC":false,"RD":true,"RA":true,"AD":false,"CD":true,"Question":[{"name":"google.com","type":1}],"Answer":[{"name":"google.com","type":1,"TTL":59,"data":"172.217.5.78"}]}

and everything looks fine

oleg-larshin commented 4 years ago

Please check the following ticket on YouTrack for follow-ups to this issue. GitHub issues will be closed in the coming weeks.

Stexxe commented 3 years ago

Most likely this server supports only HTTP/2 protocol but the CIO engine supports the only HTTP/1.1. As a workaround use the Jetty engine.

vkarthikeyan commented 8 months ago

Facing the same issue Fatal Exception: io.ktor.client.features.ClientRequestException: Client request(URL) 403 invalid and using ktor v1.6.3. Is this issue fixed? If so, in which version?

Stexxe commented 8 months ago

This exception is thrown by the response validation. In Ktor 1.*, the response validation is enabled by default.