Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Only pass strings to HttpRequest#setHeader #709

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 24 additions & 7 deletions lib/upload.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,23 @@ class BaseUpload {
})
}

static convertToStringHeaderValue(val) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The helper method is a good idea, but not really needed. I would like to avoid a large helper method like this that magically converts everything somehow into a string and instead use dedicated methods where we need to convert things into string.

if (val === null || val === undefined) {
return ''
} else if (Array.isArray(val)) {
return val.join(',')
} else if (
typeof val === 'string' ||
typeof val === 'number' ||
typeof val === 'boolean' ||
typeof val === 'symbol'
) {
return val.toString()
} else if (typeof val === 'object') {
return Object.values(val).join(',')
}
}

findPreviousUploads() {
return this.options
.fingerprint(this.file, this.options)
Expand Down Expand Up @@ -378,7 +395,7 @@ class BaseUpload {
// Add metadata if values have been added
const metadata = encodeMetadata(this.options.metadata)
if (metadata !== '') {
req.setHeader('Upload-Metadata', metadata)
req.setHeader('Upload-Metadata', BaseUpload.convertToStringHeaderValue(metadata))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

encodeMetadata always returns a string, so we don't need a conversion here.

}

return this._sendRequest(req, null)
Expand Down Expand Up @@ -579,15 +596,15 @@ class BaseUpload {
const req = this._openRequest('POST', this.options.endpoint)

if (this.options.uploadLengthDeferred) {
req.setHeader('Upload-Defer-Length', 1)
req.setHeader('Upload-Defer-Length', '1')
} else {
req.setHeader('Upload-Length', this._size)
req.setHeader('Upload-Length', BaseUpload.convertToStringHeaderValue(this._size))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most violations come from Upload-Length and Upload-Offset as you already found out. We can just use ${this._size} or similar here to convert the numbers into strings without the additional conversion method.

}

// Add metadata if values have been added
const metadata = encodeMetadata(this.options.metadata)
if (metadata !== '') {
req.setHeader('Upload-Metadata', metadata)
req.setHeader('Upload-Metadata', BaseUpload.convertToStringHeaderValue(metadata))
}

let promise
Expand Down Expand Up @@ -754,7 +771,7 @@ class BaseUpload {
req = this._openRequest('PATCH', this.url)
}

req.setHeader('Upload-Offset', this._offset)
req.setHeader('Upload-Offset', BaseUpload.convertToStringHeaderValue(this._offset))
const promise = this._addChunkToRequest(req)

promise
Expand Down Expand Up @@ -810,7 +827,7 @@ class BaseUpload {
// upload size and can tell the tus server.
if (this.options.uploadLengthDeferred && done) {
this._size = this._offset + valueSize
req.setHeader('Upload-Length', this._size)
req.setHeader('Upload-Length', BaseUpload.convertToStringHeaderValue(this._size))
}

// The specified uploadSize might not match the actual amount of data that a source
Expand Down Expand Up @@ -973,7 +990,7 @@ function openRequest(method, url, options) {
const headers = options.headers || {}

for (const [name, value] of Object.entries(headers)) {
req.setHeader(name, value)
req.setHeader(name, BaseUpload.convertToStringHeaderValue(value))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we should magically convert non-strings into strings here, especially since this is technically a breaking change. It's the user responsibility to pass proper values in here that match what the documentation mentions.

We can log a warning if the value is not a string and then convert the warning into an error in the next major release.

}

if (options.addRequestId) {
Expand Down
32 changes: 16 additions & 16 deletions test/spec/test-browser-specific.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads/resuming')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Offset']).toBe(3)
expect(req.requestHeaders['Upload-Offset']).toBe('3')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.size).toBe(11 - 3)

Expand Down Expand Up @@ -196,7 +196,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads/storedUrl')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Offset']).toBe(3)
expect(req.requestHeaders['Upload-Offset']).toBe('3')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.size).toBe(11 - 3)

Expand Down Expand Up @@ -291,7 +291,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads')
expect(req.method).toBe('POST')
expect(req.requestHeaders['Upload-Length']).toBe(undefined)
expect(req.requestHeaders['Upload-Defer-Length']).toBe(1)
expect(req.requestHeaders['Upload-Defer-Length']).toBe('1')

