Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jetty-users] Migrating custom Connector from 8.1 to 9.4

Hi,

On Fri, Mar 23, 2018 at 7:56 PM, Anthony Dahanne
<anthony.dahanne@xxxxxxxxx> wrote:
> Hello again Joakim,
> with some help, I could move forward , yay !
> So why I ended up doing is make my TerracottaConnector extend LocalConnector
> and then read from the socket a String (basically the HTTP request forwarded
> by the Terracotta Server), and pass it to the LocalConnector getResponse().
> Then, I retrieve the response, write it to the socket and flush it.
> In code terms, it's more or less :
>
> public class TerracottaConnector extends LocalConnector {
>
>   public void handleSocketFromDSO(Socket s, byte[] data) throws IOException
> {
>
>
>     PushbackInputStream pis = new PushbackInputStream(s.getInputStream(),
> data.length);
>     pis.unread(data);
>     InputStreamReader inputStreamReader = new InputStreamReader(pis);
>     BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
>     String readLineFromBuffer = bufferedReader.readLine();
>     StringWriter writer = new StringWriter();
>     do {
>       writer.write(readLineFromBuffer);
>       writer.write("\r\n");
>       readLineFromBuffer = bufferedReader.readLine();
>     }
>     while (!readLineFromBuffer.equals(""));
>     writer.write("\r\n");
>
>     String theString = writer.toString();
>
>     try {
>       String response = this.getResponse(theString);
>       s.getOutputStream().write(response.getBytes("UTF-8"));
>     } catch (Exception e) {
>       e.printStackTrace();
>     } finally {
>       s.getOutputStream().flush();
>     }
>
>   }
> }
>
>
> It's not perfect, since I had to change some servlets (although we don't
> have many anyway) to specifically close the connection, and prevent jetty to
> chunk the output :
>
> OutputStream out = response.getOutputStream();
> int bytesCopied = IOUtils.copy(documentToSend.newInputStream(), out);
> response.setHeader("Connection", "close");
> response.setContentLength(bytesCopied);
> response.flushBuffer();
>
>
>
> But I think that's a start.
>
> To answer your previous questions :
>
>> How do you handle the HTTP persistence layer?
> I don't think we do
>
>> Do you have any plans to support HTTP/2?
> no
>
>> Do you expect Jetty to handle the HTTP conversation entirely on from the
>> active connection?
>> (parsing the request headers + body contents, generating the response
>> headers + body contents)?
> Yes, this is what we use Jetty for : the Terracotta Server found out the
> request is HTTP, it passes the socket to Jetty and expects Jetty to finish
> dealing with it.
>
>> Is it possible to have a non-HTTP request after the active HTTP request on
>> the same connection?
> I don't think so, it's OK if a new connection is opened after the HTTP
> exchange.
>
> Thanks again for all your help.
> I have other parts of the system to migrate, but this one was clearly the
> most perilous...
> I also need to figure out if LocalConnector is the best candidate.

I think there is a better way to do it.

Jetty architecture has pluggable ConnectionFactories.
All the protocols that Jetty can handle, HTTP/1.1, HTTP/2, PROXY, TLS,
etc. are implemented by implementing a specific ConnectionFactory and
not by subclassing ServerConnector.
The ConnectionFactories may also be called in sequence, so for example
SslConnectionFactory handles the TLS details, but then it forwards to
_any_ other protocol, being it HTTP/1.1, or HTTP/2, or your Terracotta
protocol.

You have not given a lot of details, but if the Terracotta protocol
"wraps" HTTP/1.1, then you can write a ConnectionFactory that handles
the Terracotta protocol details, which then forwards to the existing
HttpConnectionFactory that handles HTTP/1.1.

In order to help you out, we need to know how the Terracotta protocol
works in details and what exactly you need to do, so that we can
suggest what is the best solution.

-- 
Simone Bordet
----
http://cometd.org
http://webtide.com
Developer advice, training, services and support
from the Jetty & CometD experts.


Back to the top