Fixed crash when HTTPS response is not correct

This commit is contained in:
PeratX 2018-07-08 14:30:23 +08:00
parent 1feb5a0074
commit e178184df9
3 changed files with 64 additions and 58 deletions

View File

@ -43,7 +43,7 @@ Supported DNS Query Methods:
* UDP * UDP
* TCP * TCP
* DNS over TLS ([RFC7858](https://tools.ietf.org/html/rfc7858)) * DNS over TLS ([RFC7858](https://tools.ietf.org/html/rfc7858))
* DNS over HTTPS ([IETF darft](https://tools.ietf.org/html/draft-ietf-doh-dns-over-https-11)) * DNS over HTTPS ([IETF darft](https://tools.ietf.org/html/draft-ietf-doh-dns-over-https-12))
* DNS over HTTPS ([Google JSON](https://developers.google.com/speed/public-dns/docs/dns-over-https)) * DNS over HTTPS ([Google JSON](https://developers.google.com/speed/public-dns/docs/dns-over-https))
<br> <br>

View File

@ -65,11 +65,14 @@ public class HttpsIetfProvider extends HttpsProvider {
} }
@Override @Override
public void onResponse(Call call, Response response) throws IOException { public void onResponse(Call call, Response response) {
if (response.isSuccessful()) { if (response.isSuccessful()) {
result = new DnsMessage(response.body().bytes()).asBuilder() try {
.setId(id).build().toArray(); result = new DnsMessage(response.body().bytes()).asBuilder()
completed = true; .setId(id).build().toArray();
completed = true;
} catch (Exception ignored) {//throw IllegalArgumentException when response is not correct
}
} }
} }
}); });

View File

@ -72,64 +72,67 @@ public class HttpsJsonProvider extends HttpsProvider {
} }
@Override @Override
public void onResponse(Call call, Response response) throws IOException { public void onResponse(Call call, Response response) {
if (response.isSuccessful()) { if (response.isSuccessful()) {
JsonObject jsonObject = new JsonParser().parse(response.body().string()).getAsJsonObject(); try {
DnsMessage.Builder msg = message.asBuilder() JsonObject jsonObject = new JsonParser().parse(response.body().string()).getAsJsonObject();
.setRecursionDesired(jsonObject.get("RD").getAsBoolean()) DnsMessage.Builder msg = message.asBuilder()
.setRecursionAvailable(jsonObject.get("RA").getAsBoolean()) .setRecursionDesired(jsonObject.get("RD").getAsBoolean())
.setAuthenticData(jsonObject.get("AD").getAsBoolean()) .setRecursionAvailable(jsonObject.get("RA").getAsBoolean())
.setCheckingDisabled(jsonObject.get("CD").getAsBoolean()); .setAuthenticData(jsonObject.get("AD").getAsBoolean())
if (jsonObject.has("Answer")) { .setCheckingDisabled(jsonObject.get("CD").getAsBoolean());
JsonArray answers = jsonObject.get("Answer").getAsJsonArray(); if (jsonObject.has("Answer")) {
for (JsonElement answer : answers) { JsonArray answers = jsonObject.get("Answer").getAsJsonArray();
JsonObject ans = answer.getAsJsonObject(); for (JsonElement answer : answers) {
Record.TYPE type = Record.TYPE.getType(ans.get("type").getAsInt()); JsonObject ans = answer.getAsJsonObject();
String data = ans.get("data").getAsString(); Record.TYPE type = Record.TYPE.getType(ans.get("type").getAsInt());
Data recordData = null; String data = ans.get("data").getAsString();
switch (type) { Data recordData = null;
case A: switch (type) {
recordData = new A(data); case A:
break; recordData = new A(data);
case AAAA: break;
recordData = new AAAA(data); case AAAA:
break; recordData = new AAAA(data);
case CNAME: break;
recordData = new CNAME(data); case CNAME:
break; recordData = new CNAME(data);
case MX: break;
recordData = new MX(5, data); case MX:
break; recordData = new MX(5, data);
case SOA: break;
String[] sections = data.split(" "); case SOA:
if (sections.length == 7) { String[] sections = data.split(" ");
recordData = new SOA(sections[0], sections[1], if (sections.length == 7) {
Long.valueOf(sections[2]), Integer.valueOf(sections[3]), recordData = new SOA(sections[0], sections[1],
Integer.valueOf(sections[4]), Integer.valueOf(sections[5]), Long.valueOf(sections[2]), Integer.valueOf(sections[3]),
Long.valueOf(sections[6])); Integer.valueOf(sections[4]), Integer.valueOf(sections[5]),
} Long.valueOf(sections[6]));
break; }
case DNAME: break;
recordData = new DNAME(data); case DNAME:
break; recordData = new DNAME(data);
case NS: break;
recordData = new NS(DnsName.from(data)); case NS:
break; recordData = new NS(DnsName.from(data));
case TXT: break;
recordData = new TXT(data.getBytes()); case TXT:
break; recordData = new TXT(data.getBytes());
break;
} }
if (recordData != null) { if (recordData != null) {
msg.addAnswer(new Record<>(ans.get("name").getAsString(), msg.addAnswer(new Record<>(ans.get("name").getAsString(),
type, 1, type, 1,
ans.get("TTL").getAsLong(), ans.get("TTL").getAsLong(),
recordData)); recordData));
}
} }
} }
result = msg.setQrFlag(true).build().toArray();
completed = true;
} catch (Exception ignored) {//throw com.google.gson.JsonSyntaxException when response is not correct
} }
result = msg.setQrFlag(true).build().toArray();
completed = true;
} }
} }
}); });