mirror of
https://github.com/gotenberg/gotenberg.git
synced 2026-08-17 12:42:16 +01:00
webhook: resulting file was deleted because of defer outside of goroutine
This commit is contained in:
@@ -87,11 +87,12 @@ func newContext(r *resource) (context.Context, context.CancelFunc) {
|
|||||||
func print(c echo.Context, p printer.Printer, r *resource) error {
|
func print(c echo.Context, p printer.Printer, r *resource) error {
|
||||||
baseFilename, err := rand.Get()
|
baseFilename, err := rand.Get()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("getting result file name: %v", err)
|
return hijackErr(fmt.Errorf("getting result file name: %v", err), r)
|
||||||
}
|
}
|
||||||
filename := fmt.Sprintf("%s.pdf", baseFilename)
|
filename := fmt.Sprintf("%s.pdf", baseFilename)
|
||||||
fpath := fmt.Sprintf("%s/%s", r.dirPath, filename)
|
fpath := fmt.Sprintf("%s/%s", r.dirPath, filename)
|
||||||
if r.webhookURL() == "" {
|
if r.webhookURL() == "" {
|
||||||
|
defer r.removeAll()
|
||||||
// if no webhook URL given, run conversion
|
// if no webhook URL given, run conversion
|
||||||
// and directly return the resulting PDF file
|
// and directly return the resulting PDF file
|
||||||
// or an error.
|
// or an error.
|
||||||
@@ -104,6 +105,7 @@ func print(c echo.Context, p printer.Printer, r *resource) error {
|
|||||||
// run the following lines in a goroutine so that
|
// run the following lines in a goroutine so that
|
||||||
// it doesn't block.
|
// it doesn't block.
|
||||||
go func() {
|
go func() {
|
||||||
|
defer r.removeAll()
|
||||||
if err := p.Print(fpath); err != nil {
|
if err := p.Print(fpath); err != nil {
|
||||||
c.Logger().Errorf("%v", err)
|
c.Logger().Errorf("%v", err)
|
||||||
return
|
return
|
||||||
@@ -123,3 +125,10 @@ func print(c echo.Context, p printer.Printer, r *resource) error {
|
|||||||
}()
|
}()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func hijackErr(err error, r *resource) error {
|
||||||
|
if r != nil {
|
||||||
|
defer r.removeAll()
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ import (
|
|||||||
func convertHTML(c echo.Context) error {
|
func convertHTML(c echo.Context) error {
|
||||||
r, err := newResource(c)
|
r, err := newResource(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
defer r.removeAll()
|
|
||||||
ctx, cancel := newContext(r)
|
ctx, cancel := newContext(r)
|
||||||
if cancel != nil {
|
if cancel != nil {
|
||||||
defer cancel()
|
defer cancel()
|
||||||
@@ -18,26 +17,26 @@ func convertHTML(c echo.Context) error {
|
|||||||
p := &printer.HTML{Context: ctx}
|
p := &printer.HTML{Context: ctx}
|
||||||
indexPath, err := r.filePath("index.html")
|
indexPath, err := r.filePath("index.html")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
p.WithLocalURL(indexPath)
|
p.WithLocalURL(indexPath)
|
||||||
headerPath, _ := r.filePath("header.html")
|
headerPath, _ := r.filePath("header.html")
|
||||||
if err := p.WithHeaderFile(headerPath); err != nil {
|
if err := p.WithHeaderFile(headerPath); err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
footerPath, _ := r.filePath("footer.html")
|
footerPath, _ := r.filePath("footer.html")
|
||||||
if err := p.WithFooterFile(footerPath); err != nil {
|
if err := p.WithFooterFile(footerPath); err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
paperSize, err := r.paperSize()
|
paperSize, err := r.paperSize()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
p.PaperWidth = paperSize[0]
|
p.PaperWidth = paperSize[0]
|
||||||
p.PaperHeight = paperSize[1]
|
p.PaperHeight = paperSize[1]
|
||||||
paperMargins, err := r.paperMargins()
|
paperMargins, err := r.paperMargins()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
p.MarginTop = paperMargins[0]
|
p.MarginTop = paperMargins[0]
|
||||||
p.MarginBottom = paperMargins[1]
|
p.MarginBottom = paperMargins[1]
|
||||||
@@ -45,7 +44,7 @@ func convertHTML(c echo.Context) error {
|
|||||||
p.MarginRight = paperMargins[3]
|
p.MarginRight = paperMargins[3]
|
||||||
landscape, err := r.landscape()
|
landscape, err := r.landscape()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
p.Landscape = landscape
|
p.Landscape = landscape
|
||||||
return print(c, p, r)
|
return print(c, p, r)
|
||||||
|
|||||||
@@ -8,35 +8,34 @@ import (
|
|||||||
func convertMarkdown(c echo.Context) error {
|
func convertMarkdown(c echo.Context) error {
|
||||||
r, err := newResource(c)
|
r, err := newResource(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
defer r.removeAll()
|
|
||||||
ctx, cancel := newContext(r)
|
ctx, cancel := newContext(r)
|
||||||
if cancel != nil {
|
if cancel != nil {
|
||||||
defer cancel()
|
defer cancel()
|
||||||
}
|
}
|
||||||
indexPath, err := r.filePath("index.html")
|
indexPath, err := r.filePath("index.html")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
p := &printer.Markdown{Context: ctx, TemplatePath: indexPath}
|
p := &printer.Markdown{Context: ctx, TemplatePath: indexPath}
|
||||||
headerPath, _ := r.filePath("header.html")
|
headerPath, _ := r.filePath("header.html")
|
||||||
if err := p.WithHeaderFile(headerPath); err != nil {
|
if err := p.WithHeaderFile(headerPath); err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
footerPath, _ := r.filePath("footer.html")
|
footerPath, _ := r.filePath("footer.html")
|
||||||
if err := p.WithFooterFile(footerPath); err != nil {
|
if err := p.WithFooterFile(footerPath); err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
paperSize, err := r.paperSize()
|
paperSize, err := r.paperSize()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
p.PaperWidth = paperSize[0]
|
p.PaperWidth = paperSize[0]
|
||||||
p.PaperHeight = paperSize[1]
|
p.PaperHeight = paperSize[1]
|
||||||
paperMargins, err := r.paperMargins()
|
paperMargins, err := r.paperMargins()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
p.MarginTop = paperMargins[0]
|
p.MarginTop = paperMargins[0]
|
||||||
p.MarginBottom = paperMargins[1]
|
p.MarginBottom = paperMargins[1]
|
||||||
@@ -44,7 +43,7 @@ func convertMarkdown(c echo.Context) error {
|
|||||||
p.MarginRight = paperMargins[3]
|
p.MarginRight = paperMargins[3]
|
||||||
landscape, err := r.landscape()
|
landscape, err := r.landscape()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
p.Landscape = landscape
|
p.Landscape = landscape
|
||||||
return print(c, p, r)
|
return print(c, p, r)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@@ -13,20 +14,23 @@ import (
|
|||||||
func merge(c echo.Context) error {
|
func merge(c echo.Context) error {
|
||||||
r, err := newResource(c)
|
r, err := newResource(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
defer r.removeAll()
|
|
||||||
fpaths, err := r.filePaths([]string{".pdf"})
|
fpaths, err := r.filePaths([]string{".pdf"})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
|
}
|
||||||
|
if len(fpaths) == 0 {
|
||||||
|
return hijackErr(errors.New("no suitable PDF files to merge"), r)
|
||||||
}
|
}
|
||||||
baseFilename, err := rand.Get()
|
baseFilename, err := rand.Get()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("getting result file name: %v", err)
|
return hijackErr(fmt.Errorf("getting result file name: %v", err), r)
|
||||||
}
|
}
|
||||||
filename := fmt.Sprintf("%s.pdf", baseFilename)
|
filename := fmt.Sprintf("%s.pdf", baseFilename)
|
||||||
fpath := fmt.Sprintf("%s/%s", r.dirPath, filename)
|
fpath := fmt.Sprintf("%s/%s", r.dirPath, filename)
|
||||||
if r.webhookURL() == "" {
|
if r.webhookURL() == "" {
|
||||||
|
defer r.removeAll()
|
||||||
// if no webhook URL given, run merge
|
// if no webhook URL given, run merge
|
||||||
// and directly return the resulting PDF file
|
// and directly return the resulting PDF file
|
||||||
// or an error.
|
// or an error.
|
||||||
@@ -39,6 +43,7 @@ func merge(c echo.Context) error {
|
|||||||
// run the following lines in a goroutine so that
|
// run the following lines in a goroutine so that
|
||||||
// it doesn't block.
|
// it doesn't block.
|
||||||
go func() {
|
go func() {
|
||||||
|
defer r.removeAll()
|
||||||
if err := printer.Merge(fpaths, fpath); err != nil {
|
if err := printer.Merge(fpaths, fpath); err != nil {
|
||||||
c.Logger().Errorf("%v", err)
|
c.Logger().Errorf("%v", err)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -24,30 +24,29 @@ var officeExts = []string{
|
|||||||
func convertOffice(c echo.Context) error {
|
func convertOffice(c echo.Context) error {
|
||||||
r, err := newResource(c)
|
r, err := newResource(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
defer r.removeAll()
|
|
||||||
ctx, cancel := newContext(r)
|
ctx, cancel := newContext(r)
|
||||||
if cancel != nil {
|
if cancel != nil {
|
||||||
defer cancel()
|
defer cancel()
|
||||||
}
|
}
|
||||||
fpaths, err := r.filePaths(officeExts)
|
fpaths, err := r.filePaths(officeExts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
if len(fpaths) == 0 {
|
if len(fpaths) == 0 {
|
||||||
return errors.New("no suitable office documents to convert")
|
return hijackErr(errors.New("no suitable office documents to convert"), r)
|
||||||
}
|
}
|
||||||
p := &printer.Office{Context: ctx, FilePaths: fpaths}
|
p := &printer.Office{Context: ctx, FilePaths: fpaths}
|
||||||
paperSize, err := r.paperSize()
|
paperSize, err := r.paperSize()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
p.PaperWidth = paperSize[0]
|
p.PaperWidth = paperSize[0]
|
||||||
p.PaperHeight = paperSize[1]
|
p.PaperHeight = paperSize[1]
|
||||||
landscape, err := r.landscape()
|
landscape, err := r.landscape()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return hijackErr(err, r)
|
||||||
}
|
}
|
||||||
p.Landscape = landscape
|
p.Landscape = landscape
|
||||||
return print(c, p, r)
|
return print(c, p, r)
|
||||||
|
|||||||
@@ -49,17 +49,17 @@ func newResource(c echo.Context) (*resource, error) {
|
|||||||
r := &resource{values: v, dirPath: dirPath}
|
r := &resource{values: v, dirPath: dirPath}
|
||||||
form, err := c.MultipartForm()
|
form, err := c.MultipartForm()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("getting multipart form: %v", err)
|
return r, fmt.Errorf("getting multipart form: %v", err)
|
||||||
}
|
}
|
||||||
for _, files := range form.File {
|
for _, files := range form.File {
|
||||||
for _, fh := range files {
|
for _, fh := range files {
|
||||||
in, err := fh.Open()
|
in, err := fh.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%s: opening file: %v", fh.Filename, err)
|
return r, fmt.Errorf("%s: opening file: %v", fh.Filename, err)
|
||||||
}
|
}
|
||||||
defer in.Close()
|
defer in.Close()
|
||||||
if err := r.writeFile(fh.Filename, in); err != nil {
|
if err := r.writeFile(fh.Filename, in); err != nil {
|
||||||
return nil, err
|
return r, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user