Skip to content

Commit 3820df5

Browse files
committed
fix: parseUrl utility function
1 parent 3d0d568 commit 3820df5

File tree

4 files changed

+24
-12
lines changed

4 files changed

+24
-12
lines changed

lib/instrumentation/express-utils.js

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
'use strict'
22

3-
var url = require('url')
4-
53
var symbols = require('../symbols')
4+
var parsers = require('../parsers')
5+
6+
var parseUrl
7+
try {
8+
parseUrl = require('parseurl')
9+
} catch (e) {
10+
parseUrl = req => parsers.parseUrl(req.url)
11+
}
612

713
function normalizeSlash (value) {
814
return value[0] === '/' ? value : '/' + value
@@ -45,7 +51,7 @@ function getPathFromRequest (req, useBase, usePathAsTransactionName) {
4551
}
4652

4753
if (usePathAsTransactionName) {
48-
const parsed = url.URL ? new url.URL(req.url, 'relative:///') : url.parse(req.url)
54+
const parsed = parseUrl(req)
4955
return parsed && parsed.pathname
5056
}
5157
}

lib/instrumentation/http-shared.js

+8-6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var url = require('url')
44

55
var endOfStream = require('end-of-stream')
66

7+
var parsers = require('../parsers')
8+
79
const transactionForResponse = new WeakMap()
810
exports.transactionForResponse = transactionForResponse
911

@@ -93,14 +95,14 @@ function formatURL (item) {
9395
search: item.search
9496
}
9597
}
98+
9699
// NOTE: This will also stringify and parse URL instances
97100
// to a format which can be mixed into the options object.
98101
function ensureUrl (v) {
99-
if (url.URL && (v instanceof url.URL || typeof v === 'string')) {
100-
const urlObj = new url.URL(v.toString(), 'relative:///')
101-
return formatURL(urlObj)
102-
} else if (typeof v === 'string') {
103-
return url.parse(v)
102+
if (typeof v === 'string') {
103+
return formatURL(parsers.parseUrl(v))
104+
} else if (url.URL && v instanceof url.URL) {
105+
return formatURL(v)
104106
} else {
105107
return v
106108
}
@@ -154,7 +156,7 @@ exports.traceOutgoingRequest = function (agent, moduleName, method) {
154156

155157
ins.bindEmitter(req)
156158

157-
span.name = req.method + ' ' + req._headers.host + url.parse(req.path).pathname
159+
span.name = req.method + ' ' + req._headers.host + parsers.parseUrl(req.path).pathname
158160

159161
// TODO: Research if it's possible to add this to the prototype instead.
160162
// Or if it's somehow preferable to listen for when a `response` listener

lib/instrumentation/modules/http2.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
'use strict'
22

3-
var url = require('url')
4-
53
var eos = require('end-of-stream')
64

75
var shimmer = require('../shimmer')
86
var symbols = require('../../symbols')
7+
var parsers = require('../../parsers')
98

109
module.exports = function (http2, agent, { enabled }) {
1110
if (!enabled) return http2
@@ -155,7 +154,7 @@ module.exports = function (http2, agent, { enabled }) {
155154

156155
ins.bindEmitter(req)
157156

158-
var urlObj = url.URL ? new url.URL(headers[':path'], 'relative:///') : url.parse(headers[':path'])
157+
var urlObj = parsers.parseUrl(headers[':path'])
159158
var path = urlObj.pathname
160159
span.name = headers[':method'] + ' ' + host + path
161160

lib/parsers.js

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict'
22

33
var util = require('util')
4+
var url = require('url')
45

56
var afterAll = require('after-all-results')
67
var basicAuth = require('basic-auth')
@@ -215,6 +216,10 @@ exports.parseCallsite = function (callsite, isError, agent, cb) {
215216
})
216217
}
217218

219+
exports.parseUrl = function (urlStr) {
220+
return url.URL ? new url.URL(urlStr, 'relative:///') : url.parse(urlStr)
221+
}
222+
218223
// Default `culprit` to the top of the stack or the highest non `library_frame`
219224
// frame if such exists
220225
function getCulprit (frames) {

0 commit comments

Comments
 (0)