From ryan at dewell.org Mon May 1 17:54:35 2017 From: ryan at dewell.org (Ryan Dewell) Date: Mon, 1 May 2017 15:54:35 -0600 Subject: [undertow-dev] SSE: testing time between events Message-ID: Playing around at the moment, and missing something about the threading situation as it pertains to sending events. In my?ServerSentEventConnectionCallback: public void connected(ServerSentEventConnection connection, String lastEventId) { try { ? for (int i = 0; i<10; i++){ ? ? connection.send("i="+i); ? ? Thread.sleep(1000); ? } } catch (Exception e) { ? throw new RuntimeException(e); } } Sending events, with one second between each. I?d expect the time between events to be reflected in the browser / client. ?However what instead happens is all 10 events arrive within the same millisecond (nanoseconds apart according to Chrome console time). So I?m missing something here. ?But I don?t see anything obvious. ?For example, there is nothing like a ?flush()? on ServerSentEventConnection that could be used after each event is sent. Ideas/guidance? Thanks! Ryan -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170501/fde87510/attachment.html From sdouglas at redhat.com Mon May 1 20:20:06 2017 From: sdouglas at redhat.com (Stuart Douglas) Date: Tue, 2 May 2017 10:20:06 +1000 Subject: [undertow-dev] SSE: testing time between events In-Reply-To: References: Message-ID: When you send you are blocking the IO thread, so the events don't actually get put on the wire till the IO thread returns. Stuart On Tue, May 2, 2017 at 7:54 AM, Ryan Dewell wrote: > Playing around at the moment, and missing something about the threading > situation as it pertains to sending events. > > In my ServerSentEventConnectionCallback: > > public void connected(ServerSentEventConnection connection, String > lastEventId) { > try { > for (int i = 0; i<10; i++){ > connection.send("i="+i); > Thread.sleep(1000); > } > } catch (Exception e) { > throw new RuntimeException(e); > } > } > > Sending events, with one second between each. > > I?d expect the time between events to be reflected in the browser / client. > However what instead happens is all 10 events arrive within the same > millisecond (nanoseconds apart according to Chrome console time). > > So I?m missing something here. But I don?t see anything obvious. For > example, there is nothing like a ?flush()? on ServerSentEventConnection that > could be used after each event is sent. > > Ideas/guidance? > > Thanks! > > Ryan > > > _______________________________________________ > undertow-dev mailing list > undertow-dev at lists.jboss.org > https://lists.jboss.org/mailman/listinfo/undertow-dev From ryan at dewell.org Mon May 1 21:19:55 2017 From: ryan at dewell.org (Ryan Dewell) Date: Mon, 1 May 2017 19:19:55 -0600 Subject: [undertow-dev] SSE: testing time between events In-Reply-To: References: Message-ID: <2406e1b5-3516-423d-976c-95853888b5b8@Spark> OK, on connected I could send say the 10 ?events? which occurred since ?lastEventId?. Once the connection has been established/connected, where do I send the next N events, that maybe occur minutes after the initial ?connected?. In my mind I thought this all occurred inside ?connected?. ?Meaning connected would wait until some new events were available, send those, ad infinitum. Thanks, Ryan On May 1, 2017, 6:20 PM -0600, Stuart Douglas , wrote: > When you send you are blocking the IO thread, so the events don't > actually get put on the wire till the IO thread returns. > > Stuart > > On Tue, May 2, 2017 at 7:54 AM, Ryan Dewell wrote: > > Playing around at the moment, and missing something about the threading > > situation as it pertains to sending events. > > > > In my ServerSentEventConnectionCallback: > > > > public void connected(ServerSentEventConnection connection, String > > lastEventId) { > > try { > > for (int i = 0; i<10; i++){ > > connection.send("i="+i); > > Thread.sleep(1000); > > } > > } catch (Exception e) { > > throw new RuntimeException(e); > > } > > } > > > > Sending events, with one second between each. > > > > I?d expect the time between events to be reflected in the browser / client. > > However what instead happens is all 10 events arrive within the same > > millisecond (nanoseconds apart according to Chrome console time). > > > > So I?m missing something here. But I don?t see anything obvious. For > > example, there is nothing like a ?flush()? on ServerSentEventConnection that > > could be used after each event is sent. > > > > Ideas/guidance? > > > > Thanks! > > > > Ryan > > > > > > _______________________________________________ > > undertow-dev mailing list > > undertow-dev at lists.jboss.org > > https://lists.jboss.org/mailman/listinfo/undertow-dev -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170501/c044e68a/attachment.html From sdouglas at redhat.com Mon May 1 23:43:36 2017 From: sdouglas at redhat.com (Stuart Douglas) Date: Tue, 2 May 2017 13:43:36 +1000 Subject: [undertow-dev] SSE: testing time between events In-Reply-To: <2406e1b5-3516-423d-976c-95853888b5b8@Spark> References: <2406e1b5-3516-423d-976c-95853888b5b8@Spark> Message-ID: If you want to use a pattern like that you can create another thread inside the connected() method. In general though blocking a thread is not a great way to handle this as you need one thread per connection. You would generally register the created endpoint somewhere in connected, and then whenever an event is generated send the message from whatever thread generated the event. Stuart On Tue, May 2, 2017 at 11:19 AM, Ryan Dewell wrote: > OK, on connected I could send say the 10 ?events? which occurred since > ?lastEventId?. > > Once the connection has been established/connected, where do I send the next > N events, that maybe occur minutes after the initial ?connected?. > > In my mind I thought this all occurred inside ?connected?. Meaning > connected would wait until some new events were available, send those, ad > infinitum. > > Thanks, > > Ryan > > > On May 1, 2017, 6:20 PM -0600, Stuart Douglas , wrote: > > When you send you are blocking the IO thread, so the events don't > actually get put on the wire till the IO thread returns. > > Stuart > > On Tue, May 2, 2017 at 7:54 AM, Ryan Dewell wrote: > > Playing around at the moment, and missing something about the threading > situation as it pertains to sending events. > > In my ServerSentEventConnectionCallback: > > public void connected(ServerSentEventConnection connection, String > lastEventId) { > try { > for (int i = 0; i<10; i++){ > connection.send("i="+i); > Thread.sleep(1000); > } > } catch (Exception e) { > throw new RuntimeException(e); > } > } > > Sending events, with one second between each. > > I?d expect the time between events to be reflected in the browser / client. > However what instead happens is all 10 events arrive within the same > millisecond (nanoseconds apart according to Chrome console time). > > So I?m missing something here. But I don?t see anything obvious. For > example, there is nothing like a ?flush()? on ServerSentEventConnection that > could be used after each event is sent. > > Ideas/guidance? > > Thanks! > > Ryan > > > _______________________________________________ > undertow-dev mailing list > undertow-dev at lists.jboss.org > https://lists.jboss.org/mailman/listinfo/undertow-dev From ryan at dewell.org Tue May 2 11:07:43 2017 From: ryan at dewell.org (Ryan Dewell) Date: Tue, 2 May 2017 09:07:43 -0600 Subject: [undertow-dev] SSE: testing time between events In-Reply-To: References: <2406e1b5-3516-423d-976c-95853888b5b8@Spark> Message-ID: <3ac4aa86-8992-49d1-8e80-383bbc9b0b53@Spark> Ah, now I get it. ?I was thinking of ?connected? in the wrong way. ?Thank you! Ryan On May 1, 2017, 9:43 PM -0600, Stuart Douglas , wrote: > If you want to use a pattern like that you can create another thread > inside the connected() method. > > In general though blocking a thread is not a great way to handle this > as you need one thread per connection. You would generally register > the created endpoint somewhere in connected, and then whenever an > event is generated send the message from whatever thread generated the > event. > > Stuart > > On Tue, May 2, 2017 at 11:19 AM, Ryan Dewell wrote: > > OK, on connected I could send say the 10 ?events? which occurred since > > ?lastEventId?. > > > > Once the connection has been established/connected, where do I send the next > > N events, that maybe occur minutes after the initial ?connected?. > > > > In my mind I thought this all occurred inside ?connected?. Meaning > > connected would wait until some new events were available, send those, ad > > infinitum. > > > > Thanks, > > > > Ryan > > > > > > On May 1, 2017, 6:20 PM -0600, Stuart Douglas , wrote: > > > > When you send you are blocking the IO thread, so the events don't > > actually get put on the wire till the IO thread returns. > > > > Stuart > > > > On Tue, May 2, 2017 at 7:54 AM, Ryan Dewell wrote: > > > > Playing around at the moment, and missing something about the threading > > situation as it pertains to sending events. > > > > In my ServerSentEventConnectionCallback: > > > > public void connected(ServerSentEventConnection connection, String > > lastEventId) { > > try { > > for (int i = 0; i<10; i++){ > > connection.send("i="+i); > > Thread.sleep(1000); > > } > > } catch (Exception e) { > > throw new RuntimeException(e); > > } > > } > > > > Sending events, with one second between each. > > > > I?d expect the time between events to be reflected in the browser / client. > > However what instead happens is all 10 events arrive within the same > > millisecond (nanoseconds apart according to Chrome console time). > > > > So I?m missing something here. But I don?t see anything obvious. For > > example, there is nothing like a ?flush()? on ServerSentEventConnection that > > could be used after each event is sent. > > > > Ideas/guidance? > > > > Thanks! > > > > Ryan > > > > > > _______________________________________________ > > undertow-dev mailing list > > undertow-dev at lists.jboss.org > > https://lists.jboss.org/mailman/listinfo/undertow-dev -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170502/e2e2c413/attachment-0001.html From sdouglas at redhat.com Thu May 11 23:07:11 2017 From: sdouglas at redhat.com (Stuart Douglas) Date: Fri, 12 May 2017 13:07:11 +1000 Subject: [undertow-dev] Suggested change in undertow load balancer proxy client In-Reply-To: References: Message-ID: You already can add hosts on the fly, using the io.undertow.server.handlers.proxy.LoadBalancingProxyClient#addHost(java.net.URI, java.lang.String, org.xnio.ssl.XnioSsl) method. Stuart On Wed, Apr 19, 2017 at 4:41 PM, anurag singhal wrote: > Hi Team, > > > Kindly find the suggested change. Instead of array used list for hosts. This > gives flexibility to add hosts on the fly. > > With Regards > Anurag Singhal From peter.royal at pobox.com Fri May 12 09:46:55 2017 From: peter.royal at pobox.com (peter royal) Date: Fri, 12 May 2017 08:46:55 -0500 Subject: [undertow-dev] supplying back pressure when reading from web sockets Message-ID: <1494596815.2040630.974501664.6977049A@webmail.messagingengine.com> i'm extending io.undertow.websockets.core.AbstractReceiveListener to process incoming websocket messages if i wanted to implement back pressure to senders, is it sufficient to toggle WebSocketChannel#suspendReceives and WebSocketChannel#resumeReceives ? -pete -- (peter.royal|osi)@pobox.com - http://fotap.org/~osi From sdouglas at redhat.com Fri May 12 17:06:59 2017 From: sdouglas at redhat.com (Stuart Douglas) Date: Sat, 13 May 2017 07:06:59 +1000 Subject: [undertow-dev] supplying back pressure when reading from web sockets In-Reply-To: <1494596815.2040630.974501664.6977049A@webmail.messagingengine.com> References: <1494596815.2040630.974501664.6977049A@webmail.messagingengine.com> Message-ID: Yes Stuart On Fri, May 12, 2017 at 11:46 PM, peter royal wrote: > i'm extending io.undertow.websockets.core.AbstractReceiveListener to > process incoming websocket messages > > if i wanted to implement back pressure to senders, is it sufficient to > toggle WebSocketChannel#suspendReceives and > WebSocketChannel#resumeReceives ? > > -pete > > -- > (peter.royal|osi)@pobox.com - http://fotap.org/~osi > _______________________________________________ > undertow-dev mailing list > undertow-dev at lists.jboss.org > https://lists.jboss.org/mailman/listinfo/undertow-dev From sdouglas at redhat.com Sun May 14 19:10:22 2017 From: sdouglas at redhat.com (Stuart Douglas) Date: Mon, 15 May 2017 09:10:22 +1000 Subject: [undertow-dev] Suggested change in undertow load balancer proxy client In-Reply-To: References: Message-ID: The overhead is minimal, it only happens when adding or removing hosts, even if you have thousands on backend nodes that are changing all the time it is incredibly unlikely there will ever be a measurable difference (also this only makes a real difference for additions, removals are still O(n), so if you are using a proxy with thousands of backend nodes that are added and removed multiple times per second a List is not the ideal structure anyway). The real issue though is that your approach is not thread safe, so adding or removing a host could cause incoming requests to fail with a ConcurrentModificationException if the HostSelector attempts to iterate the host. The solution to this would be to use a thread safe list, which will either incur the same copy cost (with CopyOnWriteArrayList) or add runtime overhead (if some kind of synchronized List is used) that has the potential to significantly degrade the performance of the proxy. Stuart On Fri, May 12, 2017 at 8:28 PM, anurag singhal wrote: > Hi Stuart, > > Thanks for responding. > > Yes I agree there are methods available for adding host. My suggestion was > regarding using list as it will remove the overhead of array copy and > related operations in both add and remove host. > > With Regards > Anurag Singhal > > > On 12 May 2017 8:37 a.m., "Stuart Douglas" wrote: > > You already can add hosts on the fly, using the > io.undertow.server.handlers.proxy.LoadBalancingProxyClient#addHost(java.net.URI, > java.lang.String, org.xnio.ssl.XnioSsl) method. > > Stuart > > On Wed, Apr 19, 2017 at 4:41 PM, anurag singhal > wrote: >> Hi Team, >> >> >> Kindly find the suggested change. Instead of array used list for hosts. >> This >> gives flexibility to add hosts on the fly. >> >> With Regards >> Anurag Singhal > > From eldadru at gmail.com Sat May 20 16:01:54 2017 From: eldadru at gmail.com (Eldad Rudich) Date: Sat, 20 May 2017 23:01:54 +0300 Subject: [undertow-dev] Reverse proxy Websocket connections Message-ID: Hi, I have a custom reverse proxy that based on Undertow, my server uses undertow's handlers to receive HTTP request, convert them to my custom protocol and send them to another component in my system that talks to the actual web server and return the responses. I would like to also support WebSocket requests, is it possible to support WebSockets handlers with the same prefix path of the HTTP handler? ( or use the same handler for both regular HTTP request and WebSockets connection) Best, Eldad -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170520/d2d00d6b/attachment.html From sdouglas at redhat.com Sun May 21 17:41:42 2017 From: sdouglas at redhat.com (Stuart Douglas) Date: Mon, 22 May 2017 07:41:42 +1000 Subject: [undertow-dev] Reverse proxy Websocket connections In-Reply-To: References: Message-ID: On Sun, May 21, 2017 at 6:01 AM, Eldad Rudich wrote: > Hi, > > I have a custom reverse proxy that based on Undertow, my server uses > undertow's handlers to receive HTTP request, convert them to my custom > protocol and send them to another component in my system that talks to the > actual web server and return the responses. > > > I would like to also support WebSocket requests, is it possible to support > WebSockets handlers with the same prefix path of the HTTP handler? ( or use > the same handler for both regular HTTP request and WebSockets connection) You can. You ned to look for a 101 (switching protocols) response, check the headers to determine that it is a web socket upgrade, and then figure out how your custom protocol is going to handle it. Stuart > > Best, > Eldad > > > _______________________________________________ > undertow-dev mailing list > undertow-dev at lists.jboss.org > https://lists.jboss.org/mailman/listinfo/undertow-dev From eldadru at gmail.com Mon May 22 02:20:53 2017 From: eldadru at gmail.com (Eldad Rudich) Date: Mon, 22 May 2017 09:20:53 +0300 Subject: [undertow-dev] Reverse proxy Websocket connections In-Reply-To: References: Message-ID: Thanks, Is https://github.com/undertow-io/undertow/blob/855b743cf95705f064dad3aee432279b3494f445/core/src/main/java/io/undertow/server/handlers/proxy/ProxyHandler.java#L678 an example to the technique you offered? Eldad On Mon, May 22, 2017 at 12:41 AM, Stuart Douglas wrote: > On Sun, May 21, 2017 at 6:01 AM, Eldad Rudich wrote: > > Hi, > > > > I have a custom reverse proxy that based on Undertow, my server uses > > undertow's handlers to receive HTTP request, convert them to my custom > > protocol and send them to another component in my system that talks to > the > > actual web server and return the responses. > > > > > > I would like to also support WebSocket requests, is it possible to > support > > WebSockets handlers with the same prefix path of the HTTP handler? ( or > use > > the same handler for both regular HTTP request and WebSockets connection) > > > You can. You ned to look for a 101 (switching protocols) response, > check the headers to determine that it is a web socket upgrade, and > then figure out how your custom protocol is going to handle it. > > Stuart > > > > > Best, > > Eldad > > > > > > _______________________________________________ > > undertow-dev mailing list > > undertow-dev at lists.jboss.org > > https://lists.jboss.org/mailman/listinfo/undertow-dev > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170522/469804eb/attachment.html From kid at bitkid.com Tue May 23 06:14:46 2017 From: kid at bitkid.com (Sascha Sadat-Guscheh) Date: Tue, 23 May 2017 12:14:46 +0200 Subject: [undertow-dev] leaking file descriptors when using classpath resource Message-ID: <0607FC0C-F478-4543-AC0A-223791FD2512@bitkid.com> Hello! We pack our undertow application into a fatJar and we want to serve some resources out of that jar file. Currently we initialise our handler like this: Handlers.resource(ClassPathResourceManager(ClassLoader.getSystemClassLoader(), "public/?)) It works, but for each call we do it opens a file descriptor to the jar and it never closes it so we end up pretty soon with a TooManyOpenFiles exception. 2017-05-22 14:20:24,542 Exception accepting request, closing server channel TCP server (NIO) <33364501> java.io.IOException: Too many open files at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) at org.xnio.nio.QueuedNioTcpServer.handleReady(QueuedNioTcpServer.java:477) at org.xnio.nio.QueuedNioTcpServerHandle.handleReady(QueuedNioTcpServerHandle.java:38) at org.xnio.nio.WorkerThread.run(WorkerThread.java:567) Are we using it wrong? Best, Sascha From sdouglas at redhat.com Tue May 23 18:51:30 2017 From: sdouglas at redhat.com (Stuart Douglas) Date: Wed, 24 May 2017 08:51:30 +1000 Subject: [undertow-dev] leaking file descriptors when using classpath resource In-Reply-To: <0607FC0C-F478-4543-AC0A-223791FD2512@bitkid.com> References: <0607FC0C-F478-4543-AC0A-223791FD2512@bitkid.com> Message-ID: Looks like a bug: https://issues.jboss.org/browse/UNDERTOW-1081 This will be fixed in 1.4.16.Final Stuart On Tue, May 23, 2017 at 8:14 PM, Sascha Sadat-Guscheh wrote: > Hello! > > We pack our undertow application into a fatJar and we want to serve some resources out of that jar file. Currently we initialise our handler like this: > > Handlers.resource(ClassPathResourceManager(ClassLoader.getSystemClassLoader(), "public/?)) > > It works, but for each call we do it opens a file descriptor to the jar and it never closes it so we end up pretty soon with a TooManyOpenFiles exception. > > 2017-05-22 14:20:24,542 Exception accepting request, closing server channel TCP server (NIO) <33364501> java.io.IOException: Too many open files > at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) > at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) > at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) > at org.xnio.nio.QueuedNioTcpServer.handleReady(QueuedNioTcpServer.java:477) > at org.xnio.nio.QueuedNioTcpServerHandle.handleReady(QueuedNioTcpServerHandle.java:38) > at org.xnio.nio.WorkerThread.run(WorkerThread.java:567) > > Are we using it wrong? > > Best, Sascha > _______________________________________________ > undertow-dev mailing list > undertow-dev at lists.jboss.org > https://lists.jboss.org/mailman/listinfo/undertow-dev From jonh.wendell at redhat.com Tue May 30 08:56:18 2017 From: jonh.wendell at redhat.com (Jonh Wendell) Date: Tue, 30 May 2017 09:56:18 -0300 Subject: [undertow-dev] Skipping tests Message-ID: Hi folks. Do I have to prepare the env to run the tests within UT source code? I'm doing: mvn test -Pproxy -Dtest=LoadBalancingProxyHTTP2TestCase -DfailIfNoTests=false But it's skipping all the tests in that class. Even if I don't specify the class (drop -Dtest=...) those tests are still being skipped. I also tried without -Pproxy as well, same result. I noticed that in CI those tests run fine, so, I'm suspecting I'm doing something wrong (or missing some step) in my env. Any help is appreciated. Thanks! -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170530/8478b02d/attachment.html From rhatlapa at redhat.com Tue May 30 11:23:25 2017 From: rhatlapa at redhat.com (Radim Hatlapatka) Date: Tue, 30 May 2017 17:23:25 +0200 Subject: [undertow-dev] Skipping tests In-Reply-To: References: Message-ID: Hi Jonh, it works for me for both cases when executed with -Pproxy and also without it. The only thing which comes to my mind is version of surefire plugin used as it is not explicitly defined in the pom.xml file. In my case 2.20 was used. Cheers. Radim On 05/30/2017 02:56 PM, Jonh Wendell wrote: > Hi folks. > > Do I have to prepare the env to run the tests within UT source code? > I'm doing: > > mvn test -Pproxy -Dtest=LoadBalancingProxyHTTP2TestCase > -DfailIfNoTests=false > > But it's skipping all the tests in that class. Even if I don't specify > the class (drop -Dtest=...) those tests are still being skipped. I > also tried without -Pproxy as well, same result. > > I noticed that in CI those tests run fine, so, I'm suspecting I'm > doing something wrong (or missing some step) in my env. > > Any help is appreciated. > > Thanks! > > > _______________________________________________ > undertow-dev mailing list > undertow-dev at lists.jboss.org > https://lists.jboss.org/mailman/listinfo/undertow-dev -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170530/ecb8b2f7/attachment.html From jonh.wendell at redhat.com Tue May 30 12:25:26 2017 From: jonh.wendell at redhat.com (Jonh Wendell) Date: Tue, 30 May 2017 13:25:26 -0300 Subject: [undertow-dev] Skipping tests In-Reply-To: References: Message-ID: Thanks. Found out the reason: https://github.com/undertow-io/undertow/pull/514 On Tue, May 30, 2017 at 12:23 PM, Radim Hatlapatka wrote: > Hi Jonh, > > it works for me for both cases when executed with -Pproxy and also without > it. The only thing which comes to my mind is version of surefire plugin > used as it is not explicitly defined in the pom.xml file. In my case 2.20 > was used. > > Cheers. > > Radim > > On 05/30/2017 02:56 PM, Jonh Wendell wrote: > > Hi folks. > > Do I have to prepare the env to run the tests within UT source code? > I'm doing: > > mvn test -Pproxy -Dtest=LoadBalancingProxyHTTP2TestCase > -DfailIfNoTests=false > > But it's skipping all the tests in that class. Even if I don't specify the > class (drop -Dtest=...) those tests are still being skipped. I also tried > without -Pproxy as well, same result. > > I noticed that in CI those tests run fine, so, I'm suspecting I'm doing > something wrong (or missing some step) in my env. > > Any help is appreciated. > > Thanks! > > > _______________________________________________ > undertow-dev mailing listundertow-dev at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/undertow-dev > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170530/5b63f9c7/attachment.html