| Index: net/http/http_pipelined_connection_impl.h
|
| diff --git a/net/http/http_pipelined_connection_impl.h b/net/http/http_pipelined_connection_impl.h
|
| deleted file mode 100644
|
| index d558e47eb0bb16233803f1e6c85728f8fabcfc90..0000000000000000000000000000000000000000
|
| --- a/net/http/http_pipelined_connection_impl.h
|
| +++ /dev/null
|
| @@ -1,330 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef NET_HTTP_HTTP_PIPELINED_CONNECTION_IMPL_H_
|
| -#define NET_HTTP_HTTP_PIPELINED_CONNECTION_IMPL_H_
|
| -
|
| -#include <map>
|
| -#include <queue>
|
| -#include <string>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/location.h"
|
| -#include "base/memory/linked_ptr.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "net/base/completion_callback.h"
|
| -#include "net/base/net_export.h"
|
| -#include "net/base/net_log.h"
|
| -#include "net/http/http_pipelined_connection.h"
|
| -#include "net/http/http_request_info.h"
|
| -#include "net/http/http_stream_parser.h"
|
| -#include "net/proxy/proxy_info.h"
|
| -#include "net/ssl/ssl_config_service.h"
|
| -
|
| -namespace net {
|
| -
|
| -class ClientSocketHandle;
|
| -class GrowableIOBuffer;
|
| -class HostPortPair;
|
| -class HttpNetworkSession;
|
| -class HttpRequestHeaders;
|
| -class HttpResponseInfo;
|
| -class IOBuffer;
|
| -struct LoadTimingInfo;
|
| -class SSLCertRequestInfo;
|
| -class SSLInfo;
|
| -
|
| -// This class manages all of the state for a single pipelined connection. It
|
| -// tracks the order that HTTP requests are sent and enforces that the
|
| -// subsequent reads occur in the appropriate order.
|
| -//
|
| -// If an error occurs related to pipelining, ERR_PIPELINE_EVICTION will be
|
| -// returned to the client. This indicates the client should retry the request
|
| -// without pipelining.
|
| -class NET_EXPORT_PRIVATE HttpPipelinedConnectionImpl
|
| - : public HttpPipelinedConnection {
|
| - public:
|
| - class Factory : public HttpPipelinedConnection::Factory {
|
| - public:
|
| - virtual HttpPipelinedConnection* CreateNewPipeline(
|
| - ClientSocketHandle* connection,
|
| - HttpPipelinedConnection::Delegate* delegate,
|
| - const HostPortPair& origin,
|
| - const SSLConfig& used_ssl_config,
|
| - const ProxyInfo& used_proxy_info,
|
| - const BoundNetLog& net_log,
|
| - bool was_npn_negotiated,
|
| - NextProto protocol_negotiated) OVERRIDE;
|
| - };
|
| -
|
| - HttpPipelinedConnectionImpl(ClientSocketHandle* connection,
|
| - Delegate* delegate,
|
| - const HostPortPair& origin,
|
| - const SSLConfig& used_ssl_config,
|
| - const ProxyInfo& used_proxy_info,
|
| - const BoundNetLog& net_log,
|
| - bool was_npn_negotiated,
|
| - NextProto protocol_negotiated);
|
| - virtual ~HttpPipelinedConnectionImpl();
|
| -
|
| - // HttpPipelinedConnection interface.
|
| -
|
| - // Used by HttpStreamFactoryImpl and friends.
|
| - virtual HttpPipelinedStream* CreateNewStream() OVERRIDE;
|
| -
|
| - // Used by HttpPipelinedHost.
|
| - virtual int depth() const OVERRIDE;
|
| - virtual bool usable() const OVERRIDE;
|
| - virtual bool active() const OVERRIDE;
|
| -
|
| - // Used by HttpStreamFactoryImpl.
|
| - virtual const SSLConfig& used_ssl_config() const OVERRIDE;
|
| - virtual const ProxyInfo& used_proxy_info() const OVERRIDE;
|
| - virtual const BoundNetLog& net_log() const OVERRIDE;
|
| - virtual bool was_npn_negotiated() const OVERRIDE;
|
| - virtual NextProto protocol_negotiated() const OVERRIDE;
|
| -
|
| - // Used by HttpPipelinedStream.
|
| -
|
| - // Notifies this pipeline that a stream is no longer using it.
|
| - void OnStreamDeleted(int pipeline_id);
|
| -
|
| - // Effective implementation of HttpStream. Note that we don't directly
|
| - // implement that interface. Instead, these functions will be called by the
|
| - // pass-through methods in HttpPipelinedStream.
|
| - void InitializeParser(int pipeline_id,
|
| - const HttpRequestInfo* request,
|
| - const BoundNetLog& net_log);
|
| -
|
| - int SendRequest(int pipeline_id,
|
| - const std::string& request_line,
|
| - const HttpRequestHeaders& headers,
|
| - HttpResponseInfo* response,
|
| - const CompletionCallback& callback);
|
| -
|
| - int ReadResponseHeaders(int pipeline_id,
|
| - const CompletionCallback& callback);
|
| -
|
| - int ReadResponseBody(int pipeline_id,
|
| - IOBuffer* buf, int buf_len,
|
| - const CompletionCallback& callback);
|
| -
|
| - void Close(int pipeline_id,
|
| - bool not_reusable);
|
| -
|
| - UploadProgress GetUploadProgress(int pipeline_id) const;
|
| -
|
| - HttpResponseInfo* GetResponseInfo(int pipeline_id);
|
| -
|
| - bool IsResponseBodyComplete(int pipeline_id) const;
|
| -
|
| - bool CanFindEndOfResponse(int pipeline_id) const;
|
| -
|
| - bool IsConnectionReused(int pipeline_id) const;
|
| -
|
| - void SetConnectionReused(int pipeline_id);
|
| -
|
| - int64 GetTotalReceivedBytes(int pipeline_id) const;
|
| -
|
| - bool GetLoadTimingInfo(int pipeline_id,
|
| - LoadTimingInfo* load_timing_info) const;
|
| -
|
| - void GetSSLInfo(int pipeline_id, SSLInfo* ssl_info);
|
| -
|
| - void GetSSLCertRequestInfo(int pipeline_id,
|
| - SSLCertRequestInfo* cert_request_info);
|
| -
|
| - // Attempts to drain the response body for |stream| so that the pipeline may
|
| - // be reused.
|
| - void Drain(HttpPipelinedStream* stream, HttpNetworkSession* session);
|
| -
|
| - private:
|
| - enum StreamState {
|
| - STREAM_CREATED,
|
| - STREAM_BOUND,
|
| - STREAM_SENDING,
|
| - STREAM_SENT,
|
| - STREAM_READ_PENDING,
|
| - STREAM_ACTIVE,
|
| - STREAM_CLOSED,
|
| - STREAM_READ_EVICTED,
|
| - STREAM_UNUSED,
|
| - };
|
| - enum SendRequestState {
|
| - SEND_STATE_START_IMMEDIATELY,
|
| - SEND_STATE_START_NEXT_DEFERRED_REQUEST,
|
| - SEND_STATE_SEND_ACTIVE_REQUEST,
|
| - SEND_STATE_COMPLETE,
|
| - SEND_STATE_EVICT_PENDING_REQUESTS,
|
| - SEND_STATE_NONE,
|
| - };
|
| - enum ReadHeadersState {
|
| - READ_STATE_START_IMMEDIATELY,
|
| - READ_STATE_START_NEXT_DEFERRED_READ,
|
| - READ_STATE_READ_HEADERS,
|
| - READ_STATE_READ_HEADERS_COMPLETE,
|
| - READ_STATE_WAITING_FOR_CLOSE,
|
| - READ_STATE_STREAM_CLOSED,
|
| - READ_STATE_NONE,
|
| - READ_STATE_EVICT_PENDING_READS,
|
| - };
|
| -
|
| - struct PendingSendRequest {
|
| - PendingSendRequest();
|
| - ~PendingSendRequest();
|
| -
|
| - int pipeline_id;
|
| - std::string request_line;
|
| - HttpRequestHeaders headers;
|
| - HttpResponseInfo* response;
|
| - CompletionCallback callback;
|
| - };
|
| -
|
| - struct StreamInfo {
|
| - StreamInfo();
|
| - ~StreamInfo();
|
| -
|
| - linked_ptr<HttpStreamParser> parser;
|
| - CompletionCallback read_headers_callback;
|
| - CompletionCallback pending_user_callback;
|
| - StreamState state;
|
| - NetLog::Source source;
|
| - };
|
| -
|
| - typedef std::map<int, StreamInfo> StreamInfoMap;
|
| -
|
| - // Called after the first request is sent or in a task sometime after the
|
| - // first stream is added to this pipeline. This gives the first request
|
| - // priority to send, but doesn't hold up other requests if it doesn't.
|
| - // When called the first time, notifies the |delegate_| that we can accept new
|
| - // requests.
|
| - void ActivatePipeline();
|
| -
|
| - // Responsible for sending one request at a time and waiting until each
|
| - // comepletes.
|
| - int DoSendRequestLoop(int result);
|
| -
|
| - // Called when an asynchronous Send() completes.
|
| - void OnSendIOCallback(int result);
|
| -
|
| - // Activates the only request in |pending_send_request_queue_|. This should
|
| - // only be called via SendRequest() when the send loop is idle.
|
| - int DoStartRequestImmediately(int result);
|
| -
|
| - // Activates the first request in |pending_send_request_queue_| that hasn't
|
| - // been closed, if any. This is called via DoSendComplete() after a prior
|
| - // request complets.
|
| - int DoStartNextDeferredRequest(int result);
|
| -
|
| - // Sends the active request.
|
| - int DoSendActiveRequest(int result);
|
| -
|
| - // Notifies the user that the send has completed. This may be called directly
|
| - // after SendRequest() for a synchronous request, or it may be called in
|
| - // response to OnSendIOCallback for an asynchronous request.
|
| - int DoSendComplete(int result);
|
| -
|
| - // Evicts all unsent deferred requests. This is called if there is a Send()
|
| - // error or one of our streams informs us the connection is no longer
|
| - // reusable.
|
| - int DoEvictPendingSendRequests(int result);
|
| -
|
| - // Ensures that only the active request's HttpPipelinedSocket can read from
|
| - // the underlying socket until it completes. A HttpPipelinedSocket informs us
|
| - // that it's done by calling Close().
|
| - int DoReadHeadersLoop(int result);
|
| -
|
| - // Called when the pending asynchronous ReadResponseHeaders() completes.
|
| - void OnReadIOCallback(int result);
|
| -
|
| - // Invokes DoStartNextDeferredRead() if the read loop is idle. This is called
|
| - // via a task queued when the previous |active_read_id_| closes its stream
|
| - // after a succesful response.
|
| - void StartNextDeferredRead();
|
| -
|
| - // Activates the next read request immediately. This is called via
|
| - // ReadResponseHeaders() if that stream is at the front of |request_order_|
|
| - // and the read loop is idle.
|
| - int DoStartReadImmediately(int result);
|
| -
|
| - // Activates the next read request in |request_order_| if it's ready to go.
|
| - // This is called via StartNextDeferredRead().
|
| - int DoStartNextDeferredRead(int result);
|
| -
|
| - // Calls ReadResponseHeaders() on the active request's parser.
|
| - int DoReadHeaders(int result);
|
| -
|
| - // Notifies the user that reading the headers has completed. This may happen
|
| - // directly after DoReadNextHeaders() if the response is already available.
|
| - // Otherwise, it is called in response to OnReadIOCallback().
|
| - int DoReadHeadersComplete(int result);
|
| -
|
| - // Halts the read loop until Close() is called by the active stream.
|
| - int DoReadWaitForClose(int result);
|
| -
|
| - // Cleans up the state associated with the active request. Invokes
|
| - // DoReadNextHeaders() in a new task to start the next response. This is
|
| - // called after the active request's HttpPipelinedSocket calls Close().
|
| - int DoReadStreamClosed();
|
| -
|
| - // Removes all pending ReadResponseHeaders() requests from the queue. This may
|
| - // happen if there is an error with the pipeline or one of our
|
| - // HttpPipelinedSockets indicates the connection was suddenly closed.
|
| - int DoEvictPendingReadHeaders(int result);
|
| -
|
| - // Determines if the response headers indicate pipelining will work. This is
|
| - // called every time we receive headers.
|
| - void CheckHeadersForPipelineCompatibility(int pipeline_id, int result);
|
| -
|
| - // Reports back to |delegate_| whether pipelining will work.
|
| - void ReportPipelineFeedback(int pipeline_id, Feedback feedback);
|
| -
|
| - // Posts a task to fire the user's callback in response to SendRequest() or
|
| - // ReadResponseHeaders() completing on an underlying parser. This might be
|
| - // invoked in response to our own IO callbacks, or it may be invoked if the
|
| - // underlying parser completes SendRequest() or ReadResponseHeaders()
|
| - // synchronously, but we've already returned ERR_IO_PENDING to the user's
|
| - // SendRequest() or ReadResponseHeaders() call into us.
|
| - void QueueUserCallback(int pipeline_id,
|
| - const CompletionCallback& callback,
|
| - int rv,
|
| - const tracked_objects::Location& from_here);
|
| -
|
| - // Invokes the callback queued in QueueUserCallback().
|
| - void FireUserCallback(int pipeline_id, int result);
|
| -
|
| - Delegate* delegate_;
|
| - scoped_ptr<ClientSocketHandle> connection_;
|
| - SSLConfig used_ssl_config_;
|
| - ProxyInfo used_proxy_info_;
|
| - BoundNetLog net_log_;
|
| - bool was_npn_negotiated_;
|
| - // Protocol negotiated with the server.
|
| - NextProto protocol_negotiated_;
|
| - scoped_refptr<GrowableIOBuffer> read_buf_;
|
| - int next_pipeline_id_;
|
| - bool active_;
|
| - bool usable_;
|
| - bool completed_one_request_;
|
| - base::WeakPtrFactory<HttpPipelinedConnectionImpl> weak_factory_;
|
| -
|
| - StreamInfoMap stream_info_map_;
|
| -
|
| - std::queue<int> request_order_;
|
| -
|
| - std::queue<PendingSendRequest*> pending_send_request_queue_;
|
| - scoped_ptr<PendingSendRequest> active_send_request_;
|
| - SendRequestState send_next_state_;
|
| - bool send_still_on_call_stack_;
|
| -
|
| - ReadHeadersState read_next_state_;
|
| - int active_read_id_;
|
| - bool read_still_on_call_stack_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(HttpPipelinedConnectionImpl);
|
| -};
|
| -
|
| -} // namespace net
|
| -
|
| -#endif // NET_HTTP_HTTP_PIPELINED_CONNECTION_IMPL_H_
|
|
|