2015-02-03 19 views
5

tôi có thiết lập máy chủ Undertow có lập trình. Nội dung tĩnh được phục vụ bởi Undertow là tốt, mà không có một proxy ngược lại. Mã Java cho việc khởi động Undertow trông giống như sau:Nén phản hồi của máy chủ 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(); 

Tôi tự hỏi làm thế nào một máy chủ gzip phản hồi trong Undertow?

Xin cảm ơn, Vitaliy.

Trả lời

8

Tôi phải xem GzipContentEncodingTestCase trong nguồn của Undertow để làm cho nó hoạt động. Người ta phải tạo một EncodingHandler với các thông số phù hợp, sau đó gọi setNext() để đến chuỗi nó vào 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

Một liên kết rất thú vị đã giúp cá nhân tôi là: Add compression to Server-Sent events with Undertow. Tất cả các tham số được sử dụng trong EncodingHandler được cung cấp bởi @siphiuel được giải thích từng cái một.

Dưới đây là tóm tắt nhanh về nén gzip chẳng hạn. các thông số của addEncodingHandler(...) sẽ là:

  • loại (“gzip”)
  • các EncodingProvider áp dụng (Undertow cung cấp triển khai cho deflate và gzip)
  • ưu tiên (nhiều các nhà cung cấp thể được áp dụng, vì vậy ưu tiên sẽ được sử dụng để chọn nhà cung cấp để áp dụng)
  • biến vị ngữ để kích hoạt mã hóa (trong ví dụ của @ siphiuel, chỉ phản hồi với kích thước nội dung> 5 Byte sẽ được mã hóa - trong liên kết tôi đã chia sẻ đã chứng minh rằng đó là 5 Bytes).
0

Câu trả lời từ @siphiuel có vẻ đúng với tôi.

Tuy nhiên, EncodingHandler với mã hóa GZIP cũng có thể được tạo ra như dưới đây:

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 cung cấp một HandlerBuilder rằng theo mặc định thêm GzipEncodingProvider và DeflateEncodingProvider sử dụng cấu hình mặc định. Vì vậy, mã của bạn không được kết hợp với hàm tạo và các tham số của nó để tạo ra một EncodingHandler.

Ngoài ra, HandlerBuilder # build trả về một HandlerWrapper cho gói/chuỗi chuỗi HttpHandler thông thạo.

Các vấn đề liên quan