@@ -3,28 +3,59 @@ package server.http.encoding
33import java .io .{FilterOutputStream , OutputStream }
44
55class ChunkedOutputStream (out : OutputStream , chunkSize : Int ) extends FilterOutputStream (out) {
6- override def write (b : Array [Byte ]): Unit = {
7- for (i <- 0 to b.length- 1 by chunkSize) {
8- val curChunkLength = math.min(b.length- i, chunkSize)
9- writeChunkLength(curChunkLength)
10- super .write(b.slice(i, i+ curChunkLength))
6+ private val buffer = new Array [Byte ](chunkSize)
7+ private var currentBufferPos = 0
8+ private val CRLF = Array [Byte ](13 , 10 )
9+
10+ override def write (b : Array [Byte ], start : Int , length : Int ): Unit = {
11+ if (length <= 0 ) {
12+ return
13+ }
14+ if (currentBufferPos + length > chunkSize) {
15+ val remainingInBuffer = chunkSize - currentBufferPos
16+ System .arraycopy(b, start, buffer, currentBufferPos, remainingInBuffer)
17+ currentBufferPos = chunkSize
18+ flushBuffer()
19+ write(b, start+ remainingInBuffer, length- remainingInBuffer)
20+ }
21+ else {
22+ System .arraycopy(b, start, buffer, currentBufferPos, length)
23+ currentBufferPos += length
24+ if (currentBufferPos == chunkSize) {
25+ flushBuffer()
26+ }
27+ }
28+ }
29+
30+ override def write (i : Int ): Unit = {
31+ buffer(currentBufferPos) = i.toByte
32+ currentBufferPos += 1
33+ if (currentBufferPos == chunkSize) {
34+ flushBuffer()
35+ }
36+ }
37+
38+ private def flushBuffer (): Unit = {
39+ if (currentBufferPos > 0 ) {
40+ writeChunkLength(currentBufferPos)
41+ out.write(buffer, 0 , currentBufferPos)
1142 writeCRLF()
43+ currentBufferPos = 0
1244 }
1345 }
1446
1547 private def writeChunkLength (l : Int ): Unit = {
16- super .write(l.toHexString.getBytes(" UTF-8" ))
48+ out .write(l.toHexString.getBytes(" UTF-8" ))
1749 writeCRLF()
1850 }
1951
2052 private def writeCRLF (): Unit = {
21- super .write(13 )
22- super .write(10 )
53+ out.write(CRLF , 0 , CRLF .length)
2354 }
2455
25- override def flush (): Unit = {
56+ def finish (): Unit = {
57+ flushBuffer()
2658 writeChunkLength(0 )
2759 writeCRLF()
28- super .flush()
2960 }
3061}
0 commit comments