10000 Return error from handler · coder/coder@8343923 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8343923

Browse files
committed
Return error from handler
1 parent 19fcfac commit 8343923

File tree

3 files changed

+53
-27
lines changed

3 files changed

+53
-27
lines changed

site/embed.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,15 @@ func Handler(logger slog.Logger) http.Handler {
4141
}
4242
}
4343

44-
nextRouterHandler := nextrouter.Handler(filesystem, &nextrouter.Options{
44+
nextRouterHandler, err := nextrouter.Handler(filesystem, &nextrouter.Options{
4545
Logger: logger,
4646
TemplateDataFunc: templateFunc,
4747
})
48+
if err != nil {
49+
// There was an error setting up our file system handler.
50+
// This likely means a problem with our embedded file system.
51+
panic(err)
52+
}
4853
return secureHeaders(nextRouterHandler)
4954
}
5055

site/nextrouter/nextrouter.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ type HTMLTemplateHandler func(*http.Request) interface{}
3333
//
3434
// 1) If a file is of the form `[org]`, it's a dynamic route for a single-parameter
3535
// 2) If a file is of the form `[[...any]]`, it's a dynamic route for any parameters
36-
func Handler(fileSystem fs.FS, options *Options) http.Handler {
36+
func Handler(fileSystem fs.FS, options *Options) (http.Handler, error) {
3737
if options == nil {
3838
options = &Options{
3939
Logger: slog.Logger{},
@@ -43,7 +43,10 @@ func Handler(fileSystem fs.FS, options *Options) http.Handler {
4343
router := chi.NewRouter()
4444

4545
// Build up a router that matches NextJS routing rules, for HTML files
46-
registerRoutes(router, fileSystem, *options)
46+
err := registerRoutes(router, fileSystem, *options)
47+
if err != nil {
48+
return nil, err
49+
}
4750

4851
// Fallback to static file server for non-HTML files
4952
// Non-HTML files don't have special routing rules, so we can just leverage
@@ -52,22 +55,21 @@ func Handler(fileSystem fs.FS, options *Options) http.Handler {
5255
router.NotFound(fileHandler.ServeHTTP)
5356

5457
// Finally, if there is a 404.html available, serve that
55-
err := register404(fileSystem, router, *options)
56-
if (err != nil) {
58+
err = register404(fileSystem, router, *options)
59+
if err != nil {
5760
// An error may be expected if a 404.html is not present
5861
options.Logger.Warn(context.Background(), "Unable to find 404.html", slog.Error(err))
5962
}
6063

61-
return router
64+
return router, nil
6265
}
6366

6467
// registerRoutes recursively traverses the file-system, building routes
6568
// as appropriate for respecting NextJS dynamic rules.
66-
func registerRoutes(rtr chi.Router, fileSystem fs.FS, options Options) {
69+
func registerRoutes(rtr chi.Router, fileSystem fs.FS, options Options) error {
6770
files, err := fs.ReadDir(fileSystem, ".")
6871
if err != nil {
69-
options.Logger.Warn(context.Background(), "Provided filesystem is empty; unable to build routes")
70-
return
72+
return err
7173
}
7274

7375
// Loop through everything in the current directory...
@@ -84,8 +86,7 @@ func registerRoutes(rtr chi.Router, fileSystem fs.FS, options Options) {
8486
// recursively calling `buildRouter`
8587
sub, err := fs.Sub(fileSystem, name)
8688
if err != nil {
87-
options.Logger.Error(context.Background(), "Unable to call fs.Sub on directory", slog.F("directory_name", name))
88-
continue
89+
return err
8990
}
9091

9192
// In the special case where the folder is dynamic,
@@ -98,9 +99,14 @@ func registerRoutes(rtr chi.Router, fileSystem fs.FS, options Options) {
9899

99100
options.Logger.Debug(context.Background(), "Registering route", slog.F("name", name), slog.F("routeName", routeName))
100101
rtr.Route("/"+routeName, func(r chi.Router) {
101-
registerRoutes(r, sub, options)
102+
err := registerRoutes(r, sub, options)
103+
if err != nil {
104+
options.Logger.Error(context.Background(), "Error registering route", slog.F("name", routeName), slog.Error(err))
105+
}
102106
})
103107
}
108+
109+
return nil
104110
}
105111

106112
// serveFile is responsible for serving up HTML files in our next router

site/nextrouter/nextrouter_test.go

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ func TestNextRouter(t *testing.T) {
2424
err := rootFS.WriteFile("test.html", []byte("test123"), 0755)
2525
require.NoError(t, err)
2626

27-
router := nextrouter.Handler(rootFS, nil)
27+
router, err := nextrouter.Handler(rootFS, nil)
28+
require.NoError(t, err)
2829
server := httptest.NewServer(router)
2930

3031
res, err := request(server, "/test.html")
@@ -46,7 +47,8 @@ func TestNextRouter(t *testing.T) {
4647
err = rootFS.WriteFile("folder.html", []byte("folderFile"), 0755)
4748
require.NoError(t, err)
4849

49-
router := nextrouter.Handler(rootFS, nil)
50+
router, err := nextrouter.Handler(rootFS, nil)
51+
require.NoError(t, err)
5052
server := httptest.NewServer(router)
5153

5254
res, err := request(server, "/folder/")
@@ -65,7 +67,8 @@ func TestNextRouter(t *testing.T) {
6567
err := rootFS.WriteFile("test.png", []byte("png-bytes"), 0755)
6668
require.NoError(t, err)
6769

68-
router := nextrouter.Handler(rootFS, nil)
70+
router, err := nextrouter.Handler(rootFS, nil)
71+
require.NoError(t, err)
6972
server := httptest.NewServer(router)
7073

7174
res, err := request(server, "/test.png")
@@ -85,7 +88,8 @@ func TestNextRouter(t *testing.T) {
8588
err := rootFS.WriteFile("test.html", []byte("test-no-extension"), 0755)
8689
require.NoError(t, err)
8790

88-
router := nextrouter.Handler(rootFS, nil)
91+
router, err := nextrouter.Handler(rootFS, nil)
92+
require.NoError(t, err)
8993
server := httptest.NewServer(router)
9094

9195
res, err := request(server, "/test")
@@ -104,7 +108,8 @@ func TestNextRouter(t *testing.T) {
104108
err := rootFS.WriteFile("index.html", []byte("test-root-index"), 0755)
105109
require.NoError(t, err)
106110

107-
router := nextrouter.Handler(rootFS, nil)
111+
router, err := nextrouter.Handler(rootFS, nil)
112+
require.NoError(t, err)
108113
server := httptest.NewServer(router)
109114

110115
res, err := request(server, "/")
@@ -128,7 +133,8 @@ func TestNextRouter(t *testing.T) {
128133
rootFS.WriteFile("test/a/b/c.html", []byte("test123"), 0755)
129134
require.NoError(t, err)
130135

131-
router := nextrouter.Handler(rootFS, nil)
136+
router, err := nextrouter.Handler(rootFS, nil)
137+
require.NoError(t, err)
132138
server := httptest.NewServer(router)
133139

134140
res, err := request(server, "/test/a/b/c.html")
@@ -155,7 +161,8 @@ func TestNextRouter(t *testing.T) {
155161
rootFS.WriteFile("test/a/b/c/index.html", []byte("test-abc-index"), 0755)
156162
require.NoError(t, err)
157163

158-
router := nextrouter.Handler(rootFS, nil)
164+
router, err := nextrouter.Handler(rootFS, nil)
165+
require.NoError(t, err)
159166
server := httptest.NewServer(router)
160167

161168
res, err := request(server, "/test/a/b/c")
@@ -175,7 +182,8 @@ func TestNextRouter(t *testing.T) {
175182
err := rootFS.WriteFile("test.html", []byte("test123"), 0755)
176183
require.NoError(t, err)
177184

178-
router := nextrouter.Handler(rootFS, nil)
185+
router, err := nextrouter.Handler(rootFS, nil)
186+
require.NoError(t, err)
179187
server := httptest.NewServer(router)
180188

181189
res, err := request(server, "/test-non-existent.html")
@@ -191,7 +199,8 @@ func TestNextRouter(t *testing.T) {
191199
err := rootFS.WriteFile("test.html", []byte("test123"), 0755)
192200
require.NoError(t, err)
193201

194-
router := nextrouter.Handler(rootFS, nil)
202+
router, err := nextrouter.Handler(rootFS, nil)
203+
require.NoError(t, err)
195204
server := httptest.NewServer(router)
196205

197206
res, err := request(server, "/test-non-existent.html")
@@ -207,7 +216,8 @@ func TestNextRouter(t *testing.T) {
207216
err := rootFS.WriteFile("404.html", []byte("404 custom content"), 0755)
208217
require.NoError(t, err)
209218

210-
router := nextrouter.Handler(rootFS, nil)
219+
router, err := nextrouter.Handler(rootFS, nil)
220+
require.NoError(t, err)
211221
server := httptest.NewServer(router)
212222

213223
res, err := request(server, "/test-non-existent.html")
@@ -227,7 +237,8 @@ func TestNextRouter(t *testing.T) {
227237
err = rootFS.WriteFile("folder/[orgs].html", []byte("test-dynamic-path"), 0755)
228238
require.NoError(t, err)
229239

230-
router := nextrouter.Handler(rootFS, nil)
240+
router, err := nextrouter.Handler(rootFS, nil)
241+
require.NoError(t, err)
231242
server := httptest.NewServer(router)
232243

233244
res, err := request(server, "/folder/org-1")
@@ -248,7 +259,8 @@ func TestNextRouter(t *testing.T) {
248259
err = rootFS.WriteFile("folder/[org]/[project]/create.html", []byte("test-create"), 0755)
249260
require.NoError(t, err)
250261

251-
router := nextrouter.Handler(rootFS, nil)
262+
router, err := nextrouter.Handler(rootFS, nil)
263+
require.NoError(t, err)
252264
server := httptest.NewServer(router)
253265

254266
res, err := request(server, "/folder/org-1/project-1/create")
@@ -269,7 +281,8 @@ func TestNextRouter(t *testing.T) {
269281
err = rootFS.WriteFile("folder/[[...any]].html", []byte("test-catch-all"), 0755)
270282
require.NoError(t, err)
271283

272-
router := nextrouter.Handler(rootFS, nil)
284+
router, err := nextrouter.Handler(rootFS, nil)
285+
require.NoError(t, err)
273286
server := httptest.NewServer(router)
274287

275288
res, err := request(server, "/folder/org-1/project-1/random")
@@ -292,7 +305,8 @@ func TestNextRouter(t *testing.T) {
292305
err = rootFS.WriteFile("folder/create.html", []byte("test-create"), 0755)
293306
require.NoError(t, err)
294307

295-
router := nextrouter.Handler(rootFS, nil)
308+
router, err := nextrouter.Handler(rootFS, nil)
309+
require.NoError(t, err)
296310
server := httptest.NewServer(router)
297311

298312
res, err := request(server, "/folder/create")
@@ -329,10 +343,11 @@ func TestNextRouter(t *testing.T) {
329343
}
330344
}
331345

332-
router := nextrouter.Handler(rootFS, &nextrouter.Options{
346+
router, err := nextrouter.Handler(rootFS, &nextrouter.Options{
333347
Logger: slog.Logger{},
334348
TemplateDataFunc: templateFunc,
335349
})
350+
require.NoError(t, err)
336351
server := httptest.NewServer(router)
337352

338353
res, err := request(server, "/test.html")

0 commit comments

Comments
 (0)
0