У меня возникают проблемы с постоянным получением всего тела запросов, * https://trainingapply.grants.gov/apply/opportunities/schemas/applicant/PKG00037270/Project.xsd из моего Java-приложения.Иногда я получаю все тело.В других случаях я получаю первые 4072 символа, и тело заканчивается.Я пробовал следующие подходы:
//core java
try {
URLConnection urlConnection = new URL(schemaUrl).openConnection();
StringBuilder schema = new StringBuilder();
String line;
try (BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"))) {
while ((line = br.readLine()) != null) {
schema.append(line);
}
}
return schema.toString();
} catch (IOException e) {
//[error handling]
}
//Apache commons
return IOUtils.toString(new URL(schemaUrl), "UTF-8");
И использование библиотеки Apache HttpComponents с тем же результатом.Как ни странно, Postman, мой браузер и curl возвращают согласованное и полное тело, так что это должно быть специфично для Java.Я использую java 1.8.0_181.
Интересно, что при свертывании этого URL существует граница сетевого пакета прямо на 4072 байта в контент, который выглядит следующим образом:
<= Recv data, 4072 bytes (0xfe8)
0000: <?xml version="1.0" encoding="UTF-8"?>
...
...
0fb4: <xsd:complexType>
0fd6:
<= Recv data, 2688 bytes (0xa80)
0000: <xsd:sequence>
0011: .. <xsd:element name="SubApplicationGroupID" type="x
ItМне ясно, что эти другие клиенты обрабатывают этот запрос правильно, в то время как встроенные Java-примитивы не всегда извлекаются до конца длины содержимого, объявленной в заголовках.Вот заголовки для вашей справки:
=> Send header, 149 bytes (0x95)
0000: GET /apply/opportunities/schemas/applicant/PKG00037270/Project.x
0040: sd HTTP/1.1
004d: Host: trainingapply.grants.gov
006d: User-Agent: curl/7.54.0
0086: Accept: */*
0093:
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 24 bytes (0x18)
0000: Connection: Keep-Alive
<= Recv header, 37 bytes (0x25)
0000: Date: Thu, 21 Feb 2019 20:50:04 GMT
<= Recv header, 18 bytes (0x12)
0000: Pragma: no-cache
<= Recv header, 22 bytes (0x16)
0000: Content-Length: 6760
<= Recv header, 39 bytes (0x27)
0000: Content-Type: text/xml; charset=UTF-8
<= Recv header, 40 bytes (0x28)
0000: Expires: Thu, 01 Jan 1970 00:00:00 GMT
<= Recv header, 33 bytes (0x21)
0000: X-XSS-Protection: 1; mode=block
<= Recv header, 21 bytes (0x15)
0000: X-ORACLE-DMS-RID: 0
<= Recv header, 33 bytes (0x21)
0000: X-Content-Type-Options: nosniff
<= Recv header, 114 bytes (0x72)
0000: Set-Cookie: JSESSIONID=M6AR0orf2aDdcnmBu-LHOBRL4pjuVTRhx_n-uj-2a
0040: p7OSBVfCuVG!1960121785; path=/; secure; HttpOnly
<= Recv header, 66 bytes (0x42)
0000: X-ORACLE-DMS-ECID: 7241b3bd-75bf-48a0-85e6-57059f2a08da-007a0021
<= Recv header, 35 bytes (0x23)
0000: X-Powered-By: Servlet/3.1 JSP/2.3
<= Recv header, 29 bytes (0x1d)
0000: X-Frame-Options: SAMEORIGIN
<= Recv header, 45 bytes (0x2d)
0000: Strict-Transport-Security: max-age=31536000
<= Recv header, 2 bytes (0x2)
0000:
Есть идеи, что здесь происходит?