blob: f25974ca5a892af50e2adadf1249657eba2401e2 [file] [log] [blame]
// Copyright 2014 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 MOJO_SERVICES_NETWORK_URL_LOADER_IMPL_H_
#define MOJO_SERVICES_NETWORK_URL_LOADER_IMPL_H_
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "mojo/common/handle_watcher.h"
#include "mojo/services/network/public/interfaces/url_loader.mojom.h"
#include "mojo/services/network/public/interfaces/network_service.mojom.h"
#include "net/base/net_errors.h"
#include "net/url_request/url_request.h"
#include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h"
namespace mojo {
class NetworkContext;
class NetToMojoPendingBuffer;
class URLLoaderImpl : public URLLoader,
public net::URLRequest::Delegate {
public:
URLLoaderImpl(NetworkContext* context,
InterfaceRequest<URLLoader> request,
std::vector<URLLoaderInterceptorPtr> interceptors);
~URLLoaderImpl() override;
// Called when the associated NetworkContext is going away.
void Cleanup();
private:
class BodyFetcher;
// URLLoader methods:
void Start(URLRequestPtr request,
const Callback<void(URLResponsePtr)>& callback) override;
void FollowRedirect(const Callback<void(URLResponsePtr)>& callback) override;
void QueryStatus(const Callback<void(URLLoaderStatusPtr)>& callback) override;
// net::URLRequest::Delegate methods:
void OnReceivedRedirect(net::URLRequest* url_request,
const net::RedirectInfo& redirect_info,
bool* defer_redirect) override;
void OnResponseStarted(net::URLRequest* url_request) override;
void OnReadCompleted(net::URLRequest* url_request, int bytes_read) override;
void OnConnectionError();
void SendError(
int error,
const Callback<void(URLResponsePtr)>& callback);
void OnIntercept(URLLoaderInterceptorResponsePtr response);
void FollowRedirectInternal();
void StartInternal(URLRequestPtr request);
void SendResponse(URLResponsePtr response);
void OnBodyFetcherDone(BodyFetcher* fetcher);
NetworkContext* context_;
std::vector<URLLoaderInterceptorPtr> interceptors_;
int interceptor_index_;
Callback<void(URLResponsePtr)> callback_;
scoped_ptr<net::URLRequest> url_request_;
scoped_ptr<net::RedirectInfo> redirect_info_;
uint32 response_body_buffer_size_;
bool auto_follow_redirects_;
std::vector<std::unique_ptr<BodyFetcher>> body_fetchers_;
uint32_t current_fetcher_id_;
URLLoaderStatusPtr last_status_;
Binding<URLLoader> binding_;
};
} // namespace mojo
#endif // MOJO_SERVICES_NETWORK_URL_LOADER_IMPL_H_