У меня есть HttpServer, который обслуживает файлы, используя следующий код внутри функции handle() моего обработчика.
Файл считывается на 100% с локального диска, и массив bytes[] заполняется корректно. Как только я пытаюсь записать эти байты в OutputStream os
, я получаю сообщение об ошибке «IOException - установленное соединение было прервано программным обеспечением на вашем хост-компьютере».
Черт возьми, код РАБОТАЕТ - я получаю эти байты на стороне клиента, и с точки зрения клиента все работает на 100%. Помимо молчаливого игнорирования этой ошибки, есть ли что-нибудь еще, что я должен проверить?
@Override
public void handle(HttpExchange t) throws IOException
{
//I heard it was a good idea to consume the input stream fully:
InputStream is = t.getRequestBody();
while (is.read() != -1) {
is.skip(0x10000);
}
is.close();
String path = t.getRequestURI().getPath();
String method = t.getRequestMethod();
if (! ("HEAD".equals(method) || "GET".equals(method)))
{
sendError(t, 400, "Invalid method");
return;
}
... snipped some path validation and error checking ...
try
{
Headers h = t.getResponseHeaders();
h.set("Content-Type", "text/html");
h.set("Access-Control-Allow-Methods", "GET");
h.set("Access-Control-Allow-Headers", "Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since");
h.set("Access-Control-Allow-Origin", "*");
h.set("Timing-Allow-Origin", "*");
//Set aggressive caching:
h.set("Cache-Control", "public, max-age=31536000");
File f = new File(baseDirectory + path).getCanonicalFile();
if (!f.exists() || !f.isFile())
{
sendError(t, 404, "Not found");
return;
}
byte[] bytes = Files.readAllBytes(Paths.get(f.getPath()));
t.sendResponseHeaders(200, bytes.length);
OutputStream os = t.getResponseBody();
//ERROR HAPPENS HERE:
os.write(bytes);
os.close();
}
catch (Exception e)
{
Main.log("HTTP: Error trying to read file "+path+": "+ e.toString());
}
t.close();
}