diff --git a/source/de/anomic/http/httpc.java b/source/de/anomic/http/httpc.java index ea9b71ad4..ec2e6d88e 100644 --- a/source/de/anomic/http/httpc.java +++ b/source/de/anomic/http/httpc.java @@ -41,6 +41,7 @@ package de.anomic.http; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -1638,35 +1639,43 @@ public final class httpc { /** * This method writes the input stream to either another output stream * or a file or both. + * In case that an exception occurrs, the stream reading is just teminated + * and content received so far is returned * * @param procOS * @param file - * @throws IOException */ - public void writeContent(Object procOS, File file) throws IOException { + public void writeContent(Object procOS, File file) { // this writes the input stream to either another output stream or // a file or both. FileOutputStream bufferOS = null; + if (file != null) try { + bufferOS = new FileOutputStream(file); + } catch (FileNotFoundException e) { + file = null; + } try { - if (file != null) bufferOS = new FileOutputStream(file); + InputStream is = this.getContentInputStream(); if (procOS == null) { - serverFileUtils.writeX(this.getContentInputStream(), null, bufferOS); + serverFileUtils.writeX(is, null, bufferOS); } else if (procOS instanceof OutputStream) { - serverFileUtils.writeX(this.getContentInputStream(), (OutputStream) procOS, bufferOS); + serverFileUtils.writeX(is, (OutputStream) procOS, bufferOS); //writeContentX(httpc.this.clientInput, this.gzip, this.responseHeader.contentLength(), procOS, bufferOS); } else if (procOS instanceof Writer) { String charSet = this.responseHeader.getCharacterEncoding(); if (charSet == null) charSet = httpHeader.DEFAULT_CHARSET; - serverFileUtils.writeX(this.getContentInputStream(), charSet, (Writer)procOS, bufferOS, charSet); + serverFileUtils.writeX(is, charSet, (Writer) procOS, bufferOS, charSet); } else { throw new IllegalArgumentException("Invalid procOS object type '" + procOS.getClass().getName() + "'"); } - } finally { - if (bufferOS != null) { - bufferOS.flush(); + } catch (IOException e) {} + + if (bufferOS != null) { + try { + bufferOS.flush(); bufferOS.close(); - if (file.length() == 0) file.delete(); - } + } catch (IOException e) {} + if (file.length() == 0) file.delete(); } } diff --git a/source/de/anomic/http/httpdFileHandler.java b/source/de/anomic/http/httpdFileHandler.java index 65f4f6435..b65050250 100644 --- a/source/de/anomic/http/httpdFileHandler.java +++ b/source/de/anomic/http/httpdFileHandler.java @@ -900,7 +900,7 @@ public final class httpdFileHandler { try {out.flush();}catch (Exception e) {} if (((String)requestHeader.get(httpHeader.CONNECTION, "close")).indexOf("keep-alive") == -1) { // wait a little time until everything closes so that clients can read from the streams/sockets - //try {Thread.sleep(200);} catch (InterruptedException e) {} // FIXME: is this necessary? + try {Thread.sleep(50);} catch (InterruptedException e) {} // FIXME: is this necessary? } } } diff --git a/source/de/anomic/server/serverFileUtils.java b/source/de/anomic/server/serverFileUtils.java index fd0372672..6e3791cc2 100644 --- a/source/de/anomic/server/serverFileUtils.java +++ b/source/de/anomic/server/serverFileUtils.java @@ -111,40 +111,46 @@ public final class serverFileUtils { return total; } - public static void writeX(InputStream source, OutputStream procOS, OutputStream bufferOS) throws IOException { + public static void writeX(InputStream source, OutputStream procOS, OutputStream bufferOS) { byte[] buffer = new byte[2048]; int l; - while ((l = source.read(buffer, 0, buffer.length)) >= 0) { + while (true) try { + l = source.read(buffer, 0, buffer.length); + if (l <= 0) break; if (procOS != null) procOS.write(buffer, 0, l); if (bufferOS != null) bufferOS.write(buffer, 0, l); - } + } catch (IOException e) {break;} // flush the streams - if (procOS != null) procOS.flush(); - if (bufferOS != null) bufferOS.flush(); + if (procOS != null) try { procOS.flush(); } catch (IOException e) {} + if (bufferOS != null) try { bufferOS.flush(); } catch (IOException e) {} buffer = null; } - public static void writeX(Reader source, Writer procOS, Writer bufferOS) throws IOException { + public static void writeX(Reader source, Writer procOS, Writer bufferOS) { char[] buffer = new char[2048]; int l; - while ((l = source.read(buffer, 0, buffer.length)) >= 0) { + while (true) try{ + l = source.read(buffer, 0, buffer.length); + if (l <= 0) break; if (procOS != null) procOS.write(buffer, 0, l); if (bufferOS != null) bufferOS.write(buffer, 0, l); - } + } catch (IOException e) {break;} // flush the streams - if (procOS != null) procOS.flush(); - if (bufferOS != null) bufferOS.flush(); + if (procOS != null) try { procOS.flush(); } catch (IOException e) {} + if (bufferOS != null) try { bufferOS.flush(); } catch (IOException e) {} buffer = null; } - public static void writeX(InputStream source, String inputCharset, Writer procOS, OutputStream bufferOS, String outputCharset) throws IOException { - InputStreamReader sourceReader = new InputStreamReader(source,inputCharset); - OutputStreamWriter bufferOSWriter = (bufferOS==null)?null:new OutputStreamWriter(bufferOS,outputCharset); - writeX(sourceReader,procOS,bufferOSWriter); + public static void writeX(InputStream source, String inputCharset, Writer procOS, OutputStream bufferOS, String outputCharset) { + try { + InputStreamReader sourceReader = new InputStreamReader(source, inputCharset); + OutputStreamWriter bufferOSWriter = (bufferOS == null) ? null : new OutputStreamWriter(bufferOS,outputCharset); + writeX(sourceReader, procOS, bufferOSWriter); + } catch (IOException e) {} } diff --git a/source/de/anomic/yacy/yacyCore.java b/source/de/anomic/yacy/yacyCore.java index d96243299..a47a00ffc 100644 --- a/source/de/anomic/yacy/yacyCore.java +++ b/source/de/anomic/yacy/yacyCore.java @@ -298,7 +298,6 @@ public class yacyCore { protected class publishThread extends Thread { private int added; private yacySeed seed; - private Exception error; private final serverSemaphore sync; private final List syncList; @@ -312,7 +311,6 @@ public class yacyCore { this.seed = seed; this.added = 0; - this.error = null; } public final void run() { @@ -333,7 +331,6 @@ public class yacyCore { } } catch (Exception e) { log.logSevere("publishThread: error with target seed " + seed.toString() + ": " + e.getMessage(), e); - this.error = e; } finally { this.syncList.add(this); this.sync.V();