blob: 6daece04c28d48d9b87e2591d3163cddd6b97583 [file] [log] [blame]
// Copyright 2017 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 EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_INFO_H_
#define EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_INFO_H_
#include <stdint.h>
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/optional.h"
#include "base/values.h"
#include "extensions/browser/api/web_request/web_request_resource_type.h"
#include "extensions/browser/extension_api_frame_id_map.h"
#include "ipc/ipc_message.h"
#include "net/http/http_request_headers.h"
#include "net/log/net_log_event_type.h"
#include "services/network/public/cpp/resource_request.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace content {
class ResourceContext;
} // namespace content
namespace net {
class HttpResponseHeaders;
class URLRequest;
} // namespace net
namespace network {
struct ResourceResponseHead;
}
namespace extensions {
class ExtensionNavigationUIData;
// A URL request representation used by WebRequest API internals. This structure
// carries information about an in-progress request.
struct WebRequestInfo {
// Helper interface used to delegate event logging operations relevant to an
// in-process web request. This is a transitional interface to move WebRequest
// code away from direct coupling to NetLog and will be removed once event
// logging is done through the tracing subsystem instead of through //net.
class Logger {
public:
virtual ~Logger() {}
virtual void LogEvent(net::NetLogEventType event_type,
const std::string& extension_id) = 0;
virtual void LogBlockedBy(const std::string& blocker_info) = 0;
virtual void LogUnblocked() = 0;
};
WebRequestInfo();
// Initializes a WebRequestInfo from a net::URLRequest. Should be used
// sparingly, as we are moving away from direct URLRequest usage and toward
// using Network Service. Prefer passing and referencing WebRequestInfo in
// lieu of exposing any new direct references to net::URLRequest throughout
// extensions WebRequest-related code.
explicit WebRequestInfo(net::URLRequest* url_request);
// Initializes a WebRequestInfo from information provided over a
// URLLoaderFactory interface, for use with the Network Service.
WebRequestInfo(uint64_t request_id,
int render_process_id,
int render_frame_id,
std::unique_ptr<ExtensionNavigationUIData> navigation_ui_data,
int32_t routing_id,
const network::ResourceRequest& request);
~WebRequestInfo();
// Fill in response data for this request. Only used when the Network Service
// is disabled.
void AddResponseInfoFromURLRequest(net::URLRequest* url_request);
// Fill in response data for this request. Only used when the Network Service
// is enabled.
void AddResponseInfoFromResourceResponse(
const network::ResourceResponseHead& response);
// A unique identifier for this request.
uint64_t id = 0;
// The URL of the request.
GURL url;
GURL site_for_cookies;
// The ID of the render process which initiated the request, or -1 of not
// applicable (i.e. if initiated by the browser).
int render_process_id = -1;
// The routing ID of the object which initiated the request, if applicable.
int routing_id = MSG_ROUTING_NONE;
// The render frame ID of the frame which initiated this request, or -1 if
// the request was not initiated by a frame.
int frame_id = -1;
// The HTTP method used for the request, if applicable.
std::string method;
// Indicates whether the request is for a browser-side navigation.
bool is_browser_side_navigation = false;
// The origin of the context which initiated the request. May be null for
// browser-initiated requests such as navigations.
base::Optional<url::Origin> initiator;
// Extension API frame data corresponding to details of the frame which
// initiate this request. May be null for renderer-initiated requests where
// some frame details are not known at WebRequestInfo construction time.
base::Optional<ExtensionApiFrameIdMap::FrameData> frame_data;
// The type of the request (e.g. main frame, subresource, XHR, etc). May have
// no value if the request did not originate from a ResourceDispatcher.
base::Optional<content::ResourceType> type;
// A partially mirrored copy of |type| which is slightly less granular and
// which also identifies WebSocket requests separately from other types.
WebRequestResourceType web_request_type = WebRequestResourceType::OTHER;
// Indicates if this request is asynchronous.
bool is_async = false;
net::HttpRequestHeaders extra_request_headers;
// Indicates if this request is for a PAC script.
bool is_pac_request = false;
// HTTP response code for this request if applicable. -1 if not.
int response_code = -1;
// All response headers for this request, if set.
scoped_refptr<net::HttpResponseHeaders> response_headers;
// The stringified IP address of the host which provided the response to this
// request, if applicable and available.
std::string response_ip;
// Indicates whether or not the request response (if applicable) came from
// cache.
bool response_from_cache = false;
// A dictionary of request body data matching the format expected by
// WebRequest API consumers. This may have a "formData" key and/or a "raw"
// key. See WebRequest API documentation for more details.
std::unique_ptr<base::DictionaryValue> request_body_data;
// Indicates whether this request was initiated by a <webview> instance.
bool is_web_view = false;
// If |is_web_view| is true, the instance ID, rules registry ID, and embedder
// process ID pertaining to the webview instance. Note that for browser-side
// navigation requests, |web_view_embedder_process_id| is always -1.
int web_view_instance_id = -1;
int web_view_rules_registry_id = -1;
int web_view_embedder_process_id = -1;
// Helper used to log events relevant to WebRequest processing. See definition
// of Logger above. This is always non-null.
std::unique_ptr<Logger> logger;
// The ResourceContext associated with this request. May be null.
content::ResourceContext* resource_context = nullptr;
private:
void InitializeWebViewAndFrameData(
const ExtensionNavigationUIData* navigation_ui_data);
DISALLOW_COPY_AND_ASSIGN(WebRequestInfo);
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_INFO_H_