2015-02-03 16 views
5

Ich habe eine programmatische Undertow Server-Setup. Statischer Inhalt wird auch von Undertow ohne Reverse-Proxy bedient. Java-Code für Undertow Startup sieht wie folgt aus:Komprimieren Undertow Server Antworten

ResourceManager resourceManager = 
    new FileResourceManager(new File("deploymentDir"), 100); 

DeploymentInfo servletBuilder = Servlets.deployment() 
     .setResourceManager(resourceManager) 
     .setDeploymentName("testDeployment") 
     .setContextPath("/"); 

DeploymentManager manager = Servlets.defaultContainer() 
     .addDeployment(servletBuilder); 
manager.deploy(); 

Undertow.Builder builder = Undertow.builder(); 
builder.addHttpListener(8080, domainName); 

PathHandler path = Handlers.path(Handlers.redirect("/")) 
     .addPrefixPath("/", manager.start()); 

Undertow server = builder.setHandler(path).build(); 
server.start(); 

Ich frage mich, wie kann man gzip Server-Antworten in Undertow?

Danke, Vitaliy.

Antwort

8

Ich musste in Undertow Quelle GzipContentEncodingTestCase betrachten, um es zur Arbeit zu bringen. Man muss eine EncodingHandler mit entsprechenden Parametern erstellen, und rufen Sie dann setNext(), so dass an der Kette an die PathHandler:

PathHandler path = Handlers.path(Handlers.redirect("/")) 
    .addPrefixPath("/", manager.start()); 

final EncodingHandler handler = 
    new EncodingHandler(new ContentEncodingRepository() 
     .addEncodingHandler("gzip", 
      new GzipEncodingProvider(), 50, 
      Predicates.parse("max-content-size[5]"))) 
     .setNext(path); 

// ... 
Undertow server = builder.setHandler(handler).build(); 
0

eine sehr interessante Verbindung, die mir geholfen persönlich ist: Add compression to Server-Sent events with Undertow. Alle im EncodingHandler von @siphiuel verwendeten Parameter werden nacheinander erläutert.

Hier eine kurze Zusammenfassung für eine GZIP-Komprimierung zum Beispiel. die Parameter der addEncodingHandler(...) wäre:

  • den Typ („gzip“)
  • die EncodingProvider anzuwenden (Undertow bietet Implementierungen für deflate und gzip)
  • die Priorität (mehrere Anbieter angewendet werden kann, so dass die Priorität wird verwendet, um den Provider zu wählen)
  • das Prädikat, um die Kodierung zu aktivieren (in @ siphiuels Beispiel werden nur Antworten mit einer Inhaltsgröße> 5 Bytes kodiert - in dem Link, den ich erwähnte, sind 5 KB aber meine Tests habe bewiesen, dass es 5 Bytes ist).
0

Die Antwort von @siphiuel sieht für mich richtig aus.

jedoch EncodingHandler mit gzip-Codierung kann auch, wie unten erstellt werden:

HttpHandler pathHandler = Handlers.path(Handlers.redirect("/")) 
     .addPrefixPath("/", exchange -> exchange.getResponseSender().send("echo")); 

    HttpHandler encodingHandler = new EncodingHandler.Builder().build(null) 
     .wrap(pathHandler); 

    Undertow server = Undertow.builder() 
     .addHttpListener(8080, "localhost") 
     .setHandler(encodingHandler).build(); 
    server.start(); 

EncodingHandler stellt eine HandlerBuilder, dass standardmäßig fügt GzipEncodingProvider und DeflateEncodingProvider mit Standardkonfiguration. Daher ist Ihr Code nicht mit dem Konstruktor und seinen Parametern zum Erstellen eines EncodingHandlers gekoppelt.

Darüber hinaus gibt HandlerBuilder # build einen HandlerWrapper für fließende HttpHandler Wrapping/Chaining zurück.

Verwandte Themen