2006-10-29 17:11:44 +08:00
|
|
|
HTTP Pipelining with libcurl
|
|
|
|
============================
|
2006-06-25 05:51:28 +08:00
|
|
|
|
|
|
|
Background
|
|
|
|
|
|
|
|
Since pipelining implies that one or more requests are sent to a server before
|
2006-10-29 17:11:44 +08:00
|
|
|
the previous response(s) have been received, we only support it for multi
|
|
|
|
interface use.
|
2006-06-25 05:51:28 +08:00
|
|
|
|
|
|
|
Considerations
|
|
|
|
|
|
|
|
When using the multi interface, you create one easy handle for each transfer.
|
|
|
|
Bascially any number of handles can be created, added and used with the multi
|
|
|
|
interface - simultaneously. It is an interface designed to allow many
|
2006-10-29 17:11:44 +08:00
|
|
|
simultaneous transfers while still using a single thread. Pipelining does not
|
|
|
|
change any of these details.
|
2006-06-25 05:51:28 +08:00
|
|
|
|
2006-07-07 15:22:05 +08:00
|
|
|
API
|
2006-06-25 05:51:28 +08:00
|
|
|
|
2006-10-29 17:11:44 +08:00
|
|
|
We've added a new option to curl_multi_setopt() called CURLMOPT_PIPELINING
|
|
|
|
that enables "attempted pipelining" and then all easy handles used on that
|
|
|
|
handle will attempt to use an existing pipeline.
|
2006-06-25 05:51:28 +08:00
|
|
|
|
2006-10-29 17:11:44 +08:00
|
|
|
Details
|
2006-06-25 05:51:28 +08:00
|
|
|
|
2006-07-07 15:22:05 +08:00
|
|
|
- A pipeline is only created if a previous connection exists to the same IP
|
|
|
|
address that the new request is being made to use.
|
|
|
|
|
|
|
|
- Pipelines are only supported for HTTP(S) as no other currently supported
|
|
|
|
protocol has features resemembling this, but we still name this feature
|
|
|
|
plain 'pipelining' to possibly one day support it for other protocols as
|
|
|
|
well.
|
|
|
|
|
2006-07-08 04:45:56 +08:00
|
|
|
- HTTP Pipelining is for GET and HEAD requests only.
|
|
|
|
|
2006-07-07 15:22:05 +08:00
|
|
|
- When a pipeline is in use, we must take precautions so that when used easy
|
|
|
|
handles (i.e those who still wait for a response) are removed from the multi
|
|
|
|
handle, we must deal with the outstanding response nicely.
|
2006-06-25 05:51:28 +08:00
|
|
|
|
2006-07-07 15:22:05 +08:00
|
|
|
- Explicitly asking for pipelining handle X and handle Y won't be supported.
|
|
|
|
It isn't easy for an app to do this association. The lib should probably
|
|
|
|
still resolve the second one properly to make sure that they actually _can_
|
|
|
|
be considered for pipelining. Also, asking for explicit pipelining on handle
|
|
|
|
X may be tricky when handle X get a closed connection.
|
|
|
|
|
|
|
|
- We need options to control max pipeline length, and probably how to behave
|
|
|
|
if we reach that limit. As was discussed on the list, it can probably be
|
|
|
|
made very complicated, so perhaps we can think of a way to pass all
|
|
|
|
variables involved to a callback and let the application decide how to act
|
|
|
|
in specific situations. Either way, these fancy options are only interesting
|
|
|
|
to work on when everything is working and we have working apps to test with.
|