Skip to content

Commit 5d19e0d

Browse files
committed
Survive parser panic when watching a file
1 parent a4b44b1 commit 5d19e0d

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
- Be more resilient to parser panics when using `--watch`
89
- Update Docker build to use Go 1.12 and Go modules.
910
- Enhance example-from-schema generation code. Support enums, string formats,
1011
array and object examples, min/max and min items.

apisprout.go

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -215,14 +215,22 @@ func getExample(negotiator *ContentNegotiator, prefer string, op *openapi3.Opera
215215
}
216216

217217
// Load the OpenAPI document and create the router.
218-
func load(uri string, data []byte) (*openapi3.Swagger, *openapi3filter.Router) {
218+
func load(uri string, data []byte) (swagger *openapi3.Swagger, router *openapi3filter.Router, err error) {
219+
defer func() {
220+
if r := recover(); r != nil {
221+
swagger = nil
222+
router = nil
223+
err = fmt.Errorf("Caught panic while trying to load")
224+
}
225+
}()
226+
219227
loader := openapi3.NewSwaggerLoader()
220228
loader.IsExternalRefsAllowed = true
221229

222230
swagger, err := loader.LoadSwaggerFromData(data)
223231

224232
if err != nil {
225-
log.Fatal(err)
233+
return
226234
}
227235

228236
if !viper.GetBool("validate-server") {
@@ -232,9 +240,9 @@ func load(uri string, data []byte) (*openapi3.Swagger, *openapi3filter.Router) {
232240
}
233241

234242
// Create a new router using the OpenAPI document's declared paths.
235-
var router = openapi3filter.NewRouter().WithSwagger(swagger)
243+
router = openapi3filter.NewRouter().WithSwagger(swagger)
236244

237-
return swagger, router
245+
return
238246
}
239247

240248
// server loads an OpenAPI file and runs a mock server using the paths and
@@ -297,7 +305,12 @@ func server(cmd *cobra.Command, args []string) {
297305
log.Fatal(err)
298306
}
299307

300-
swagger, router = load(uri, data)
308+
if s, r, err := load(uri, data); err == nil {
309+
swagger = s
310+
router = r
311+
} else {
312+
log.Printf("ERROR: Unable to load OpenAPI document: %s", err)
313+
}
301314
}
302315
case err, ok := <-watcher.Errors:
303316
if !ok {
@@ -312,7 +325,10 @@ func server(cmd *cobra.Command, args []string) {
312325
}
313326
}
314327

315-
swagger, router = load(uri, data)
328+
swagger, router, err = load(uri, data)
329+
if err != nil {
330+
log.Fatal(err)
331+
}
316332

317333
if strings.HasPrefix(uri, "http") {
318334
http.HandleFunc("/__reload", func(w http.ResponseWriter, r *http.Request) {
@@ -332,7 +348,12 @@ func server(cmd *cobra.Command, args []string) {
332348
w.Write([]byte("error while parsing"))
333349
return
334350
}
335-
swagger, router = load(uri, data)
351+
352+
if s, r, err := load(uri, data); err == nil {
353+
swagger = s
354+
router = r
355+
}
356+
336357
w.WriteHeader(200)
337358
w.Write([]byte("reloaded"))
338359
log.Printf("Reloaded from %s", uri)

0 commit comments

Comments
 (0)