#19447 remove compatibility fallbacks for Java < 8
This commit is contained in:
parent
aed67715af
commit
f7a5151bbb
18 changed files with 46 additions and 260 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue