I suppose you're right, it will short circuit anyway. So yah, I can move
them up.

Brian

On Friday, January 31, 2014, Leif Hedstrom <zw...@apache.org> wrote:

> Thanks!
>
>
> I need to check the patch again , but not sure I understand why it be more
> expensive to move up the method and version checks (they would still be
> after the presence checks). It also makes more logical sense to put all
> prerequisites in one statement.
>
> Cheers,
>
> -- Leif
>
> > On Jan 31, 2014, at 5:48 PM, Brian Geffon <bri...@apache.org<javascript:;>>
> wrote:
> >
> > See responses below.
> >
> >> On Fri, Jan 31, 2014 at 4:05 PM, Leif Hedstrom 
> >> <zw...@apache.org<javascript:;>>
> wrote:
> >>
> >>
> >>> On Jan 29, 2014, at 6:22 PM, Brian Geffon 
> >>> <bri...@apache.org<javascript:;>>
> wrote:
> >>>
> >>> Hi All,
> >>> I've created a patch adding WebSocket support to ATS, I would
> appreciate
> >>> community feedback. This is being tracked in TS-2541, the patch is
> >> attached
> >>> to the jira ticket https://issues.apache.org/jira/browse/TS-2541
> >>
> >>
> >>
> >> Couple of nitpicks / observations:
> >>
> >> 1. You are adding some new connection metric. Do these count against
> >> HTTP(S) connections as well? I'm assuming not, in which case, there
> might
> >> be some aggregation metrics (stats.config.xml) that should be updated
> >> accordingly.
> >
> > Yes, since the connection is established as an HTTP connection it will be
> > counted as an active http connection until the websocket connection is
> > destroyed. The new metric allows you to drill down on just websocket
> > connections.
> >
> >
> >>
> >> 2. A few more comments here and there (in HttpTransact.cc) might be
> nice,
> >> specially around the KA conditions ... ;) But it's fairly readable
> already.
> >
> > I can try to add a few more comments to make the flow clearer.
> >
> >
> >>
> >> 3. In HttpTransact::handle_upgrade_request() why not check for the GET
> >> method and HTTP/1.1 at the top ("quickest way" ...) ?
> >
> > The idea here is that we can determine that a connection is definitely
> not
> > an upgrade if it's missing an upgrade header or a connection header,
> since
> > both of those can be checked with just a bitwise and because of the
> > presence bits that's why I just check them first. Checking the method is
> > more expensive, so I defer it until I detect the upgrade header.
> >
> >
> >>
> >> 4. In this code:
> >>
> >>  } else { /* websocket connection */
> >>    s->current.server->keep_alive = HTTP_NO_KEEPALIVE;
> >>    s->client_info.keep_alive = HTTP_NO_KEEPALIVE;
> >>    heads->value_set(MIME_FIELD_CONNECTION, MIME_LEN_CONNECTION,
> >> MIME_FIELD_UPGRADE, MIME_LEN_UPGRADE);
> >>
> >>    if (s->is_websocket) {
> >>      heads->value_set(MIME_FIELD_UPGRADE, MIME_LEN_UPGRADE, "websocket",
> >> 9);
> >>    }
> >>
> >>
> >>
> >> It seems it already thinks it is in "web socket" mode (the } else {
> ...),
> >> but in that else clause, it's checking for s->is_websocket(). This seems
> >> odd, if anything, should it not be e.g.
> >>
> >> } else if (s->is_websocket) {
> >>    s->current.server->keep_alive = HTTP_NO_KEEPALIVE;
> >>    s->client_info.keep_alive = HTTP_NO_KEEPALIVE;
> >>    heads->value_set(MIME_FIELD_CONNECTION, MIME_LEN_CONNECTION,
> >> MIME_FIELD_UPGRADE, MIME_LEN_UPGRADE);
> >>    heads->value_set(MIME_FIELD_UPGRADE, MIME_LEN_UPGRADE, "websocket",
> 9);
> >> } else {
> >>        // Some unhandled upgrade but not web socket path ?
> >> }
> >>
> >> ? But maybe it's the comment that's wrong, and the } else { is
> generically
> >> for all upgrades, and within it, you have a small case for web socket?
> >> Either way, it reads confusingly.
> >
> > I was trying to come up with a general pattern that could be easily
> > extended if other protocols that require upgrade support are added. The
> > idea is that all upgrade requests will need to set the Connection:
> upgrade
> > header, and only websocket connections will get the Upgrade: websocket
> > header, it's more for readability for anyone adding more upgrade support
> > later. It's the comment that makes it confusing, it should read } else {
> /*
> > upgrade case */, and then the inner if will check which protocol is being
> > upgrade to.
> >
> >
> >>
> >> 5. This is mostly a question: Is there, or will there be, something such
> >> that a plugin can "intercept" in the WebSocket tunnels? For example, I
> can
> >> imagine someone wanting to handle certain (but not all!) WebSocket
> messages
> >> in a plugin, e.g. fetching something out of cache. Saying "Future
> >> enhancement" is good enough for me :).
> > I believe transformations should already work out of the gate (although I
> > haven't tried it). You should be able to create a request transformation
> > and a response transformation to handle each side of the connection. I'm
> > curious, so I'll try it.
> >
> > Also, to address your throttling question, the normal request flow isn't
> > modified until _after_ the response comes back from the origin, so all
> > normal things such as throttling should just work without issues,
> because I
> > took that approach that's why the patch is so small.
> >
> >
> >>
> >> Thanks! Hugely +1 on getting this in, it seems it's safe for non-WS
> stuff,
> >> and the code is surprisingly small (and clean).
> >>
> >> -- Leif
> >>
> >>
>

Reply via email to