Skip to content

Commit 6f06029

Browse files
authored
Merge pull request #166 from nspassov/feature/uttype-for-content-type
2 parents 67105c3 + 1d52ca6 commit 6f06029

File tree

3 files changed

+56
-11
lines changed

3 files changed

+56
-11
lines changed

FlyingFox/Sources/Handlers/FileHTTPHandler.swift

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131

3232
import FlyingSocks
3333
import Foundation
34+
#if canImport(UniformTypeIdentifiers)
35+
import UniformTypeIdentifiers
36+
#endif
3437

3538
public struct FileHTTPHandler: HTTPHandler {
3639

@@ -48,8 +51,26 @@ public struct FileHTTPHandler: HTTPHandler {
4851
}
4952

5053
static func makeContentType(for filename: String) -> String {
51-
// TODO: UTTypeCreatePreferredIdentifierForTag / UTTypeCopyPreferredTagWithClass
5254
let pathExtension = (filename.lowercased() as NSString).pathExtension
55+
#if canImport(UniformTypeIdentifiers)
56+
if #available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) {
57+
switch pathExtension {
58+
case "wasm":
59+
return "application/wasm"
60+
case "properties":
61+
return "text/plain"
62+
default:
63+
return UTType(filenameExtension: pathExtension)?.preferredMIMEType ?? legacyMakeContentType(for: pathExtension)
64+
}
65+
} else {
66+
return legacyMakeContentType(for: pathExtension)
67+
}
68+
#else
69+
return legacyMakeContentType(for: pathExtension)
70+
#endif
71+
}
72+
73+
private static func legacyMakeContentType(for pathExtension: String) -> String {
5374
switch pathExtension {
5475
case "json":
5576
return "application/json"
@@ -58,27 +79,33 @@ public struct FileHTTPHandler: HTTPHandler {
5879
case "css":
5980
return "text/css"
6081
case "js", "javascript":
61-
return "application/javascript"
82+
return "text/javascript"
6283
case "png":
6384
return "image/png"
6485
case "jpeg", "jpg":
6586
return "image/jpeg"
66-
case "m4v", "mp4":
87+
case "mp4":
6788
return "video/mp4"
89+
case "m4v":
90+
return "video/x-m4v"
6891
case "pdf":
6992
return "application/pdf"
7093
case "svg":
7194
return "image/svg+xml"
7295
case "txt":
7396
return "text/plain"
7497
case "ico":
75-
return "image/x-icon"
98+
return "image/vnd.microsoft.icon"
7699
case "wasm":
77100
return "application/wasm"
78101
case "webp":
79102
return "image/webp"
80103
case "jp2":
81104
return "image/jp2"
105+
case "properties":
106+
return "text/plain"
107+
case "xml":
108+
return "application/xml"
82109
default:
83110
return "application/octet-stream"
84111
}

FlyingFox/Tests/Handlers/HTTPHandlerTests.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,10 @@ struct HTTPHandlerTests {
135135
FileHTTPHandler.makeContentType(for: "fish.css") == "text/css"
136136
)
137137
#expect(
138-
FileHTTPHandler.makeContentType(for: "fish.js") == "application/javascript"
138+
FileHTTPHandler.makeContentType(for: "fish.js") == "text/javascript"
139139
)
140140
#expect(
141-
FileHTTPHandler.makeContentType(for: "fish.javascript") == "application/javascript"
141+
FileHTTPHandler.makeContentType(for: "fish.javascript") == "text/javascript"
142142
)
143143
#expect(
144144
FileHTTPHandler.makeContentType(for: "fish.png") == "image/png"
@@ -162,10 +162,10 @@ struct HTTPHandlerTests {
162162
FileHTTPHandler.makeContentType(for: "fish.mp4") == "video/mp4"
163163
)
164164
#expect(
165-
FileHTTPHandler.makeContentType(for: "fish.m4v") == "video/mp4"
165+
FileHTTPHandler.makeContentType(for: "fish.m4v") == "video/x-m4v"
166166
)
167167
#expect(
168-
FileHTTPHandler.makeContentType(for: "fish.ico") == "image/x-icon"
168+
FileHTTPHandler.makeContentType(for: "fish.ico") == "image/vnd.microsoft.icon"
169169
)
170170
#expect(
171171
FileHTTPHandler.makeContentType(for: "fish.wasm") == "application/wasm"
@@ -176,6 +176,12 @@ struct HTTPHandlerTests {
176176
#expect(
177177
FileHTTPHandler.makeContentType(for: "fish.jp2") == "image/jp2"
178178
)
179+
#expect(
180+
FileHTTPHandler.makeContentType(for: "fish.properties") == "text/plain"
181+
)
182+
#expect(
183+
FileHTTPHandler.makeContentType(for: "fish.xml") == "application/xml"
184+
)
179185
#expect(
180186
FileHTTPHandler.makeContentType(for: "fish.somefile") == "application/octet-stream"
181187
)

FlyingFox/XCTests/Handlers/HTTPHandlerTests.swift

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,11 @@ final class HTTPHandlerTests: XCTestCase {
126126
)
127127
XCTAssertEqual(
128128
FileHTTPHandler.makeContentType(for: "fish.js"),
129-
"application/javascript"
129+
"text/javascript"
130130
)
131131
XCTAssertEqual(
132132
FileHTTPHandler.makeContentType(for: "fish.javascript"),
133-
"application/javascript"
133+
"text/javascript"
134134
)
135135
XCTAssertEqual(
136136
FileHTTPHandler.makeContentType(for: "fish.png"),
@@ -154,7 +154,7 @@ final class HTTPHandlerTests: XCTestCase {
154154
)
155155
XCTAssertEqual(
156156
FileHTTPHandler.makeContentType(for: "fish.ico"),
157-
"image/x-icon"
157+
"image/vnd.microsoft.icon"
158158
)
159159
XCTAssertEqual(
160160
FileHTTPHandler.makeContentType(for: "fish.wasm"),
@@ -168,6 +168,18 @@ final class HTTPHandlerTests: XCTestCase {
168168
FileHTTPHandler.makeContentType(for: "fish.jp2"),
169169
"image/jp2"
170170
)
171+
XCTAssertEqual(
172+
FileHTTPHandler.makeContentType(for: "fish.m4v"),
173+
"video/x-m4v"
174+
)
175+
XCTAssertEqual(
176+
FileHTTPHandler.makeContentType(for: "fish.properties"),
177+
"text/plain"
178+
)
179+
XCTAssertEqual(
180+
FileHTTPHandler.makeContentType(for: "fish.xml"),
181+
"application/xml"
182+
)
171183
XCTAssertEqual(
172184
FileHTTPHandler.makeContentType(for: "fish.somefile"),
173185
"application/octet-stream"

0 commit comments

Comments
 (0)