1// Copyright 2013 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 COMPONENTS_POLICY_CORE_COMMON_CLOUD_POLICY_HEADER_IO_HELPER_H_
6#define COMPONENTS_POLICY_CORE_COMMON_CLOUD_POLICY_HEADER_IO_HELPER_H_
7
8#include <string>
9
10#include "base/memory/ref_counted.h"
11#include "base/sequenced_task_runner.h"
12#include "components/policy/policy_export.h"
13#include "url/gurl.h"
14
15namespace net {
16class URLRequest;
17}
18
19namespace policy {
20
21// Helper class that lives on the I/O thread and adds policy headers to
22// outgoing requests. Instances of this class are created by
23// PolicyHeaderService on the UI thread, and that class is responsible for
24// notifying this class via UpdateHeaderFromUI() when the header changes.
25// Ownership is transferred to ProfileIOData, and this object is run and
26// destroyed on the I/O thread.
27class POLICY_EXPORT PolicyHeaderIOHelper {
28 public:
29  PolicyHeaderIOHelper(
30      const std::string& server_url,
31      const std::string& initial_header_value,
32      const scoped_refptr<base::SequencedTaskRunner>& task_runner);
33  ~PolicyHeaderIOHelper();
34
35  // Sets any necessary policy headers for the specified URL on the passed
36  // request. Should be invoked only from the I/O thread.
37  void AddPolicyHeaders(const GURL& url,
38                        net::URLRequest* request) const;
39
40  // API invoked when the header changes. Can be called from any thread - calls
41  // are marshalled via the TaskRunner to run on the appropriate thread.
42  // If |new_header| is the empty string, no header will be added to
43  // outgoing requests.
44  void UpdateHeader(const std::string& new_header);
45
46  // Test-only routine used to inject the server URL at runtime - this is
47  // required because PolicyHeaderIOHelper is created very early in BrowserTest
48  // initialization, before we startup the EmbeddedTestServer.
49  void SetServerURLForTest(const std::string& server_url);
50
51 private:
52  // API invoked via the TaskRunner to update the header.
53  void UpdateHeaderOnIOThread(const std::string& new_header);
54
55  // Helper routine invoked via the TaskRunner to update the cached server URL.
56  void SetServerURLOnIOThread(const std::string& new_header);
57
58  // The URL we should add policy headers to.
59  std::string server_url_;
60
61  // The task runner assocated with the I/O thread that runs this object.
62  scoped_refptr<base::SequencedTaskRunner> io_task_runner_;
63
64  // The current policy header value.
65  std::string policy_header_;
66
67  DISALLOW_COPY_AND_ASSIGN(PolicyHeaderIOHelper);
68};
69
70}  // namespace policy
71
72#endif  // COMPONENTS_POLICY_CORE_COMMON_CLOUD_POLICY_HEADER_IO_HELPER_H_
73