| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * This file is part of Adblock Plus <http://adblockplus.org/>, | 2  * This file is part of Adblock Plus <http://adblockplus.org/>, | 
| 3  * Copyright (C) 2006-2014 Eyeo GmbH | 3  * Copyright (C) 2006-2014 Eyeo GmbH | 
| 4  * | 4  * | 
| 5  * Adblock Plus is free software: you can redistribute it and/or modify | 5  * Adblock Plus is free software: you can redistribute it and/or modify | 
| 6  * it under the terms of the GNU General Public License version 3 as | 6  * it under the terms of the GNU General Public License version 3 as | 
| 7  * published by the Free Software Foundation. | 7  * published by the Free Software Foundation. | 
| 8  * | 8  * | 
| 9  * Adblock Plus is distributed in the hope that it will be useful, | 9  * Adblock Plus is distributed in the hope that it will be useful, | 
| 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 21 import java.io.IOException; | 21 import java.io.IOException; | 
| 22 import java.io.OutputStream; | 22 import java.io.OutputStream; | 
| 23 | 23 | 
| 24 /** | 24 /** | 
| 25  * ChunkedOutputStream implements chunked HTTP transfer encoding wrapper for | 25  * ChunkedOutputStream implements chunked HTTP transfer encoding wrapper for | 
| 26  * OutputStream. | 26  * OutputStream. | 
| 27  */ | 27  */ | 
| 28 public class ChunkedOutputStream extends FilterOutputStream | 28 public class ChunkedOutputStream extends FilterOutputStream | 
| 29 { | 29 { | 
| 30   private static final int MAX_CHUNK_SIZE = 2048; | 30   private static final int MAX_CHUNK_SIZE = 2048; | 
| 31 |  | 
| 32   private static final byte[] CRLF = {'\r', '\n'}; | 31   private static final byte[] CRLF = {'\r', '\n'}; | 
| 33   private static final byte[] FINAL_CHUNK = new byte[] {'0', '\r', '\n', '\r', '
     \n'}; | 32   private static final byte[] FINAL_CHUNK = new byte[] {'0', '\r', '\n', '\r', '
     \n'}; | 
|  | 33 | 
| 34   private boolean wroteFinalChunk = false; | 34   private boolean wroteFinalChunk = false; | 
| 35 | 35 | 
| 36   public ChunkedOutputStream(OutputStream out) | 36   public ChunkedOutputStream(final OutputStream out) | 
| 37   { | 37   { | 
| 38     super(out); | 38     super(out); | 
| 39   } | 39   } | 
| 40 | 40 | 
| 41   @Override | 41   @Override | 
| 42   public void close() throws IOException | 42   public void close() throws IOException | 
| 43   { | 43   { | 
| 44     if (!wroteFinalChunk) | 44     if (!wroteFinalChunk) | 
| 45       writeFinalChunk(); | 45       writeFinalChunk(); | 
| 46     super.close(); | 46     super.close(); | 
| 47   } | 47   } | 
| 48 | 48 | 
| 49   @Override | 49   @Override | 
| 50   public void write(byte[] buffer, int offset, int length) throws IOException | 50   public void write(final byte[] buffer, final int offset, final int length) thr
     ows IOException | 
| 51   { | 51   { | 
| 52     writeChunk(buffer, offset, length); | 52     writeChunk(buffer, offset, length); | 
| 53   } | 53   } | 
| 54 | 54 | 
| 55   @Override | 55   @Override | 
| 56   public void write(byte[] buffer) throws IOException | 56   public void write(final byte[] buffer) throws IOException | 
| 57   { | 57   { | 
| 58     int offset = 0; | 58     int offset = 0; | 
| 59     int remain = buffer.length; | 59     int remain = buffer.length; | 
| 60     while (remain > 0) | 60     while (remain > 0) | 
| 61     { | 61     { | 
| 62       int size = MAX_CHUNK_SIZE; | 62       int size = MAX_CHUNK_SIZE; | 
| 63       if (size > remain) | 63       if (size > remain) | 
| 64         size = remain; | 64         size = remain; | 
| 65       writeChunk(buffer, offset, size); | 65       writeChunk(buffer, offset, size); | 
| 66       offset += size; | 66       offset += size; | 
| 67       remain -= size; | 67       remain -= size; | 
| 68     } | 68     } | 
| 69   } | 69   } | 
| 70 | 70 | 
| 71   @Override | 71   @Override | 
| 72   public void write(int oneByte) throws IOException | 72   public void write(final int oneByte) throws IOException | 
| 73   { | 73   { | 
| 74     throw new UnsupportedOperationException("Not implemented"); | 74     throw new UnsupportedOperationException("Not implemented"); | 
| 75   } | 75   } | 
| 76 | 76 | 
| 77   public void writeFinalChunk() throws IOException | 77   public void writeFinalChunk() throws IOException | 
| 78   { | 78   { | 
| 79     out.write(FINAL_CHUNK); | 79     out.write(FINAL_CHUNK); | 
| 80     out.flush(); | 80     out.flush(); | 
| 81     wroteFinalChunk = true; | 81     wroteFinalChunk = true; | 
| 82   } | 82   } | 
| 83 | 83 | 
| 84   private void writeChunk(byte buffer[], int offset, int length) throws IOExcept
     ion | 84   private void writeChunk(final byte buffer[], final int offset, final int lengt
     h) throws IOException | 
| 85   { | 85   { | 
| 86     // Zero sized buffers are ok on slow connections but not in our case - zero | 86     // Zero sized buffers are ok on slow connections but not in our case - zero | 
| 87     // chunk is used to indicate the end of transfer. | 87     // chunk is used to indicate the end of transfer. | 
| 88     if (length > 0) | 88     if (length > 0) | 
| 89     { | 89     { | 
| 90       // Write the chunk length as a hex number | 90       // Write the chunk length as a hex number | 
| 91       writeHex(length); | 91       writeHex(length); | 
| 92       // Write the data | 92       // Write the data | 
| 93       out.write(buffer, offset, length); | 93       out.write(buffer, offset, length); | 
| 94       // Write a CRLF | 94       // Write a CRLF | 
| 95       out.write(CRLF); | 95       out.write(CRLF); | 
| 96       // Flush the underlying stream | 96       // Flush the underlying stream | 
| 97       out.flush(); | 97       out.flush(); | 
| 98     } | 98     } | 
| 99   } | 99   } | 
| 100 | 100 | 
| 101   private void writeHex(int i) throws IOException | 101   private void writeHex(final int i) throws IOException | 
| 102   { | 102   { | 
| 103     out.write(Integer.toHexString(i).getBytes()); | 103     out.write(Integer.toHexString(i).getBytes()); | 
| 104     out.write(CRLF); | 104     out.write(CRLF); | 
| 105   } | 105   } | 
| 106 } | 106 } | 
| OLD | NEW | 
|---|