http1.1 Keep-Alive without pipelining - http

I'm implementing a server that is sending to the client a http keep-alive request but I would like that the client does not make pipelining requests. Is there any flag to tell client to not do multiple pipeline requests?
The keep-alive request seams to work but I don't want pipeline requests.
I would like a sequential request.

No, there is no such flag.
FWIW, with pipelining the requests would still be sequential, you just can get more while still sending a response.

Related

Is there only a single HTTP Request associated with a HTTP Connection?

The source of confusion is this answer.
To be honest, I know what is Http Request, Http Session, but I have never heard this - Http Connection. So it boils down to this only. What exactly is the difference b/w Http Request & Http Connection?

How to prevent keep-alive in a HTTP 1.1 request?

I'm implementing a simple HTTP client.
Which header should I add to a HTTP 1.1 request so it won't keep alive?
You need to add header: Connection: close. Currently all connections are permanent and client must explicitly claim that it wants to close the connection.

Doesnt http Keep-Alive solve the issue that long-polling solves?

What exactly is the difference between long polling and http Keep-Alive??
Doesnt http Keep-Alive solve the issue that long-polling solves??
No. They're almost completely unrelated.
HTTP keepalive allows the client to keep a connection open, but idle, to allow it to make future requests a little bit more efficiently. The server cannot send data to a client over a keepalive connection, as no request is active.
Long polling is a mechanism where the server keeps a request (and thus a connection) active, but not sending data, to allow the server to send data to the client when it becomes available -- for instance, when an event occurs.

HTTP Keep-Alive Header

HTTP/1.1 servers default to the Keep-Alive setting of the Connection header. Why
then do most browsers include Connection: Keep-Alive in their requests even when
they know that the target server supports HTTP/1.1?
Browsers usually don't keep a cache of metadata about the servers they've contacted in the past, and even if they did, they'd have to account for server farms that have different versions of HTTP, intermediaries (especially "transparent" proxies), and so forth.
As such, they've made a judgement call that it's just easier to always send Connection: keep-alive, at least on the first request in a connection.
The question doesn't make sense. The browser doesn't know what the server supports until after it has submitted the request and obtained a response.

Can an persistent HTTP client send more than one request at a time?

I am writing a HTTP proxy server and I noticed that many clients use the "Connection: Keep-Alive" header to keep a persistent connection. Is it possible that the client sends another HTTP request before the server processes the first?
For example, the client sends "GET / HTTP/1.1" but before the server has a chance to respond, the client sends "GET /favicon.ico HTTP/1.1". Is that possible? Or will the client pause for the response before sending the second request?
Also, when using a persistent connection, is it safe to assume all requests through that connection will have the same "Host: " header?
"Also, when using a persistent connection, is it safe to assume all requests through that connection will have the same "Host: " header?"
I don't think so, see HTTPbis P1, Section 2.2:
Recipients MUST consider every message in a connection in isolation; because HTTP is a stateless protocol, it cannot be assumed that two requests on the same connection are from the same client or share any other common attributes. In particular, intermediaries might mix requests from different clients into a single server connection. Note that some existing HTTP extensions (e.g., [RFC4559]) violate this requirement, thereby potentially causing interoperability and security problems.
Yes, it is possible for the client to pipeline requests. (See http://en.wikipedia.org/wiki/HTTP_pipelining).
Turning your last question around... it would not be safe for a client to assume that requests to multiple hosts would be served by a single pipeline. There may be no specs that directly address your question on the Host: header, but it's a safe bet they'll be the same.
Regarding the first question:
Is it possible that the client sends another HTTP request before the server processes the first?
I believe that yes, it can be possible (perhaps I am wrong, I remembered having read that a couple of years ago; the definitive answer is in the HTTP protocol specifications). But I don't understand why you are asking. Also, the client can open several TCP connections at once to the same HTTP server. And of course you have many simultaneous clients.
About the second question
Also, when using a persistent connection, is it safe to assume all requests through that connection will have the same "Host: " header?
I believe it is usually the case, but I won't assume that to be certain. I could imagine that some clever HTTP clients, recognizing that two URL with different Host: headers share the same IP, could re-use the same connection.
But I don't understand why you are asking. Persistent HTTP connections have been invented to minimize the TCP connections which are costly, and the two questions you are asking are an extreme point on that. Perhaps few HTTP clients are doing what you describe today.
And you should be strict on what you send (w.r.t. standard conformance), but flexible on what you accept receiving.

Resources