2015-02-03 13 views
5

मेरे पास प्रोग्रामेटिक अंडरटेव सर्वर सेटअप है। स्टेटिक सामग्री अंडरटेव द्वारा भी एक रिवर्स प्रॉक्सी के बिना परोसा जाता है। अंडरटो स्टार्टअप के लिए जावा कोड इस तरह दिखता है:अंडरटेव सर्वर प्रतिक्रियाओं को संपीड़ित करना

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

मैं सोच रहा हूँ कैसे अंडरटो में एक gzip सर्वर प्रतिसाद करता है?

धन्यवाद, विटालि।

उत्तर

8

मैं अंडरटो के स्रोत में GzipContentEncodingTestCase को देखने के लिए यह काम करने के लिए पाने के लिए था।

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

एक बहुत ही दिलचस्प लिंक है कि मुझे व्यक्तिगत रूप से मदद की है: Add compression to Server-Sent events with Undertow एक उचित मानकों के साथ एक EncodingHandler बनाने के लिए, और फिर इसे PathHandler को setNext() आह्वान ताकि श्रृंखला करना पड़ता है। @siphiuel द्वारा प्रदान किए गए एन्कोडिंग हैंडलर में उपयोग किए गए सभी पैरामीटर एक-एक करके समझाए जाते हैं।

उदाहरण के लिए एक gzip संपीड़न के लिए यहां एक त्वरित सारांश। addEncodingHandler(...) के मापदंडों होगा:

  • प्रकार ("gzip")
  • EncodingProvider लागू करने के लिए
  • प्राथमिकता (एक से अधिक प्रदाताओं लागू किया जा सकता (अंडरटो Deflate और gzip के लिए कार्यान्वयन प्रदान करता है), इसलिए कड़ी में मैं साझा यह उल्लेख किया गया है 5 KB लेकिन मेरे परीक्षण - प्राथमिकता (एन्कोडिंग सक्रिय करने के लिए @ siphiuel के उदाहरण में, केवल सामग्री आकार> 5 बाइट्स इनकोडिंग किया जाएगा साथ प्रतिक्रियाओं लागू करने के लिए प्रदाता को चुना)
  • विधेय उपयोग किया जाएगा साबित कर दिया है कि यह 5 बाइट्स है)।
0

@siphiuel से जवाब मेरे लिए सही लग रहा है।

हालांकि, GZIP एन्कोडिंग के साथ EncodingHandler भी नीचे के रूप में बनाया जा सकता है:

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 एक HandlerBuilder कि डिफ़ॉल्ट रूप से GzipEncodingProvider और DeflateEncodingProvider डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग कर कहते हैं प्रदान करता है। इसलिए आपका कोड एन्कोडिंग हैंडलर बनाने के लिए कन्स्ट्रक्टर और इसके पैरामीटर के साथ नहीं है।

साथ ही, HandlerBuilder # build धाराप्रवाह HttpHandler रैपिंग/श्रृंखलन के लिए एक HandlerWrapper देता है।

संबंधित मुद्दे