Skip to content

Commit e42b590

Browse files
committed
return a slightly nicer looking 404, and return 300 instead of 200 for disambiguation pages
1 parent 5a3c36b commit e42b590

File tree

59 files changed

+483
-331
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+483
-331
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
extension ServerResource
2+
{
3+
@frozen public
4+
struct Headers:Equatable, Hashable, Sendable
5+
{
6+
public
7+
var canonical:String?
8+
9+
@inlinable public
10+
init(canonical:String? = nil)
11+
{
12+
self.canonical = canonical
13+
}
14+
}
15+
}

Sources/HTTP/ServerResource.Results.swift

Lines changed: 0 additions & 27 deletions
This file was deleted.

Sources/HTTP/ServerResource.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import MD5
55
struct ServerResource:Equatable, Sendable
66
{
77
public
8-
let results:Results
8+
let headers:Headers
99
public
1010
var content:Content
1111
public
@@ -14,9 +14,9 @@ struct ServerResource:Equatable, Sendable
1414
var hash:MD5?
1515

1616
@inlinable public
17-
init(_ results:Results, content:Content, type:MediaType, hash:MD5? = nil)
17+
init(headers:Headers = .init(), content:Content, type:MediaType, hash:MD5? = nil)
1818
{
19-
self.results = results
19+
self.headers = headers
2020
self.content = content
2121
self.type = type
2222
self.hash = hash

Sources/HTTP/ServerResponse.swift

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@ import Media
33
@frozen public
44
enum ServerResponse:Equatable, Sendable
55
{
6-
case redirect(ServerRedirect, cookies:[Cookie] = [])
7-
case resource(ServerResource)
6+
case error (ServerResource)
7+
case forbidden (ServerResource)
8+
case ok (ServerResource)
9+
case multiple (ServerResource)
10+
case notFound (ServerResource)
11+
12+
case redirect (ServerRedirect, cookies:[Cookie] = [])
813
}
914
extension ServerResponse
1015
{
@@ -17,12 +22,16 @@ extension ServerResponse
1722
extension ServerResponse
1823
{
1924
@inlinable public
20-
var resource:ServerResource?
25+
var size:Int
2126
{
2227
switch self
2328
{
24-
case .redirect: return nil
25-
case .resource(let resource): return resource
29+
case .redirect: return 0
30+
case .error (let resource): return resource.content.size
31+
case .forbidden (let resource): return resource.content.size
32+
case .ok (let resource): return resource.content.size
33+
case .multiple (let resource): return resource.content.size
34+
case .notFound (let resource): return resource.content.size
2635
}
2736
}
2837
}

Sources/HTTPServer/Channels/ServerInterfaceHandler.swift

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -146,20 +146,13 @@ extension ServerInterfaceHandler
146146
switch $0
147147
{
148148
case .success(let response):
149-
switch response
150-
{
151-
case .redirect(let redirect, cookies: let cookies):
152-
self.send(message: .init(redirect: redirect, cookies: cookies),
153-
context: context)
154-
155-
case .resource(let resource):
156-
self.send(message: .init(resource: resource,
157-
using: context.channel.allocator),
158-
context: context)
159-
}
149+
self.send(
150+
message: .init(response: response, using: context.channel.allocator),
151+
context: context)
160152

161153
case .failure(let error):
162-
self.send(message: .init(redacting: error, using: context.channel.allocator),
154+
self.send(
155+
message: .init(redacting: error, using: context.channel.allocator),
163156
context: context)
164157
}
165158
}

Sources/HTTPServer/Channels/ServerMessage.swift

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,43 @@ struct ServerMessage<Authority> where Authority:ServerAuthority
2020
}
2121
extension ServerMessage
2222
{
23+
init(response:ServerResponse, using allocator:__shared ByteBufferAllocator)
24+
{
25+
switch response
26+
{
27+
case .redirect(let redirect, cookies: let cookies):
28+
self.init(redirect: redirect, cookies: cookies)
29+
30+
case .error(let resource):
31+
self.init(resource: resource, using: allocator, as: .internalServerError)
32+
33+
case .forbidden(let resource):
34+
self.init(resource: resource, using: allocator, as: .forbidden)
35+
36+
case .ok(let resource):
37+
self.init(resource: resource, using: allocator, as: .ok)
38+
39+
case .multiple(let resource):
40+
self.init(resource: resource, using: allocator, as: .multipleChoices)
41+
42+
case .notFound(let resource):
43+
self.init(resource: resource, using: allocator, as: .notFound)
44+
}
45+
}
46+
47+
init(redacting error:any Error, using allocator:__shared ByteBufferAllocator)
48+
{
49+
self.init(resource: .init(
50+
headers: .init(),
51+
content: .string(Authority.redact(error: error)),
52+
type: .text(.plain, charset: .utf8)),
53+
using: allocator,
54+
as: .internalServerError)
55+
}
56+
}
57+
extension ServerMessage
58+
{
59+
private
2360
init(redirect:ServerRedirect, cookies:[Cookie])
2461
{
2562
var headers:HTTPHeaders = .init()
@@ -43,38 +80,22 @@ extension ServerMessage
4380
self.init(headers: headers, status: status, body: nil)
4481
}
4582

46-
init(resource:ServerResource, using allocator:__shared ByteBufferAllocator)
83+
private
84+
init(resource:ServerResource,
85+
using allocator:__shared ByteBufferAllocator,
86+
as status:HTTPResponseStatus)
4787
{
4888
var headers:HTTPHeaders = .init()
4989

5090
headers.add(name: "host", value: Authority.domain)
5191

52-
let status:HTTPResponseStatus
53-
switch resource.results
92+
if let canonical:String = resource.headers.canonical
5493
{
55-
case .error:
56-
status = .internalServerError
57-
58-
case .forbidden:
59-
status = .forbidden
60-
61-
case .none:
62-
status = .notFound
63-
64-
case .many:
65-
status = .multipleChoices
66-
67-
case .one(canonical: let location):
68-
status = .ok
69-
70-
if let location:String
71-
{
72-
headers.add(name: "link", value: Authority.link(location, rel: .canonical))
73-
}
74-
if let hash:MD5 = resource.hash
75-
{
76-
headers.add(name: "etag", value: "\"\(hash)\"")
77-
}
94+
headers.add(name: "link", value: Authority.link(canonical, rel: .canonical))
95+
}
96+
if let hash:MD5 = resource.hash
97+
{
98+
headers.add(name: "etag", value: "\"\(hash)\"")
7899
}
79100

80101
let buffer:ByteBuffer?
@@ -101,7 +122,7 @@ extension ServerMessage
101122
headers.add(name: "content-length", value: "\(length)")
102123
headers.add(name: "content-type", value: "\(resource.type)")
103124

104-
if let buffer
125+
if let buffer:ByteBuffer
105126
{
106127
self.init(headers: headers, status: status, body: buffer)
107128
}
@@ -110,14 +131,6 @@ extension ServerMessage
110131
self.init(headers: headers, status: .notModified)
111132
}
112133
}
113-
114-
init(redacting error:any Error, using allocator:__shared ByteBufferAllocator)
115-
{
116-
self.init(resource: .init(.error,
117-
content: .string(Authority.redact(error: error)),
118-
type: .text(.plain, charset: .utf8)),
119-
using: allocator)
120-
}
121134
}
122135
extension ServerMessage
123136
{

Sources/UnidocPages/API/Site.API.Get.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ extension Site.API
77
case register
88
}
99
}
10-
extension Site.API.Get:FixedAPI
10+
extension Site.API.Get:StaticAPI
1111
{
1212
}

Sources/UnidocPages/API/Site.API.Post.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ extension Site.API
66
case index
77
}
88
}
9-
extension Site.API.Post:FixedAPI
9+
extension Site.API.Post:StaticAPI
1010
{
1111
}

Sources/UnidocPages/API/Site.API.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ extension Site
55
{
66
}
77
}
8-
extension Site.API:FixedRoot
8+
extension Site.API:StaticRoot
99
{
1010
@inlinable public static
1111
var root:String { "api" }

Sources/UnidocPages/API/Site.Asset.Get.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ extension Site.Asset
2525
case robots_txt = "robots.txt"
2626
}
2727
}
28-
extension Site.Asset.Get:FixedAPI
28+
extension Site.Asset.Get:StaticAPI
2929
{
3030
}

0 commit comments

Comments
 (0)