modifying the request or response during proxy is also supported out of the box by the ... org.eclipse.jetty.proxy.AsyncMiddleManServlet
https://github.com/eclipse/jetty.project/blob/jetty-9.4.x/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncMiddleManServlet.java Joakim Erdfelt / [email protected] On Tue, Sep 26, 2017 at 5:03 PM, Steven Schlansker < [email protected]> wrote: > > > On Sep 26, 2017, at 4:51 PM, Joakim Erdfelt <[email protected]> wrote: > > > > This is what our org.eclipse.jetty.proxy.AsyncProxyServlet already does. > > > > https://github.com/eclipse/jetty.project/blob/jetty-9.4. > x/jetty-proxy/src/main/java/org/eclipse/jetty/proxy/AsyncProxyServlet.java > > > > Why write your own? > > Because I did not know this existed :) > > Also, I do nontrivial rewriting of the request (this is not at all a > transparent proxy, > it is quite invasive) so I will probably not be able to use the code as is. > > But it probably answers my questions and just needs adaptation, so thank > you very much > for the pointer. > > (This is a lot of complex code! Asynchronous programming is hard...) > > > > > > > Joakim Erdfelt / [email protected] > > > > On Tue, Sep 26, 2017 at 4:47 PM, Steven Schlansker < > [email protected]> wrote: > > Hi jetty-users, > > > > Still working on my http proxy :) > > Now I'm trying to make sure I've got the content proxying working > correctly > > using both asynchronous servlet as well as NIO nonblocking writing. > > > > Because both the server and client are pushing notifications at me, I > believe > > I need to implement some sort of transfer queue. I was hoping that I'd > end up > > in a push-pull situation but ServletOutputStream calls you via a > WriteListener > > and Jetty-Client calls you via a Response.ContentListener. > > > > Unfortunately, this leaves me in a position where I don't know how to > get flow > > control working. The client pushes data at me and I don't have a way to > push back. > > > > My current pesudocoded approach: > > > > Deque<Runnable> writes; > > volatile boolean complete = false; > > > > asyncCtx = httpResponse.startAsync(); > > out = (HttpOutput) httpResponse.getOutputStream(); > > > > writeListener = new WriteListener() { > > synchronized void onWritePossible() { // avoid re-entrance with > 'synchronized' > > while(out.isReady()) { > > pending = writes.removeFirst(); > > if (pending != null) { > > pending.run(); > > } else if (complete && writes.isEmpty()) { > > asyncCtx.complete(); > > } else { > > return; > > } > > } > > } > > }; > > > > out.setWriteListener(writeListener); > > > > proxyClientRequest.send(new Response.ContentListener() { > > void onContent(ByteBuffer buf, Callback complete) { > > writes.push(() -> { > > out.write(buf); > > complete.succeeded(); > > }; > > writeListener.onWritePossible(); // See if we can write it > immediately > > } > > > > void onComplete() { > > complete = true; > > writeListener.onWritePossible(); > > } > > }); > > > > This has the nice property where I don't copy buffers, just keep them in > a queue > > of pending writes -- but I worry that in the case of a slow reader, > Jetty Client > > will continue onContent-pushing buffers at me until I run out of memory. > > > > I could instead use the OutputStreamContentProvider and just read from > it in the > > WriteListener, which might fix the flow control, but that seems likely > to involve > > a number of byte[] copies that I was hoping to avoid. > > > > What's the right approach to wire up Jetty server to Jetty client with > full NIO + Async > > content proxying, without introducing an intermediate transfer buffer > that might grow > > without bound? Am I on the right path or am I missing something? > Thanks for any guidance! > > > > > > _______________________________________________ > > jetty-users mailing list > > [email protected] > > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > > https://dev.eclipse.org/mailman/listinfo/jetty-users > > > > _______________________________________________ > > jetty-users mailing list > > [email protected] > > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > > https://dev.eclipse.org/mailman/listinfo/jetty-users > > > _______________________________________________ > jetty-users mailing list > [email protected] > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > https://dev.eclipse.org/mailman/listinfo/jetty-users >
_______________________________________________ jetty-users mailing list [email protected] To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://dev.eclipse.org/mailman/listinfo/jetty-users
