diff --git a/source/de/anomic/htmlFilter/htmlFilterOutputStream.java b/source/de/anomic/htmlFilter/htmlFilterOutputStream.java index 14c236efc..e3d69a5b3 100644 --- a/source/de/anomic/htmlFilter/htmlFilterOutputStream.java +++ b/source/de/anomic/htmlFilter/htmlFilterOutputStream.java @@ -322,7 +322,7 @@ public final class htmlFilterOutputStream extends OutputStream { } else if (inScript) { buffer.append(b); int bufferLength = buffer.length(); - if ((b == rb) && (buffer.length() > 14) && + if ((b == rb) && (bufferLength > 14) && (buffer.byteAt(bufferLength - 8) == (byte) '/') && (buffer.byteAt(bufferLength - 7) == (byte) 's') && (buffer.byteAt(bufferLength - 6) == (byte) 'c') && diff --git a/source/de/anomic/http/httpc.java b/source/de/anomic/http/httpc.java index 570b4487f..3fa30d1b7 100644 --- a/source/de/anomic/http/httpc.java +++ b/source/de/anomic/http/httpc.java @@ -105,6 +105,7 @@ public final class httpc { } private static final httpcPool theHttpcPool; + boolean removedFromPool = false; static { // implementation of session thread pool GenericObjectPool.Config config = new GenericObjectPool.Config(); @@ -129,17 +130,18 @@ public final class httpc { public static httpc getInstance(String server, int port, int timeout, boolean ssl, String remoteProxyHost, int remoteProxyPort) throws IOException { + httpc newHttpc; try { // fetching a new httpc from the object pool - httpc newHttpc = (httpc) httpc.theHttpcPool.borrowObject(); - - // initialize it - newHttpc.init(server,port,timeout,ssl,remoteProxyHost, remoteProxyPort); - return newHttpc; + newHttpc = (httpc) httpc.theHttpcPool.borrowObject(); } catch (Exception e) { throw new IOException("Unable to initialize a new httpc. " + e.getMessage()); - } + } + + // initialize it + newHttpc.init(server,port,timeout,ssl,remoteProxyHost, remoteProxyPort); + return newHttpc; } public static httpc getInstance(String server, int port, int timeout, boolean ssl) throws IOException { @@ -167,7 +169,7 @@ public final class httpc { } protected void finalize() throws Throwable { - System.err.println("Httpc object was not returned to object pool."); + if (!this.removedFromPool) System.err.println("Httpc object was not returned to object pool."); this.reset(); httpc.theHttpcPool.invalidateObject(this); } @@ -240,7 +242,7 @@ public final class httpc { // http client void init(String server, int port, int timeout, boolean ssl, - String remoteProxyHost, int remoteProxyPort) throws IOException { + String remoteProxyHost, int remoteProxyPort) throws IOException { this.init(remoteProxyHost, remoteProxyPort, timeout, ssl); this.remoteProxyUse = true; this.savedRemoteHost = server + ((port == 80) ? "" : (":" + port)); @@ -417,7 +419,7 @@ public final class httpc { public byte[] writeContent(OutputStream procOS) throws IOException { serverByteBuffer sbb = new serverByteBuffer(); - writeContentX(procOS, sbb); + writeContentX(procOS, sbb, httpc.this.clientInput); return sbb.getBytes(); } @@ -426,14 +428,14 @@ public final class httpc { // a file or both. FileOutputStream bufferOS = null; if (file != null) bufferOS = new FileOutputStream(file); - writeContentX(procOS, bufferOS); + writeContentX(procOS, bufferOS, httpc.this.clientInput); if (bufferOS != null) { bufferOS.close(); if (file.length() == 0) file.delete(); } } - public void writeContentX(OutputStream procOS, OutputStream bufferOS) throws IOException { + public void writeContentX(OutputStream procOS, OutputStream bufferOS, InputStream clientInput) throws IOException { // we write length bytes, but if length == -1 (or < 0) then we // write until the input stream closes // procOS == null -> no write to procOS @@ -442,7 +444,7 @@ public final class httpc { // and change the Content-Encoding and Content-Length attributes in the header byte[] buffer = new byte[2048]; int l; - long len = 0; + long len = 0; // find out length long length = responseHeader.contentLength(); @@ -473,7 +475,7 @@ public final class httpc { } baos.flush(); // now uncompress - InputStream dis = (InputStream) new GZIPInputStream(new ByteArrayInputStream(baos.toByteArray())); + InputStream dis = new GZIPInputStream(new ByteArrayInputStream(baos.toByteArray())); try { while ((l = dis.read(buffer)) > 0) { if (procOS != null) procOS.write(buffer, 0, l); @@ -489,18 +491,18 @@ public final class httpc { } baos.close(); baos = null; } else { - // no content-length was given, thus we read until the connection closes - InputStream dis = (gzip) ? (InputStream) new GZIPInputStream(clientInput) : (InputStream) clientInput; - try { - while ((l = dis.read(buffer, 0, buffer.length)) >= 0) { - if (procOS != null) procOS.write(buffer, 0, l); - if (bufferOS != null) bufferOS.write(buffer, 0, l); - } - } catch (java.net.SocketException e) { - // this is not an error: it's ok, we waited for that - } catch (java.net.SocketTimeoutException e) { + // no content-length was given, thus we read until the connection closes + InputStream dis = (gzip) ? (InputStream) new GZIPInputStream(clientInput) : (InputStream) clientInput; + try { + while ((l = dis.read(buffer, 0, buffer.length)) >= 0) { + if (procOS != null) procOS.write(buffer, 0, l); + if (bufferOS != null) bufferOS.write(buffer, 0, l); + } + } catch (java.net.SocketException e) { + // this is not an error: it's ok, we waited for that + } catch (java.net.SocketTimeoutException e) { // the same here; should be ok. - } + } } // close the streams @@ -1180,6 +1182,7 @@ final class httpcFactory implements org.apache.commons.pool.PoolableObjectFactor public void destroyObject(Object obj) { if (obj instanceof httpc) { httpc theHttpc = (httpc) obj; + theHttpc.removedFromPool = true; } } diff --git a/source/de/anomic/http/httpdProxyHandler.java b/source/de/anomic/http/httpdProxyHandler.java index 4611a1647..9c992d994 100644 --- a/source/de/anomic/http/httpdProxyHandler.java +++ b/source/de/anomic/http/httpdProxyHandler.java @@ -394,7 +394,7 @@ public final class httpdProxyHandler extends httpdAbstractHandler implements htt // maybe the content length is missing if (!(cachedResponseHeader.containsKey("CONTENT-LENGTH"))) - cachedResponseHeader.put("CONTENT-LENGTH", (String) ("" + cacheFile.length())); + cachedResponseHeader.put("CONTENT-LENGTH", Long.toString(cacheFile.length())); // check if we can send a 304 instead the complete content if (requestHeader.containsKey("IF-MODIFIED-SINCE")) {