2015-02-03 34 views
5

Programatik bir Undertow sunucu kurulumuna sahibim. Statik içerik, ters bir proxy olmadan, Undertow tarafından da sunulmaktadır. Akıntı başlangıçta için Java kodu şuna benzer: Ben Akıntı bir Gzip sunucu yanıtlarını nasıl yaptığınıUndertow sunucu yanıtlarının sıkıştırılması

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

merak ediyorum?

Teşekkürler, Vitaliy.

cevap

8

Çalışmasını almak için Undertow'un kaynağında GzipContentEncodingTestCase'a bakmak zorundaydım. Add compression to Server-Sent events with Undertow: şahsen bana yardımcı olan

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

Çok ilginç bir bağlantıyı: Tek uygun parametrelerle bir EncodingHandler oluşturmak ve sonra PathHandler için zincire böylece setNext() çağırmak zorundadır. @siphiuel tarafından sağlanan EncodingHandler'da kullanılan tüm parametreler tek tek açıklanmaktadır.

Örneğin gzip sıkıştırması için hızlı bir özet. addEncodingHandler(...) parametreleri olacaktır:

  • tipi (“gzip”)
  • EncodingProvider uygulamak için öncelikli (çoklu sağlayıcılar uygulanabilir
  • (Akıntı deflate ve gzip için uygulamaları), bu yüzden önceliği uygulamak için sağlayıcının seçilmesi için kullanılacak)
  • kodlamayı etkinleştirmeye yönelik yüklem (@ siphiuel örneğinde, sadece içerik boyutu> 5 Byte olan kodlar kodlanacaktır) paylaştığım bağlantıda 5 KB'tır, ancak testlerim 5 Byte olduğunu kanıtladı.
0

@siphiuel'den gelen cevap bana doğru görünüyor.

Ancak GZIP kodlama ile EncodingHandler de aşağıdaki gibi oluşturulabilir:

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 varsayılan GzipEncodingProvider ve DeflateEncodingProvider varsayılan konfigürasyonu kullanılarak ekler bir HandlerBuilder sağlar. Bu nedenle kodunuz yapıcı ve EncodingHandler oluşturma parametreleri ile eşleştirilmemiş.

Ayrıca, HandlerBuilder # build, akıcı HttpHandler sarma/zincirleme için bir HandlerWrapper döndürür.