diff --git a/Common/Types/Monitor/MonitorStep.ts b/Common/Types/Monitor/MonitorStep.ts index 92eb7c5118..bd8623c2c5 100644 --- a/Common/Types/Monitor/MonitorStep.ts +++ b/Common/Types/Monitor/MonitorStep.ts @@ -32,6 +32,9 @@ export interface MonitorStepType { requestHeaders?: Dictionary | undefined; requestBody?: string | undefined; + // this is used for API and Website monitor + doNotFollowRedirects?: boolean | undefined; + // this is for port monitors. monitorDestinationPort?: Port | undefined; @@ -58,6 +61,7 @@ export default class MonitorStep extends DatabaseProperty { this.data = { id: ObjectID.generate().toString(), monitorDestination: undefined, + doNotFollowRedirects: undefined, monitorDestinationPort: undefined, monitorCriteria: new MonitorCriteria(), requestType: HTTPMethod.GET, @@ -84,6 +88,7 @@ export default class MonitorStep extends DatabaseProperty { monitorStep.data = { id: ObjectID.generate().toString(), monitorDestination: undefined, + doNotFollowRedirects: undefined, monitorDestinationPort: undefined, monitorCriteria: MonitorCriteria.getDefaultMonitorCriteria(arg), requestType: HTTPMethod.GET, @@ -133,6 +138,11 @@ export default class MonitorStep extends DatabaseProperty { return this; } + public setDoNotFollowRedirects(doNotFollowRedirects: boolean): MonitorStep { + this.data!.doNotFollowRedirects = doNotFollowRedirects; + return this; + } + public setPort(monitorDestinationPort: Port): MonitorStep { this.data!.monitorDestinationPort = monitorDestinationPort; return this; @@ -176,6 +186,7 @@ export default class MonitorStep extends DatabaseProperty { value: { id: ObjectID.generate().toString(), monitorDestination: undefined, + doNotFollowRedirects: undefined, monitorDestinationPort: undefined, monitorCriteria: MonitorCriteria.getNewMonitorCriteriaAsJSON(), requestType: HTTPMethod.GET, @@ -259,6 +270,7 @@ export default class MonitorStep extends DatabaseProperty { id: this.data.id, monitorDestination: this.data?.monitorDestination?.toJSON() || undefined, + doNotFollowRedirects: this.data.doNotFollowRedirects || undefined, monitorDestinationPort: this.data?.monitorDestinationPort?.toJSON() || undefined, monitorCriteria: this.data.monitorCriteria.toJSON(), @@ -355,6 +367,7 @@ export default class MonitorStep extends DatabaseProperty { monitorStep.data = JSONFunctions.deserialize({ id: json["id"] as string, monitorDestination: monitorDestination || undefined, + doNotFollowRedirects: json["doNotFollowRedirects"] || undefined, monitorDestinationPort: monitorDestinationPort || undefined, monitorCriteria: MonitorCriteria.fromJSON( json["monitorCriteria"] as JSONObject, diff --git a/Dashboard/src/Components/Form/Monitor/MonitorStep.tsx b/Dashboard/src/Components/Form/Monitor/MonitorStep.tsx index 7c5637553d..f0d675c139 100644 --- a/Dashboard/src/Components/Form/Monitor/MonitorStep.tsx +++ b/Dashboard/src/Components/Form/Monitor/MonitorStep.tsx @@ -55,6 +55,7 @@ import { PromiseVoidFunction } from "Common/Types/FunctionTypes"; import MonitorStepTraceMonitor, { MonitorStepTraceMonitorUtil, } from "Common/Types/Monitor/MonitorStepTraceMonitor"; +import CheckboxElement from "Common/UI/Components/Checkbox/Checkbox"; export interface ComponentProps { monitorStatusDropdownOptions: Array; @@ -75,6 +76,9 @@ const MonitorStepElement: FunctionComponent = ( setShowAdvancedOptionsRequestBodyAndHeaders, ] = useState(false); + const [showDoNotFollowRedirects, setShowDoNotFollowRedirects] = + useState(false); + const [monitorStep, setMonitorStep] = useState( props.initialValue || new MonitorStep(), ); @@ -436,7 +440,7 @@ const MonitorStepElement: FunctionComponent = ( props.monitorType === MonitorType.API && (
)} + + {!showDoNotFollowRedirects && + props.monitorType === MonitorType.Website && ( +
+
+ )} + {showAdvancedOptionsRequestBodyAndHeaders && props.monitorType === MonitorType.API && (
@@ -533,6 +551,23 @@ const MonitorStepElement: FunctionComponent = ( />
)} + + {(showDoNotFollowRedirects || + showAdvancedOptionsRequestBodyAndHeaders) && + (props.monitorType === MonitorType.API || + props.monitorType === MonitorType.Website) && ( +
+ { + monitorStep.setDoNotFollowRedirects(value); + setMonitorStep(MonitorStep.clone(monitorStep)); + }} + /> +
+ )} )} diff --git a/Dashboard/src/Components/Monitor/MonitorSteps/MonitorStep.tsx b/Dashboard/src/Components/Monitor/MonitorSteps/MonitorStep.tsx index 26445875ac..d7ef88abb2 100644 --- a/Dashboard/src/Components/Monitor/MonitorSteps/MonitorStep.tsx +++ b/Dashboard/src/Components/Monitor/MonitorSteps/MonitorStep.tsx @@ -198,6 +198,13 @@ const MonitorStepElement: FunctionComponent = ( fieldType: FieldType.DictionaryOfStrings, placeholder: "No data entered", }, + { + key: "doNotFollowRedirects", + title: "Do Not Follow Redirects", + description: "When set, we will not follow redirects.", + fieldType: FieldType.Boolean, + placeholder: "No", + }, ]; } else if (props.monitorType === MonitorType.Website) { fields = [ @@ -208,6 +215,13 @@ const MonitorStepElement: FunctionComponent = ( fieldType: FieldType.Text, placeholder: "No data entered", }, + { + key: "doNotFollowRedirects", + title: "Do Not Follow Redirects", + description: "Do not follow redirects.", + fieldType: FieldType.Boolean, + placeholder: "No", + }, ]; } else if (props.monitorType === MonitorType.Ping) { fields = [ diff --git a/Probe/Utils/Monitors/Monitor.ts b/Probe/Utils/Monitors/Monitor.ts index a5bc7a2ecf..df474da6ec 100644 --- a/Probe/Utils/Monitors/Monitor.ts +++ b/Probe/Utils/Monitors/Monitor.ts @@ -311,6 +311,7 @@ export default class MonitorUtil { monitorId: monitor.id!, retry: 10, timeout: new PositiveNumber(60000), // 60 seconds + doNotFollowRedirects: monitorStep.data?.doNotFollowRedirects || false, }, ); @@ -352,6 +353,7 @@ export default class MonitorUtil { requestType: monitorStep.data?.requestType || HTTPMethod.GET, retry: 10, timeout: new PositiveNumber(60000), // 60 seconds + doNotFollowRedirects: monitorStep.data?.doNotFollowRedirects || false, }, ); diff --git a/Probe/Utils/Monitors/MonitorTypes/ApiMonitor.ts b/Probe/Utils/Monitors/MonitorTypes/ApiMonitor.ts index 6e0a100f7f..1e150423c6 100644 --- a/Probe/Utils/Monitors/MonitorTypes/ApiMonitor.ts +++ b/Probe/Utils/Monitors/MonitorTypes/ApiMonitor.ts @@ -37,6 +37,7 @@ export default class ApiMonitor { monitorId?: ObjectID | undefined; isOnlineCheckRequest?: boolean | undefined; timeout?: PositiveNumber; // timeout in milliseconds + doNotFollowRedirects?: boolean | undefined; }, ): Promise { if (!options) { @@ -66,7 +67,7 @@ export default class ApiMonitor { undefined, { timeout: options.timeout?.toNumber() || 5000, - doNotFollowRedirects: false, + doNotFollowRedirects: options.doNotFollowRedirects || false, }, ); @@ -84,7 +85,7 @@ export default class ApiMonitor { undefined, { timeout: options.timeout?.toNumber() || 5000, - doNotFollowRedirects: false, + doNotFollowRedirects: options.doNotFollowRedirects || false, }, ); } diff --git a/Probe/Utils/Monitors/MonitorTypes/WebsiteMonitor.ts b/Probe/Utils/Monitors/MonitorTypes/WebsiteMonitor.ts index 1c65943733..c76d05a043 100644 --- a/Probe/Utils/Monitors/MonitorTypes/WebsiteMonitor.ts +++ b/Probe/Utils/Monitors/MonitorTypes/WebsiteMonitor.ts @@ -34,6 +34,7 @@ export default class WebsiteMonitor { monitorId?: ObjectID | undefined; isOnlineCheckRequest?: boolean | undefined; timeout?: PositiveNumber; // timeout in milliseconds + doNotFollowRedirects?: boolean | undefined; }, ): Promise { if (!options) { @@ -61,7 +62,7 @@ export default class WebsiteMonitor { let result: WebsiteResponse = await WebsiteRequest.fetch(url, { isHeadRequest: options.isHeadRequest, timeout: options.timeout?.toNumber() || 5000, - doNotFollowRedirects: false, + doNotFollowRedirects: options.doNotFollowRedirects || false, }); if ( @@ -73,7 +74,7 @@ export default class WebsiteMonitor { result = await WebsiteRequest.fetch(url, { isHeadRequest: false, timeout: options.timeout?.toNumber() || 5000, - doNotFollowRedirects: false, + doNotFollowRedirects: options.doNotFollowRedirects || false, }); }