Skip to content

Commit 6590be0

Browse files
authored
Migrate to mime-types npm package (#414)
We no longer rely on a hand-curated list of MIME types and instead use the output from the `mime-types` npm package.
1 parent f6d3939 commit 6590be0

File tree

9 files changed

+66
-221
lines changed

9 files changed

+66
-221
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Feature",
3+
"description": "Detect more MIME types for S3 uploads"
4+
}

package-lock.json

Lines changed: 28 additions & 40 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"@types/jest": "^26.0.19",
4444
"@types/js-yaml": "^3.12.1",
4545
"@types/json-query": "^2.2.0",
46+
"@types/mime-types": "^2.1.0",
4647
"@types/node": "^10.17.28",
4748
"@types/q": "^1.5.4",
4849
"@types/readline-sync": "^1.4.3",
@@ -84,6 +85,7 @@
8485
"base-64": "^0.1.0",
8586
"https-proxy-agent": "^5.0.0",
8687
"js-yaml": "^3.13.1",
88+
"mime-types": "^2.1.30",
8789
"semver": "^7.3.4",
8890
"shelljs": "^0.8.3"
8991
},

src/lib/s3.ts

Lines changed: 0 additions & 178 deletions
Original file line numberDiff line numberDiff line change
@@ -5,184 +5,6 @@
55

66
import { S3 } from 'aws-sdk/clients/all'
77

