2015-02-03 33 views
5

Ho una configurazione del server Undertow programmatico. Anche il contenuto statico è servito da Undertow, senza un proxy inverso. codice Java per l'avvio Undertow assomiglia a questo:Comprimere le risposte del server Undertow

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(); 

Mi chiedo come fa le risposte del server uno gzip in Undertow?

Grazie, Vitaliy.

risposta

8

Ho dovuto guardare a GzipContentEncodingTestCase nella fonte di Undertow per farlo funzionare. Si deve creare un EncodingHandler con parametri appropriati, e quindi richiamare setNext() in modo che a catena al 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

Un link molto interessante che mi ha aiutato personalmente è: Add compression to Server-Sent events with Undertow. Tutti i parametri utilizzati in EncodingHandler forniti da @siphiuel sono spiegati uno ad uno.

Ecco un breve riepilogo per una compressione gzip ad esempio. i parametri di addEncodingHandler(...) sarebbero:

  • tipo (“gzip”)
  • l'EncodingProvider applicare (Undertow fornisce implementazioni per sgonfiare e gzip)
  • (diversi operatori può essere applicata la priorità, in modo che il priorità verrà utilizzata per scegliere il fornitore da applicare)
  • il predicato per attivare la codifica (nell'esempio di @siphiuel, solo le risposte con dimensione del contenuto> 5 byte saranno codificate - nel link che ho condiviso è stato menzionato 5 KB ma i miei test hanno dimostrato che è 5 byte).
0

La risposta di @siphiuel mi sembra corretta.

Tuttavia, EncodingHandler con codifica GZIP può anche essere creato come di seguito:

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 fornisce HandlerBuilder che per default aggiunge GzipEncodingProvider e DeflateEncodingProvider utilizzando la configurazione di default. Quindi il tuo codice non è accoppiato con il costruttore e i suoi parametri per creare un EncodingHandler.

Inoltre, HandlerBuilder # build restituisce un HandlerWrapper per il wrapping/concatenamento HttpHandler fluente.