1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_PROXY_PROXY_RESOLVER_H_
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_PROXY_PROXY_RESOLVER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "googleurl/src/gurl.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/completion_callback.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/proxy/proxy_resolver_script_data.h"
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BoundNetLog;
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ProxyInfo;
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Interface for "proxy resolvers". A ProxyResolver fills in a list of proxies
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// to use for a particular URL. Generally the backend for a ProxyResolver is
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// a PAC script, but it doesn't need to be. ProxyResolver can service multiple
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// requests at a time.
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ProxyResolver {
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Opaque pointer type, to return a handle to cancel outstanding requests.
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef void* RequestHandle;
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // See |expects_pac_bytes()| for the meaning of |expects_pac_bytes|.
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  explicit ProxyResolver(bool expects_pac_bytes)
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      : expects_pac_bytes_(expects_pac_bytes) {}
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~ProxyResolver() {}
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Gets a list of proxy servers to use for |url|. If the request will
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // complete asynchronously returns ERR_IO_PENDING and notifies the result
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // by running |callback|.  If the result code is OK then
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the request was successful and |results| contains the proxy
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // resolution information.  In the case of asynchronous completion
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // |*request| is written to, and can be passed to CancelRequest().
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual int GetProxyForURL(const GURL& url,
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                             ProxyInfo* results,
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                             CompletionCallback* callback,
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                             RequestHandle* request,
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const BoundNetLog& net_log) = 0;
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Cancels |request|.
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void CancelRequest(RequestHandle request) = 0;
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The PAC script backend can be specified to the ProxyResolver either via
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // URL, or via the javascript text itself.  If |expects_pac_bytes| is true,
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // then the ProxyResolverScriptData passed to SetPacScript() should
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // contain the actual script bytes rather than just the URL.
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool expects_pac_bytes() const { return expects_pac_bytes_; }
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void CancelSetPacScript() = 0;
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Frees any unneeded memory held by the resolver, e.g. garbage in the JS
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // engine.  Most subclasses don't need to do anything, so we provide a default
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // no-op implementation.
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void PurgeMemory() {}
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to set the PAC script backend to use.
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns ERR_IO_PENDING in the case of asynchronous completion, and notifies
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the result through |callback|.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int SetPacScript(
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const scoped_refptr<ProxyResolverScriptData>& pac_script,
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CompletionCallback* callback) = 0;
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Optional shutdown code to be run before destruction. This is only used
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // by the multithreaded runner to signal cleanup from origin thread
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Shutdown() {}
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const bool expects_pac_bytes_;
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DISALLOW_COPY_AND_ASSIGN(ProxyResolver);
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_PROXY_PROXY_RESOLVER_H_
84