execute handles the actual processing logic
()
| 34 | |
| 35 | // execute handles the actual processing logic |
| 36 | func (r *request) execute() *server.Error { |
| 37 | outFormat := options.Get(r.opts, keys.Format, imagetype.Unknown) |
| 38 | |
| 39 | // Check if we can save the resulting image |
| 40 | canSave := vips.SupportsSave(outFormat) || |
| 41 | outFormat == imagetype.Unknown || |
| 42 | outFormat == imagetype.SVG |
| 43 | |
| 44 | if !canSave { |
| 45 | return server.NewError(handlers.NewCantSaveError(outFormat), handlers.ErrCategoryPathParsing) |
| 46 | } |
| 47 | |
| 48 | ctx := r.req.Context() |
| 49 | |
| 50 | // Acquire worker |
| 51 | releaseWorker, err := r.acquireWorker() |
| 52 | if err != nil { |
| 53 | return server.NewError(err, handlers.ErrCategoryQueue) |
| 54 | } |
| 55 | defer releaseWorker() |
| 56 | |
| 57 | // Deal with processing image counter |
| 58 | r.Monitoring().Stats().IncImagesInProgress() |
| 59 | defer r.Monitoring().Stats().DecImagesInProgress() |
| 60 | |
| 61 | // Response status code is OK by default |
| 62 | statusCode := http.StatusOK |
| 63 | |
| 64 | // Request headers |
| 65 | imgRequestHeaders := r.makeImageRequestHeaders() |
| 66 | |
| 67 | // create download options |
| 68 | do, err := r.makeDownloadOptions(imgRequestHeaders) |
| 69 | if err != nil { |
| 70 | return server.NewError(err, handlers.ErrCategoryDownload) |
| 71 | } |
| 72 | |
| 73 | // Fetch image actual |
| 74 | originData, originHeaders, err := r.fetchImage(do) |
| 75 | if originData != nil { |
| 76 | defer originData.Close() // if any originData has been opened, we need to close it |
| 77 | } |
| 78 | |
| 79 | // Check that image detection didn't take too long |
| 80 | if terr := server.CheckTimeout(ctx); terr != nil { |
| 81 | return server.NewError(terr, handlers.ErrCategoryTimeout) |
| 82 | } |
| 83 | |
| 84 | // Respond with NotModified if image was not modified |
| 85 | var nmErr fetcher.NotModifiedError |
| 86 | |
| 87 | if errors.As(err, &nmErr) { |
| 88 | r.rw.SetOriginHeaders(nmErr.Headers()) |
| 89 | r.ch.SetOriginHeaders(nmErr.Headers()) |
| 90 | |
| 91 | r.respondWithNotModified() |
| 92 | |
| 93 | return nil |
no test coverage detected