#19447 remove compatibility fallbacks for Java < 8

This commit is contained in:
2beaucoup 2016-01-14 14:55:42 +01:00
parent aed67715af
commit f7a5151bbb
18 changed files with 46 additions and 260 deletions

View file

@ -4,7 +4,6 @@
package akka.http.scaladsl.coding
import java.lang.reflect.{ Method, InvocationTargetException }
import java.util.zip.{ Inflater, Deflater }
import akka.stream.stage._
import akka.util.{ ByteStringBuilder, ByteString }
@ -14,8 +13,6 @@ import akka.http.impl.util._
import akka.http.scaladsl.model._
import akka.http.scaladsl.model.headers.HttpEncodings
import scala.util.control.NonFatal
class Deflate(val messageFilter: HttpMessage Boolean) extends Coder with StreamDecoder {
val encoding = HttpEncodings.deflate
def newCompressor = new DeflateCompressor
@ -47,7 +44,10 @@ class DeflateCompressor extends Compressor {
deflater.setInput(input.toArray)
drainDeflater(deflater, buffer)
}
protected def flushWithBuffer(buffer: Array[Byte]): ByteString = DeflateCompressor.flush(deflater, buffer)
protected def flushWithBuffer(buffer: Array[Byte]): ByteString = {
val written = deflater.deflate(buffer, 0, buffer.length, Deflater.SYNC_FLUSH)
ByteString.fromArray(buffer, 0, written)
}
protected def finishWithBuffer(buffer: Array[Byte]): ByteString = {
deflater.finish()
val res = drainDeflater(deflater, buffer)
@ -72,40 +72,6 @@ class DeflateCompressor extends Compressor {
private[http] object DeflateCompressor {
val MinBufferSize = 1024
// TODO: remove reflective call once Java 6 support is dropped
/**
* Compatibility mode: reflectively call deflate(..., flushMode) if available or use a hack otherwise
*/
private[this] val flushImplementation: (Deflater, Array[Byte]) ByteString = {
def flushHack(deflater: Deflater, buffer: Array[Byte]): ByteString = {
// hack: change compression mode to provoke flushing
deflater.deflate(EmptyByteArray, 0, 0)
deflater.setLevel(Deflater.NO_COMPRESSION)
val res1 = drainDeflater(deflater, buffer)
deflater.setLevel(Deflater.BEST_COMPRESSION)
val res2 = drainDeflater(deflater, buffer)
res1 ++ res2
}
def reflectiveDeflateWithSyncMode(method: Method, syncFlushConstant: Int)(deflater: Deflater, buffer: Array[Byte]): ByteString =
try {
val written = method.invoke(deflater, buffer, 0: java.lang.Integer, buffer.length: java.lang.Integer, syncFlushConstant: java.lang.Integer).asInstanceOf[Int]
ByteString.fromArray(buffer, 0, written)
} catch {
case t: InvocationTargetException throw t.getTargetException
}
try {
val deflateWithFlush = classOf[Deflater].getMethod("deflate", classOf[Array[Byte]], classOf[Int], classOf[Int], classOf[Int])
require(deflateWithFlush.getReturnType == classOf[Int])
val flushModeSync = classOf[Deflater].getField("SYNC_FLUSH").get(null).asInstanceOf[Int]
reflectiveDeflateWithSyncMode(deflateWithFlush, flushModeSync)
} catch {
case NonFatal(e) flushHack
}
}
def flush(deflater: Deflater, buffer: Array[Byte]): ByteString = flushImplementation(deflater, buffer)
@tailrec
def drainDeflater(deflater: Deflater, buffer: Array[Byte], result: ByteStringBuilder = new ByteStringBuilder()): ByteString = {
val len = deflater.deflate(buffer)