#ifndef NET_CRONET_ANDROID_URL_REQUEST_PEER_H_
#define NET_CRONET_ANDROID_URL_REQUEST_PEER_H_
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "net/base/request_priority.h"
#include "net/base/upload_data_stream.h"
#include "net/cronet/android/url_request_context_peer.h"
#include "net/http/http_request_headers.h"
#include "net/url_request/url_request.h"
class URLRequestPeer : public net::URLRequest::Delegate {
public:
class URLRequestPeerDelegate
: public base::RefCountedThreadSafe<URLRequestPeerDelegate> {
public:
virtual void OnAppendChunkCompleted(URLRequestPeer* request) = 0;
virtual void OnResponseStarted(URLRequestPeer* request) = 0;
virtual void OnBytesRead(URLRequestPeer* request) = 0;
virtual void OnRequestFinished(URLRequestPeer* request) = 0;
protected:
friend class base::RefCountedThreadSafe<URLRequestPeerDelegate>;
virtual ~URLRequestPeerDelegate() {}
};
URLRequestPeer(URLRequestContextPeer* context,
URLRequestPeerDelegate* delegate,
GURL url,
net::RequestPriority priority);
virtual ~URLRequestPeer();
void SetMethod(const std::string& method);
void AddHeader(const std::string& name, const std::string& value);
void SetPostContent(const char* bytes, int bytes_len);
void EnableStreamingUpload();
void AppendChunk(const char* bytes, int bytes_len, bool is_last_chunk);
void Start();
void Cancel();
void Destroy();
GURL url() const { return url_; }
int error_code() const { return error_code_; }
int http_status_code() const {
return http_status_code_;
};
int64 content_length() const { return expected_size_; }
std::string content_type() const { return content_type_; }
size_t bytes_read() const { return bytes_read_; }
unsigned char* Data() const;
virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE;
virtual void OnReadCompleted(net::URLRequest* request,
int bytes_read) OVERRIDE;
private:
URLRequestContextPeer* context_;
scoped_refptr<URLRequestPeerDelegate> delegate_;
GURL url_;
net::RequestPriority priority_;
std::string method_;
net::HttpRequestHeaders headers_;
net::URLRequest* url_request_;
scoped_ptr<net::UploadDataStream> upload_data_stream_;
scoped_refptr<net::GrowableIOBuffer> read_buffer_;
int bytes_read_;
int total_bytes_read_;
int error_code_;
int http_status_code_;
std::string content_type_;
bool canceled_;
int64 expected_size_;
bool streaming_upload_;
static void OnInitiateConnectionWrapper(URLRequestPeer* self);
static void OnCancelRequestWrapper(URLRequestPeer* self);
static void OnDestroyRequest(URLRequestPeer* self);
static void OnAppendChunkWrapper(URLRequestPeer* self,
const char* bytes,
int bytes_len,
bool is_last_chunk);
void OnInitiateConnection();
void OnCancelRequest();
void OnRequestSucceeded();
void OnRequestFailed();
void OnRequestCompleted();
void OnRequestCanceled();
void OnBytesRead(int bytes_read);
void OnAppendChunk(const char* bytes, int bytes_len, bool is_last_chunk);
void Read();
DISALLOW_COPY_AND_ASSIGN(URLRequestPeer);
};
#endif