req.respondWith({
status: 201,
Expand All @@ -303,7 +303,7 @@ describe('tus', () => {
req = await testStack.nextRequest()
expect(req.url).toBe('http://tus.io/uploads/blargh')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Upload-Offset']).toBe(0)
expect(req.requestHeaders['Upload-Offset']).toBe('0')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.length).toBe(11)

Expand All @@ -320,8 +320,8 @@ describe('tus', () => {
req = await testStack.nextRequest()
expect(req.url).toBe('http://tus.io/uploads/blargh')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Upload-Offset']).toBe(11)
expect(req.requestHeaders['Upload-Length']).toBe(11)
expect(req.requestHeaders['Upload-Offset']).toBe('11')
expect(req.requestHeaders['Upload-Length']).toBe('11')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body).toBe(null)

Expand Down Expand Up @@ -369,7 +369,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads')
expect(req.method).toBe('POST')
expect(req.requestHeaders['Upload-Length']).toBe(undefined)
expect(req.requestHeaders['Upload-Defer-Length']).toBe(1)
expect(req.requestHeaders['Upload-Defer-Length']).toBe('1')

req.respondWith({
status: 201,
Expand All @@ -381,7 +381,7 @@ describe('tus', () => {
req = await testStack.nextRequest()
expect(req.url).toBe('http://tus.io/uploads/blargh')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Upload-Offset']).toBe(0)
expect(req.requestHeaders['Upload-Offset']).toBe('0')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.length).toBe(6)

Expand All @@ -399,7 +399,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads/blargh')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Offset']).toBe(6)
expect(req.requestHeaders['Upload-Offset']).toBe('6')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.length).toBe(5)

Expand All @@ -413,8 +413,8 @@ describe('tus', () => {
req = await testStack.nextRequest()
expect(req.url).toBe('http://tus.io/uploads/blargh')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Upload-Offset']).toBe(11)
expect(req.requestHeaders['Upload-Length']).toBe(11)
expect(req.requestHeaders['Upload-Offset']).toBe('11')
expect(req.requestHeaders['Upload-Length']).toBe('11')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body).toBe(null)

Expand Down Expand Up @@ -479,7 +479,7 @@ describe('tus', () => {
req = await testStack.nextRequest()
expect(req.url).toBe('http://tus.io/files/foo')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Upload-Length']).toBe(11)
expect(req.requestHeaders['Upload-Length']).toBe('11')

req.respondWith({
status: 204,
Expand Down Expand Up @@ -551,7 +551,7 @@ describe('tus', () => {
req = await testStack.nextRequest()
expect(req.url).toBe('http://tus.io/files/foo')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Upload-Length']).toBe(11)
expect(req.requestHeaders['Upload-Length']).toBe('11')

req.respondWith({
status: 204,
Expand Down Expand Up @@ -645,7 +645,7 @@ describe('tus', () => {
req = await testStack.nextRequest()
expect(req.url).toBe('http://tus.io/files/foo')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Upload-Length']).toBe(18)
expect(req.requestHeaders['Upload-Length']).toBe('18')

req.respondWith({
status: 204,
Expand Down Expand Up @@ -765,7 +765,7 @@ describe('tus', () => {
req = await testStack.nextRequest()
expect(req.url).toBe('http://tus.io/uploads')
expect(req.method).toBe('POST')
expect(req.requestHeaders['Upload-Length']).toBe(11)
expect(req.requestHeaders['Upload-Length']).toBe('11')

req.respondWith({
status: 201,
Expand All @@ -778,7 +778,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads/blargh')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Offset']).toBe(0)
expect(req.requestHeaders['Upload-Offset']).toBe('0')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.size).toBe(11)

Expand Down
24 changes: 12 additions & 12 deletions test/spec/test-common.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ describe('tus', () => {
expect(req.method).toBe('POST')
expect(req.requestHeaders.Custom).toBe('blargh')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Length']).toBe(11)
expect(req.requestHeaders['Upload-Length']).toBe('11')
expect(req.requestHeaders['Upload-Metadata']).toBe(
'foo aGVsbG8=,bar d29ybGQ=,nonlatin c8WCb8WEY2U=,number MTAw',
)
Expand All @@ -75,7 +75,7 @@ describe('tus', () => {
expect(req.method).toBe('PATCH')
expect(req.requestHeaders.Custom).toBe('blargh')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Offset']).toBe(0)
expect(req.requestHeaders['Upload-Offset']).toBe('0')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.size).toBe(11)

Expand Down Expand Up @@ -117,7 +117,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads')
expect(req.method).toBe('POST')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Length']).toBe(11)
expect(req.requestHeaders['Upload-Length']).toBe('11')

// The upload URL should be cleared when tus-js.client tries to create a new upload.
expect(upload.url).toBe(null)
Expand Down Expand Up @@ -145,7 +145,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads')
expect(req.method).toBe('POST')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Length']).toBe(11)
expect(req.requestHeaders['Upload-Length']).toBe('11')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.size).toBe(11)

Expand Down Expand Up @@ -189,7 +189,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads')
expect(req.method).toBe('POST')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Length']).toBe(11)
expect(req.requestHeaders['Upload-Length']).toBe('11')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.size).toBe(6)

Expand All @@ -212,7 +212,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads/blargh')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Offset']).toBe(6)
expect(req.requestHeaders['Upload-Offset']).toBe('6')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.size).toBe(5)

Expand Down Expand Up @@ -419,7 +419,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads')
expect(req.method).toBe('POST')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Length']).toBe(11)
expect(req.requestHeaders['Upload-Length']).toBe('11')

req.respondWith({
status: 201,
Expand All @@ -432,7 +432,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads/blargh')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Offset']).toBe(0)
expect(req.requestHeaders['Upload-Offset']).toBe('0')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.size).toBe(7)

Expand All @@ -447,7 +447,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads/blargh')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Offset']).toBe(7)
expect(req.requestHeaders['Upload-Offset']).toBe('7')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.size).toBe(4)

Expand Down Expand Up @@ -517,7 +517,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/uploads')
expect(req.method).toBe('POST')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Length']).toBe(0)
expect(req.requestHeaders['Upload-Length']).toBe('0')

req.respondWith({
status: 201,
Expand Down Expand Up @@ -604,7 +604,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/files/upload')
expect(req.method).toBe('PATCH')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Offset']).toBe(3)
expect(req.requestHeaders['Upload-Offset']).toBe('3')
expect(req.requestHeaders['Content-Type']).toBe('application/offset+octet-stream')
expect(req.body.size).toBe(11 - 3)

Expand Down Expand Up @@ -716,7 +716,7 @@ describe('tus', () => {
expect(req.url).toBe('http://tus.io/files/upload')
expect(req.method).toBe('POST')
expect(req.requestHeaders['Tus-Resumable']).toBe('1.0.0')
expect(req.requestHeaders['Upload-Offset']).toBe(3)
expect(req.requestHeaders['Upload-Offset']).toBe('3')
expect(req.requestHeaders['X-HTTP-Method-Override']).toBe('PATCH')

req.respondWith({
Expand Down
Loading