2015-02-03 19 views
5

Mam programową konfigurację serwera Undertow. Treść statyczna obsługiwana jest również przez Undertow, bez odwrotnego proxy. Kod Java do uruchamiania Undertow wygląda następująco:Kompresowanie odpowiedzi serwera 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(); 

Zastanawiam się, jak działa jeden serwer gzip w Undertow?

Dzięki, Witalij.

Odpowiedz

8

Musiałem spojrzeć na GzipContentEncodingTestCase w źródle Undertow, aby go uruchomić. Trzeba utworzyć EncodingHandler z odpowiednimi parametrami, a następnie powołać setNext() tak, że do łańcucha to do 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

Bardzo ciekawy link, który pomógł mi osobiście jest: Add compression to Server-Sent events with Undertow. Wszystkie parametry używane w EncodingHandler dostarczanym przez @siphiuel są wyjaśniane jeden po drugim.

Oto krótkie podsumowanie kompresji gzip na przykład. parametry addEncodingHandler(...) byłoby:

  • typ („gzip”)
  • EncodingProvider zastosować (Undertow zapewnia implementacje dla opróżnić i gzip)
  • priorytetem (wielu dostawców mogą być stosowane, więc priorytet zostanie użyty do wyboru dostawcy do zastosowania)
  • predykat do aktywacji kodowania (w przykładzie @ siphiuel tylko odpowiedzi o rozmiarze treści> 5 bajtów będą zakodowane - w linku udostępniłem to wspomniane 5 KB ale moje testy udowodnili, że to 5 bajtów).
0

Odpowiedź od @siphiuel wygląda dla mnie poprawnie.

Jednak EncodingHandler z kodowaniem GZIP mogą być również tworzone, jak poniżej:

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 zapewnia HandlerBuilder że domyślnie dodaje GzipEncodingProvider i DeflateEncodingProvider za pomocą domyślnej konfiguracji. Więc twój kod nie jest sprzężony z konstruktorem i jego parametrami do tworzenia EncodingHandler.

Dodatkowo, HandlerBuilder # build zwraca HandlerWrapper do płynnego owijania/łączenia łańcuchów HttpHandler.

Powiązane problemy