1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_BASE_NETWORK_DELEGATE_H_ 6 #define NET_BASE_NETWORK_DELEGATE_H_ 7 #pragma once 8 9 #include "base/threading/non_thread_safe.h" 10 #include "net/base/completion_callback.h" 11 12 class GURL; 13 14 namespace net { 15 16 // NOTE: Layering violations! 17 // We decided to accept these violations (depending 18 // on other net/ submodules from net/base/), because otherwise NetworkDelegate 19 // would have to be broken up into too many smaller interfaces targeted to each 20 // submodule. Also, since the lower levels in net/ may callback into higher 21 // levels, we may encounter dangerous casting issues. 22 // 23 // NOTE: It is not okay to add any compile-time dependencies on symbols outside 24 // of net/base here, because we have a net_base library. Forward declarations 25 // are ok. 26 class HttpRequestHeaders; 27 class URLRequest; 28 class URLRequestJob; 29 30 class NetworkDelegate : public base::NonThreadSafe { 31 public: 32 virtual ~NetworkDelegate() {} 33 34 // Notification interface called by the network stack. Note that these 35 // functions mostly forward to the private virtuals. They also add some sanity 36 // checking on parameters. See the corresponding virtuals for explanations of 37 // the methods and their arguments. 38 int NotifyBeforeURLRequest(URLRequest* request, 39 CompletionCallback* callback, 40 GURL* new_url); 41 int NotifyBeforeSendHeaders(uint64 request_id, 42 CompletionCallback* callback, 43 HttpRequestHeaders* headers); 44 void NotifyResponseStarted(URLRequest* request); 45 void NotifyReadCompleted(URLRequest* request, int bytes_read); 46 void NotifyURLRequestDestroyed(URLRequest* request); 47 48 // Returns a URLRequestJob that will be used to handle the request if 49 // non-null. 50 // TODO(koz): Currently this is called inside registered ProtocolFactories, 51 // so that we can perform Delegate-dependent request handling from the static 52 // factories, but ultimately it should be called directly from 53 // URLRequestJobManager::CreateJob() as a general override mechanism. 54 URLRequestJob* MaybeCreateURLRequestJob(URLRequest* request); 55 56 private: 57 // This is the interface for subclasses of NetworkDelegate to implement. This 58 // member functions will be called by the respective public notification 59 // member function, which will perform basic sanity checking. 60 61 // Called before a request is sent. Allows the delegate to rewrite the URL 62 // being fetched by modifying |new_url|. The callback can be called at any 63 // time, but will have no effect if the request has already been cancelled or 64 // deleted. Returns a net status code, generally either OK to continue with 65 // the request or ERR_IO_PENDING if the result is not ready yet. 66 virtual int OnBeforeURLRequest(URLRequest* request, 67 CompletionCallback* callback, 68 GURL* new_url) = 0; 69 70 // Called right before the HTTP headers are sent. Allows the delegate to 71 // read/write |headers| before they get sent out. The callback can be called 72 // at any time, but will have no effect if the transaction handling this 73 // request has been cancelled. Returns a net status code. 74 virtual int OnBeforeSendHeaders(uint64 request_id, 75 CompletionCallback* callback, 76 HttpRequestHeaders* headers) = 0; 77 78 // This corresponds to URLRequestDelegate::OnResponseStarted. 79 virtual void OnResponseStarted(URLRequest* request) = 0; 80 81 // This corresponds to URLRequestDelegate::OnReadCompleted. 82 virtual void OnReadCompleted(URLRequest* request, int bytes_read) = 0; 83 84 // Called when an URLRequest is being destroyed. Note that the request is 85 // being deleted, so it's not safe to call any methods that may result in 86 // a virtual method call. 87 virtual void OnURLRequestDestroyed(URLRequest* request) = 0; 88 89 // Called before a request is sent and before a URLRequestJob is created to 90 // handle the request. 91 virtual URLRequestJob* OnMaybeCreateURLRequestJob(URLRequest* request) = 0; 92 93 }; 94 95 } // namespace net 96 97 #endif // NET_BASE_NETWORK_DELEGATE_H_ 98