Skip to content

Commit 8eddd1d

Browse files
yschimkeTaoZang
andauthored
[4.x] Cherry pick: fix DoH error when using ip address as hostname (#7648)
* Cherrypick: fix DoH error when using ip address as hostname (#7073) (cherry picked from commit 631a29e) Co-authored-by: Tao.Zang <zangtao.i@gmail.com>
1 parent 949262e commit 8eddd1d

File tree

2 files changed

+35
-7
lines changed

2 files changed

+35
-7
lines changed

okhttp/src/main/kotlin/okhttp3/internal/connection/RouteSelector.kt

+14-7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package okhttp3.internal.connection
1717

1818
import java.io.IOException
19+
import java.net.InetAddress
1920
import java.net.InetSocketAddress
2021
import java.net.Proxy
2122
import java.net.SocketException
@@ -26,6 +27,7 @@ import okhttp3.Call
2627
import okhttp3.EventListener
2728
import okhttp3.HttpUrl
2829
import okhttp3.Route
30+
import okhttp3.internal.canParseAsIpAddress
2931
import okhttp3.internal.immutableListOf
3032
import okhttp3.internal.toImmutableList
3133

@@ -158,16 +160,21 @@ class RouteSelector(
158160
if (proxy.type() == Proxy.Type.SOCKS) {
159161
mutableInetSocketAddresses += InetSocketAddress.createUnresolved(socketHost, socketPort)
160162
} else {
161-
eventListener.dnsStart(call, socketHost)
163+
val addresses = if (socketHost.canParseAsIpAddress()) {
164+
listOf(InetAddress.getByName(socketHost))
165+
} else {
166+
eventListener.dnsStart(call, socketHost)
167+
168+
// Try each address for best behavior in mixed IPv4/IPv6 environments.
169+
val result = address.dns.lookup(socketHost)
170+
if (result.isEmpty()) {
171+
throw UnknownHostException("${address.dns} returned no addresses for $socketHost")
172+
}
162173

163-
// Try each address for best behavior in mixed IPv4/IPv6 environments.
164-
val addresses = address.dns.lookup(socketHost)
165-
if (addresses.isEmpty()) {
166-
throw UnknownHostException("${address.dns} returned no addresses for $socketHost")
174+
eventListener.dnsEnd(call, socketHost, result)
175+
result
167176
}
168177

169-
eventListener.dnsEnd(call, socketHost, addresses)
170-
171178
for (inetAddress in addresses) {
172179
mutableInetSocketAddresses += InetSocketAddress(inetAddress, socketPort)
173180
}

okhttp/src/test/java/okhttp3/EventListenerTest.java

+21
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,27 @@ public final class EventListenerTest {
135135
"ResponseBodyEnd", "ConnectionReleased", "CallEnd");
136136
}
137137

138+
@Test public void successfulCallEventSequenceForIpAddress() throws IOException {
139+
server.enqueue(new MockResponse()
140+
.setBody("abc"));
141+
142+
String ipAddress = InetAddress.getLoopbackAddress().getHostAddress();
143+
144+
Call call = client.newCall(new Request.Builder()
145+
.url(server.url("/").newBuilder().host(ipAddress).build())
146+
.build());
147+
Response response = call.execute();
148+
assertThat(response.code()).isEqualTo(200);
149+
assertThat(response.body().string()).isEqualTo("abc");
150+
response.body().close();
151+
152+
assertThat(listener.recordedEventTypes()).containsExactly("CallStart",
153+
"ProxySelectStart", "ProxySelectEnd",
154+
"ConnectStart", "ConnectEnd", "ConnectionAcquired", "RequestHeadersStart",
155+
"RequestHeadersEnd", "ResponseHeadersStart", "ResponseHeadersEnd", "ResponseBodyStart",
156+
"ResponseBodyEnd", "ConnectionReleased", "CallEnd");
157+
}
158+
138159
@Test public void successfulCallEventSequenceForEnqueue() throws Exception {
139160
server.enqueue(new MockResponse()
140161
.setBody("abc"));

0 commit comments

Comments
 (0)