summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/src/actions/requests.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/netmonitor/src/actions/requests.js')
-rw-r--r--devtools/client/netmonitor/src/actions/requests.js183
1 files changed, 183 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/src/actions/requests.js b/devtools/client/netmonitor/src/actions/requests.js
new file mode 100644
index 0000000000..838f2509a9
--- /dev/null
+++ b/devtools/client/netmonitor/src/actions/requests.js
@@ -0,0 +1,183 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const {
+ ADD_REQUEST,
+ CLEAR_REQUESTS,
+ CLONE_REQUEST,
+ CLONE_SELECTED_REQUEST,
+ REMOVE_SELECTED_CUSTOM_REQUEST,
+ RIGHT_CLICK_REQUEST,
+ SEND_CUSTOM_REQUEST,
+ SET_EVENT_STREAM_FLAG,
+ SET_RECORDING_STATE,
+ UPDATE_REQUEST,
+} = require("resource://devtools/client/netmonitor/src/constants.js");
+const {
+ getSelectedRequest,
+ getRequestById,
+ getRecordingState,
+} = require("resource://devtools/client/netmonitor/src/selectors/index.js");
+const {
+ fetchNetworkUpdatePacket,
+} = require("resource://devtools/client/netmonitor/src/utils/request-utils.js");
+
+function addRequest(id, data, batch) {
+ return {
+ type: ADD_REQUEST,
+ id,
+ data,
+ meta: { batch },
+ };
+}
+
+function updateRequest(id, data, batch) {
+ return {
+ type: UPDATE_REQUEST,
+ id,
+ data,
+ meta: { batch },
+ };
+}
+
+function setEventStreamFlag(id, batch) {
+ return {
+ type: SET_EVENT_STREAM_FLAG,
+ id,
+ meta: { batch },
+ };
+}
+
+/**
+ * Clone request by id. Used when cloning a request
+ * through the "Edit and Resend" option present in the context menu.
+ */
+function cloneRequest(id) {
+ return {
+ id,
+ type: CLONE_REQUEST,
+ };
+}
+
+/**
+ * Right click a request without selecting it.
+ */
+function rightClickRequest(id) {
+ return {
+ id,
+ type: RIGHT_CLICK_REQUEST,
+ };
+}
+
+/**
+ * Clone the currently selected request, set the "isCustom" attribute.
+ * Used by the "Edit and Resend" feature.
+ */
+function cloneSelectedRequest() {
+ return {
+ type: CLONE_SELECTED_REQUEST,
+ };
+}
+
+/**
+ * Send a new HTTP request using the data in the custom request form.
+ */
+function sendCustomRequest(requestId = null) {
+ return async ({ dispatch, getState, connector, commands }) => {
+ let request;
+ if (requestId) {
+ request = getRequestById(getState(), requestId);
+ } else {
+ request = getSelectedRequest(getState());
+ }
+
+ if (!request) {
+ return;
+ }
+
+ // Fetch request headers and post data from the backend.
+ await fetchNetworkUpdatePacket(connector.requestData, request, [
+ "requestHeaders",
+ "requestPostData",
+ ]);
+
+ // Reload the request from the store to get the headers.
+ request = getRequestById(getState(), request.id);
+
+ // Send a new HTTP request using the data in the custom request form
+ const data = {
+ cause: request.cause,
+ url: request.url,
+ method: request.method,
+ httpVersion: request.httpVersion,
+ };
+
+ if (request.requestHeaders) {
+ data.headers = request.requestHeaders.headers;
+ }
+
+ if (request.requestPostData) {
+ data.body = request.requestPostData.postData.text;
+ }
+
+ const { channelId } = await commands.networkCommand.sendHTTPRequest(data);
+
+ dispatch({
+ type: SEND_CUSTOM_REQUEST,
+ id: channelId,
+ });
+ };
+}
+
+/**
+ * Remove a request from the list. Supports removing only cloned requests with a
+ * "isCustom" attribute. Other requests never need to be removed.
+ */
+function removeSelectedCustomRequest() {
+ return {
+ type: REMOVE_SELECTED_CUSTOM_REQUEST,
+ };
+}
+/**
+ * Clear all requests
+ */
+function clearRequests() {
+ return ({ dispatch, connector }) => {
+ dispatch({ type: CLEAR_REQUESTS });
+ connector.clear();
+ };
+}
+
+/**
+ * Toggle monitoring
+ */
+function toggleRecording() {
+ return async ({ dispatch, getState, connector }) => {
+ const recording = !getRecordingState(getState());
+ if (recording) {
+ await connector.resume();
+ } else {
+ connector.pause();
+ }
+ dispatch({
+ type: SET_RECORDING_STATE,
+ recording,
+ });
+ };
+}
+
+module.exports = {
+ addRequest,
+ clearRequests,
+ cloneRequest,
+ cloneSelectedRequest,
+ rightClickRequest,
+ removeSelectedCustomRequest,
+ sendCustomRequest,
+ setEventStreamFlag,
+ toggleRecording,
+ updateRequest,
+};