diff --git a/src/sentry/static/sentry/app/components/events/interfaces/request.jsx b/src/sentry/static/sentry/app/components/events/interfaces/request.jsx index 2fa0e2a9b4a59a..45ec90301905d9 100644 --- a/src/sentry/static/sentry/app/components/events/interfaces/request.jsx +++ b/src/sentry/static/sentry/app/components/events/interfaces/request.jsx @@ -3,7 +3,7 @@ import React from 'react'; import GroupEventDataSection from 'app/components/events/eventDataSection'; import SentryTypes from 'app/sentryTypes'; import RichHttpContent from 'app/components/events/interfaces/richHttpContent'; -import {getCurlCommand} from 'app/components/events/interfaces/utils'; +import {getFullUrl, getCurlCommand} from 'app/components/events/interfaces/utils'; import {isUrl} from 'app/utils'; import {t} from 'app/locale'; import ExternalLink from 'app/components/externalLink'; @@ -49,23 +49,13 @@ class RequestInterface extends React.Component { let data = this.props.data; let view = this.state.view; - let fullUrl = data.url; - let parsedUrl = null; - if (fullUrl) { - if (data.query) { - fullUrl += '?' + data.query; - } - if (data.fragment) { - fullUrl += '#' + data.fragment; - } - - if (!isUrl(fullUrl)) { - // Check if the url passed in is a safe url to avoid XSS - fullUrl = null; - } + let fullUrl = getFullUrl(data); + if (!isUrl(fullUrl)) { + // Check if the url passed in is a safe url to avoid XSS + fullUrl = null; } - // check `fullUrl` again because of `isUrl` check + let parsedUrl = null; if (fullUrl) { // use html tag to parse url, lol parsedUrl = document.createElement('a'); diff --git a/src/sentry/static/sentry/app/components/events/interfaces/utils.jsx b/src/sentry/static/sentry/app/components/events/interfaces/utils.jsx index f0267b89bab30d..91e613ae13070b 100644 --- a/src/sentry/static/sentry/app/components/events/interfaces/utils.jsx +++ b/src/sentry/static/sentry/app/components/events/interfaces/utils.jsx @@ -1,4 +1,4 @@ -import {isString} from 'lodash'; +import {isEmpty, isString} from 'lodash'; import * as Sentry from '@sentry/browser'; import queryString from 'query-string'; @@ -56,18 +56,37 @@ export function getCurlCommand(data) { } } - result += ' \\\n "' + data.url; + result += ' \\\n "' + getFullUrl(data) + '"'; + return result; +} - if (defined(data.query) && data.query) { - let queryObj = {}; - for (let [k, v] of data.query) { - queryObj[k] = v; - } - result += '?' + queryString.stringify(queryObj); +export function stringifyQueryList(query) { + if (isString(query)) { + return query; } - result += '"'; - return result; + let queryObj = {}; + for (let [k, v] of query) { + queryObj[k] = v; + } + return queryString.stringify(queryObj); +} + +export function getFullUrl(data) { + let fullUrl = data && data.url; + if (!fullUrl) { + return fullUrl; + } + + if (!isEmpty(data.query)) { + fullUrl += '?' + stringifyQueryList(data.query); + } + + if (data.fragment) { + fullUrl += '#' + data.fragment; + } + + return fullUrl; } /**