8-
// known mime types as recognized by the AWS SDK for .NET and
9-
// AWS Toolkit for Visual Studio
10-
export const knownMimeTypes: Map<string, string> = new Map<string, string>([
11-
['.ai', 'application/postscript'],
12-
['.aif', 'audio/x-aiff'],
13-
['.aifc', 'audio/x-aiff'],
14-
['.aiff', 'audio/x-aiff'],
15-
['.asc', 'text/plain'],
16-
['.au', 'audio/basic'],
17-
['.avi', 'video/x-msvideo'],
18-
['.bcpio', 'application/x-bcpio'],
19-
['.bin', 'application/octet-stream'],
20-
['.c', 'text/plain'],
21-
['.cc', 'text/plain'],
22-
['.ccad', 'application/clariscad'],
23-
['.cdf', 'application/x-netcdf'],
24-
['.class', 'application/octet-stream'],
25-
['.cpio', 'application/x-cpio'],
26-
['.cpp', 'text/plain'],
27-
['.cpt', 'application/mac-compactpro'],
28-
['.cs', 'text/plain'],
29-
['.csh', 'application/x-csh'],
30-
['.css', 'text/css'],
31-
['.dcr', 'application/x-director'],
32-
['.dir', 'application/x-director'],
33-
['.dms', 'application/octet-stream'],
34-
['.doc', 'application/msword'],
35-
['.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
36-
['.dot', 'application/msword'],
37-
['.drw', 'application/drafting'],
38-
['.dvi', 'application/x-dvi'],
39-
['.dwg', 'application/acad'],
40-
['.dxf', 'application/dxf'],
41-
['.dxr', 'application/x-director'],
42-
['.eps', 'application/postscript'],
43-
['.etx', 'text/x-setext'],
44-
['.exe', 'application/octet-stream'],
45-
['.ez', 'application/andrew-inset'],
46-
['.f', 'text/plain'],
47-
['.f90', 'text/plain'],
48-
['.fli', 'video/x-fli'],
49-
['.gif', 'image/gif'],
50-
['.gtar', 'application/x-gtar'],
51-
['.gz', 'application/x-gzip'],
52-
['.h', 'text/plain'],
53-
['.hdf', 'application/x-hdf'],
54-
['.hh', 'text/plain'],
55-
['.hqx', 'application/mac-binhex40'],
56-
['.htm', 'text/html'],
57-
['.html', 'text/html'],
58-
['.ice', 'x-conference/x-cooltalk'],
59-
['.ief', 'image/ief'],
60-
['.iges', 'model/iges'],
61-
['.igs', 'model/iges'],
62-
['.ips', 'application/x-ipscript'],
63-
['.ipx', 'application/x-ipix'],
64-
['.jpe', 'image/jpeg'],
65-
['.jpeg', 'image/jpeg'],
66-
['.jpg', 'image/jpeg'],
67-
['.js', 'application/x-javascript'],
68-
['.json', 'application/json'],
69-
['.kar', 'audio/midi'],
70-
['.latex', 'application/x-latex'],
71-
['.lha', 'application/octet-stream'],
72-
['.lsp', 'application/x-lisp'],
73-
['.lzh', 'application/octet-stream'],
74-
['.m', 'text/plain'],
75-
['.m3u8', 'application/x-mpegURL'],
76-
['.man', 'application/x-troff-man'],
77-
['.me', 'application/x-troff-me'],
78-
['.mesh', 'model/mesh'],
79-
['.mid', 'audio/midi'],
80-
['.midi', 'audio/midi'],
81-
['.mime', 'www/mime'],
82-
['.mov', 'video/quicktime'],
83-
['.movie', 'video/x-sgi-movie'],
84-
['.mp2', 'audio/mpeg'],
85-
['.mp3', 'audio/mpeg'],
86-
['.mpe', 'video/mpeg'],
87-
['.mpeg', 'video/mpeg'],
88-
['.mpg', 'video/mpeg'],
89-
['.mpga', 'audio/mpeg'],
90-
['.ms', 'application/x-troff-ms'],
91-
['.msi', 'application/x-ole-storage'],
92-
['.msh', 'model/mesh'],
93-
['.nc', 'application/x-netcdf'],
94-
['.oda', 'application/oda'],
95-
['.pbm', 'image/x-portable-bitmap'],
96-
['.pdb', 'chemical/x-pdb'],
97-
['.pdf', 'application/pdf'],
98-
['.pgm', 'image/x-portable-graymap'],
99-
['.pgn', 'application/x-chess-pgn'],
100-
['.png', 'image/png'],
101-
['.pnm', 'image/x-portable-anymap'],
102-
['.pot', 'application/mspowerpoint'],
103-
['.ppm', 'image/x-portable-pixmap'],
104-
['.pps', 'application/mspowerpoint'],
105-
['.ppt', 'application/mspowerpoint'],
106-
['.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],
107-
['.ppz', 'application/mspowerpoint'],
108-
['.pre', 'application/x-freelance'],
109-
['.prt', 'application/pro_eng'],
110-
['.ps', 'application/postscript'],
111-
['.qt', 'video/quicktime'],
112-
['.ra', 'audio/x-realaudio'],
113-
['.ram', 'audio/x-pn-realaudio'],
114-
['.ras', 'image/cmu-raster'],
115-
['.rgb', 'image/x-rgb'],
116-
['.rm', 'audio/x-pn-realaudio'],
117-
['.roff', 'application/x-troff'],
118-
['.rpm', 'audio/x-pn-realaudio-plugin'],
119-
['.rtf', 'text/rtf'],
120-
['.rtx', 'text/richtext'],
121-
['.scm', 'application/x-lotusscreencam'],
122-
['.set', 'application/set'],
123-
['.sgm', 'text/sgml'],
124-
['.sgml', 'text/sgml'],
125-
['.sh', 'application/x-sh'],
126-
['.shar', 'application/x-shar'],
127-
['.silo', 'model/mesh'],
128-
['.sit', 'application/x-stuffit'],
129-
['.skd', 'application/x-koan'],
130-
['.skm', 'application/x-koan'],
131-
['.skp', 'application/x-koan'],
132-
['.skt', 'application/x-koan'],
133-
['.smi', 'application/smil'],
134-
['.smil', 'application/smil'],
135-
['.snd', 'audio/basic'],
136-
['.sol', 'application/solids'],
137-
['.spl', 'application/x-futuresplash'],
138-
['.src', 'application/x-wais-source'],
139-
['.step', 'application/STEP'],
140-
['.stl', 'application/SLA'],
141-
['.stp', 'application/STEP'],
142-
['.sv4cpio', 'application/x-sv4cpio'],
143-
['.sv4crc', 'application/x-sv4crc'],
144-
['.svg', 'image/svg+xml'],
145-
['.swf', 'application/x-shockwave-flash'],
146-
['.t', 'application/x-troff'],
147-
['.tar', 'application/x-tar'],
148-
['.tcl', 'application/x-tcl'],
149-
['.tex', 'application/x-tex'],
150-
['.tif', 'image/tiff'],
151-
['.tiff', 'image/tiff'],
152-
['.tr', 'application/x-troff'],
153-
['.ts', 'video/MP2T'],
154-
['.tsi', 'audio/TSP-audio'],
155-
['.tsp', 'application/dsptype'],
156-
['.tsv', 'text/tab-separated-values'],
157-
['.txt', 'text/plain'],
158-
['.unv', 'application/i-deas'],
159-
['.ustar', 'application/x-ustar'],
160-
['.vcd', 'application/x-cdlink'],
161-
['.vda', 'application/vda'],
162-
['.vrml', 'model/vrml'],
163-
['.wasm', 'application/wasm'],
164-
['.wav', 'audio/x-wav'],
165-
['.wrl', 'model/vrml'],
166-
['.xbm', 'image/x-xbitmap'],
167-
['.xlc', 'application/vnd.ms-excel'],
168-
['.xll', 'application/vnd.ms-excel'],
169-
['.xlm', 'application/vnd.ms-excel'],
170-
['.xls', 'application/vnd.ms-excel'],
171-
['.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
172-
['.xlw', 'application/vnd.ms-excel'],
173-
['.xml', 'text/xml'],
174-
['.xpm', 'image/x-xpixmap'],
175-
['.xwd', 'image/x-xwindowdump'],
176-
['.xyz', 'chemical/x-pdb'],
177-
['.zip', 'application/zip'],
178-
['.m4v', 'video/x-m4v'],
179-
['.webm', 'video/webm'],
180-
['.ogv', 'video/ogv'],
181-
['.xap', 'application/x-silverlight-app'],
182-
['.mp4', 'video/mp4'],
183-
['.wmv', 'video/x-ms-wmv']
184-
])
185-
1868
export async function testBucketExists(s3Client: S3, bucketName: string): Promise<boolean> {
1879
try {
18810
await s3Client.headBucket({ Bucket: bucketName }).promise()

src/tasks/S3Upload/TaskOperations.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55

66
import * as S3 from 'aws-sdk/clients/s3'
77
import * as tl from 'azure-pipelines-task-lib/task'
8-
import { knownMimeTypes, testBucketExists } from 'lib/s3'
8+
import { testBucketExists } from 'lib/s3'
99
import * as fs from 'fs'
10+
import { lookup } from 'mime-types'
1011
import * as path from 'path'
1112
import {
1213
awsKeyManagementValue,
@@ -171,11 +172,11 @@ export class TaskOperations {
171172
if (!stats.isDirectory()) {
172173
const fileBuffer = fs.createReadStream(matchedFile)
173174
try {
174-
let contentType: string | undefined
175+
let contentType: string | false
175176
if (this.taskParameters.contentType) {
176177
contentType = this.taskParameters.contentType
177178
} else {
178-
contentType = knownMimeTypes.get(path.extname(matchedFile))
179+
contentType = lookup(path.extname(matchedFile))
179180
if (!contentType) {
180181
contentType = 'application/octet-stream'
181182
}

tests/resources/mimeTypes/.nomimetype

Whitespace-only changes.

tests/resources/mimeTypes/msdownload.bat

Whitespace-only changes.

tests/resources/mimeTypes/text.txt

Whitespace-only changes.

0 commit comments

Comments
 (0)