From cf20e2a5105fe2a293e8fd16fc37d5ddeb5b43e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8gh=20Fangel?= Date: Thu, 13 Jun 2019 14:50:05 +0200 Subject: [PATCH 001/107] adds possibility of specifying docker to repo image target --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b259902b..30627d03 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ GOLANG_VERSION=1.12 VERSION=snapshot DOCKER_USER= DOCKER_PASSWORD= +DOCKER_REPO=thecodingmachine # generate documentation. doc: @@ -27,7 +28,7 @@ tests: # build Docker image. image: docker build -t thecodingmachine/gotenberg:base -f build/base/Dockerfile . - docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) --build-arg VERSION=$(VERSION) -t thecodingmachine/gotenberg:$(VERSION) -f build/package/Dockerfile . + docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) --build-arg VERSION=$(VERSION) -t $(DOCKER_REPO)/gotenberg:$(VERSION) -f build/package/Dockerfile . # start the API using previously built Docker image. gotenberg: From ca41164980ab2d9fa820ea819b871944516bc96f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8gh=20Fangel?= Date: Thu, 13 Jun 2019 15:14:04 +0200 Subject: [PATCH 002/107] add dedicated gotenberg user to the base image, create the /gotenberg directory with gotenberg user as owner, updates base debian image to newest 9.* --- .dockerignore | 0 build/base/Dockerfile | 8 +++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..e69de29b diff --git a/build/base/Dockerfile b/build/base/Dockerfile index 102f6873..a4e44383 100644 --- a/build/base/Dockerfile +++ b/build/base/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:9.5-slim +FROM debian:9-slim # |-------------------------------------------------------------------------- # | Common libraries @@ -91,3 +91,9 @@ RUN apt-get install -y \ fonts-unfonts-core COPY build/base/fonts.conf /etc/fonts/conf.d/100-gotenberg.conf + +RUN groupadd --gid 1001 gotenberg \ + && useradd --uid 1001 --gid gotenberg --shell /bin/bash --no-create-home gotenberg \ + && mkdir /gotenberg \ + && chown gotenberg: /gotenberg + From 0fcbe821cdf7da27eed302fd9be5eb72c7b4be0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8gh=20Fangel?= Date: Thu, 13 Jun 2019 14:50:32 +0200 Subject: [PATCH 003/107] updates .gitignore and adds .dockerignore with irrelevant dirs for building images --- .dockerignore | 2 ++ .gitignore | 1 + 2 files changed, 3 insertions(+) diff --git a/.dockerignore b/.dockerignore index e69de29b..a3a0fce8 100644 --- a/.dockerignore +++ b/.dockerignore @@ -0,0 +1,2 @@ +scripts +test \ No newline at end of file diff --git a/.gitignore b/.gitignore index e69de29b..723ef36f 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file From cfea2b8d9decad54bfe18e2ed234c4b00515c909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8gh=20Fangel?= Date: Thu, 13 Jun 2019 15:15:41 +0200 Subject: [PATCH 004/107] updates Dockerfile for creating image to use the new dedicated user and sets PM2_HOME inside the /gotenberg dir to avoid permission problems --- build/package/Dockerfile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/build/package/Dockerfile b/build/package/Dockerfile index f9028a72..05fa13c0 100644 --- a/build/package/Dockerfile +++ b/build/package/Dockerfile @@ -19,7 +19,11 @@ ENV GOOS=linux \ WORKDIR /gotenberg # Copy our source code. -COPY . . +COPY internal ./internal +COPY cmd ./cmd +COPY go.sum go.sum +COPY go.mod go.mod + # Build our binary. RUN go build -o /gotenberg/gotenberg -ldflags "-X main.version=${VERSION}" cmd/gotenberg/main.go @@ -37,6 +41,8 @@ LABEL authors="Julien Neuhart " COPY --from=golang /gotenberg/gotenberg /usr/local/bin/ +ENV PM2_HOME=/gotenberg/.pm2 +USER gotenberg WORKDIR /gotenberg EXPOSE 3000 From bbd0a893b1467ec540e239bdedb9731199879b3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8gh=20Fangel?= Date: Thu, 13 Jun 2019 15:59:06 +0200 Subject: [PATCH 005/107] adds configurable debugging of startup of processes and print out some info from the chrome viable() function for debugging purposes --- cmd/gotenberg/main.go | 37 ++++++++++++---------------- internal/app/api/api.go | 5 ++-- internal/pkg/pm2/chrome.go | 22 +++++++++++++---- internal/pkg/pm2/chrome_test.go | 4 +-- internal/pkg/pm2/pm2.go | 42 ++++++++++++++++++++++++++++++++ internal/pkg/pm2/unoconv.go | 4 +-- internal/pkg/pm2/unoconv_test.go | 4 +-- 7 files changed, 83 insertions(+), 35 deletions(-) diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 0d7d7cea..dae9192e 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -25,6 +25,7 @@ const ( disableGoogleChromeEnvVar = "DISABLE_GOOGLE_CHROME" disableUnoconvEnvVar = "DISABLE_UNOCONV" disableHealthcheckLoggingEnvVar = "DISABLE_HEALTHCHECK_LOGGING" + debugProcessStartup = "DEBUG_PROCESS_STARTUP" ) func mustParseEnvVar() *api.Options { @@ -49,37 +50,31 @@ func mustParseEnvVar() *api.Options { } opts.DefaultListenPort = v } - if v, ok := os.LookupEnv(disableGoogleChromeEnvVar); ok { - if v != "1" && v != "0" { - notify.ErrPrint(fmt.Errorf("%s: wrong value: want \"0\" or \"1\" got %v", disableGoogleChromeEnvVar, v)) - os.Exit(1) + //checkBoolEnv is a convenience function for reading an env var with a bool value where `1` is true and `0` is false + checkBoolEnv := func(name string) bool { + if v, ok := os.LookupEnv(name); ok { + if v != "1" && v != "0" { + notify.ErrPrint(fmt.Errorf("%s: wrong value: want \"0\" or \"1\" got %v", name, v)) + os.Exit(1) + } + return v == "1" } - opts.EnableChromeEndpoints = v != "1" - } - if v, ok := os.LookupEnv(disableUnoconvEnvVar); ok { - if v != "1" && v != "0" { - notify.ErrPrint(fmt.Errorf("%s: wrong value: want \"0\" or \"1\" got %v", disableUnoconvEnvVar, v)) - os.Exit(1) - } - opts.EnableUnoconvEndpoints = v != "1" - } - if v, ok := os.LookupEnv(disableHealthcheckLoggingEnvVar); ok { - if v != "1" && v != "0" { - notify.ErrPrint(fmt.Errorf("%s: wrong value: want \"0\" or \"1\" got %v", disableHealthcheckLoggingEnvVar, v)) - os.Exit(1) - } - opts.EnableHealthcheckLogging = v != "1" + return false } + opts.EnableChromeEndpoints = !checkBoolEnv(disableGoogleChromeEnvVar) + opts.EnableUnoconvEndpoints = !checkBoolEnv(disableUnoconvEnvVar) + opts.EnableHealthcheckLogging = !checkBoolEnv(disableHealthcheckLoggingEnvVar) + opts.DebugProcessStartup = checkBoolEnv(debugProcessStartup) return opts } func mustStartProcesses(opts *api.Options) []pm2.Process { var processes []pm2.Process if opts.EnableChromeEndpoints { - processes = append(processes, pm2.NewChrome()) + processes = append(processes, pm2.NewChrome(opts.DebugProcessStartup)) } if opts.EnableUnoconvEndpoints { - processes = append(processes, pm2.NewUnoconv()) + processes = append(processes, pm2.NewUnoconv(opts.DebugProcessStartup)) } for _, p := range processes { notify.Printf("starting %s with PM2...", p.Fullname()) diff --git a/internal/app/api/api.go b/internal/app/api/api.go index 1edd6063..d00e01eb 100644 --- a/internal/app/api/api.go +++ b/internal/app/api/api.go @@ -1,8 +1,6 @@ package api -import ( - "github.com/labstack/echo/v4" -) +import "github.com/labstack/echo/v4" const pingEndpoint = "/ping" @@ -14,6 +12,7 @@ type Options struct { EnableChromeEndpoints bool EnableUnoconvEndpoints bool EnableHealthcheckLogging bool + DebugProcessStartup bool } // DefaultOptions returns default options. diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index dfcdc1f9..52326713 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -7,15 +7,19 @@ import ( "github.com/mafredri/cdp/devtool" ) +const ( + warmupTime = 10 * time.Second +) + type chrome struct { manager *processManager } // NewChrome retruns a Google Chrome // headless process. -func NewChrome() Process { +func NewChrome(debug bool) Process { return &chrome{ - manager: &processManager{}, + manager: &processManager{verbose: debug}, } } @@ -58,12 +62,20 @@ func (p *chrome) viable() bool { // check if Google Chrome is correctly running. ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, err := devtool.New("http://localhost:9222").Version(ctx) - return err == nil + p.manager.notifyf(`%v: checking Chrome liveness via debug version endpoint +'http://localhost:9222/json/version'`, p.name()) + v, err := devtool.New("http://localhost:9222").Version(ctx) + if err != nil { + p.manager.notifyf("%v: Chrome version endpoint returned error: %v", p.name(), err) + return false + } + p.manager.notifyf("%v: Chrome returned version info: %+v", p.name(), *v) + return true } func (p *chrome) warmup() { - time.Sleep(5 * time.Second) + p.manager.notifyf("%v: allowing Chrome %v to startup", p.name(), warmupTime) + time.Sleep(warmupTime) } // Compile-time checks to ensure type implements desired interfaces. diff --git a/internal/pkg/pm2/chrome_test.go b/internal/pkg/pm2/chrome_test.go index fa30c443..edb8b5af 100644 --- a/internal/pkg/pm2/chrome_test.go +++ b/internal/pkg/pm2/chrome_test.go @@ -7,13 +7,13 @@ import ( ) func TestChromeStart(t *testing.T) { - p := NewChrome() + p := NewChrome(false) err := p.Start() require.Nil(t, err) } func TestChromeShutdown(t *testing.T) { - p := NewChrome() + p := NewChrome(false) err := p.Shutdown() require.Nil(t, err) } diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go index c4cf937a..9fc253c4 100644 --- a/internal/pkg/pm2/pm2.go +++ b/internal/pkg/pm2/pm2.go @@ -1,8 +1,14 @@ package pm2 import ( + "bufio" "fmt" + "io" "os/exec" + "strings" + "time" + + "github.com/thecodingmachine/gotenberg/internal/pkg/notify" ) const ( @@ -25,6 +31,7 @@ type Process interface { type processManager struct { heuristicState int32 + verbose bool } func (m *processManager) start(p Process) error { @@ -76,8 +83,43 @@ func (m *processManager) pm2(p Process, cmdName string) error { "pm2", cmdArgs..., ) + m.notifyf("executing command '%v'", strings.Join(cmd.Args, " ")) + if m.verbose { + chromeStdErr, err := cmd.StderrPipe() + if err != nil { + return fmt.Errorf("failed getting Chrome stderr: %v", err) + } + chromeStdOut, err := cmd.StdoutPipe() + if err != nil { + return fmt.Errorf("failed getting Chrome stdout: %v", err) + } + readFromPipe := func(name string, reader io.ReadCloser) { + r := bufio.NewReader(reader) + defer reader.Close() + for { + line, _, err := r.ReadLine() + if err != nil { + if err != io.EOF { + m.notifyf("error reading from %v for process %v", name, p.name()) + } + break + } + if len(line) != 0 { + m.notifyf("%v %v: %s", p.name(), name, string(line)) + } + } + } + go readFromPipe("stdout", chromeStdOut) + go readFromPipe("stderr", chromeStdErr) + } if err := cmd.Start(); err != nil { return fmt.Errorf("%s %s with PM2: %v", cmdName, p.Fullname(), err) } return nil } + +func (m *processManager) notifyf(format string, args ...interface{}) { + if m.verbose { + notify.Printf(fmt.Sprintf("%v: %s", time.Now().Format(time.RFC3339), format), args...) + } +} diff --git a/internal/pkg/pm2/unoconv.go b/internal/pkg/pm2/unoconv.go index f2881010..7c4fa13e 100644 --- a/internal/pkg/pm2/unoconv.go +++ b/internal/pkg/pm2/unoconv.go @@ -6,9 +6,9 @@ type unoconv struct { // NewUnoconv retruns a unoconv listener // process. -func NewUnoconv() Process { +func NewUnoconv(debug bool) Process { return &unoconv{ - manager: &processManager{}, + manager: &processManager{verbose: debug}, } } diff --git a/internal/pkg/pm2/unoconv_test.go b/internal/pkg/pm2/unoconv_test.go index 8c74b244..6995109e 100644 --- a/internal/pkg/pm2/unoconv_test.go +++ b/internal/pkg/pm2/unoconv_test.go @@ -7,13 +7,13 @@ import ( ) func TestUnoconvStart(t *testing.T) { - p := NewUnoconv() + p := NewUnoconv(false) err := p.Start() require.Nil(t, err) } func TestUnoconvShutdown(t *testing.T) { - p := NewUnoconv() + p := NewUnoconv(false) err := p.Shutdown() require.Nil(t, err) } From c36c7144cb27b86e7b45747fd5698670182801cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8gh=20Fangel?= Date: Thu, 13 Jun 2019 15:46:17 +0200 Subject: [PATCH 006/107] updates documentation with info about new env var and dedicated user gotenberg --- build/docs/content/01-install.md | 9 ++++++++ .../docs/content/03-environment-variables.md | 15 ++++++++---- docs/index.html | 23 +++++++++++++++++-- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/build/docs/content/01-install.md b/build/docs/content/01-install.md index 03585a66..0437115c 100644 --- a/build/docs/content/01-install.md +++ b/build/docs/content/01-install.md @@ -10,6 +10,8 @@ You may start it with: $ docker run --rm -p 3000:3000 thecodingmachine/gotenberg:5 ``` +All processes in the docker container runs as a dedicated non-root user called `gotenberg` with user id `1001` from the working dir `/gotenberg`. + > The API will be available at [http://localhost:3000](http://localhost:3000). ## Docker Compose @@ -38,5 +40,12 @@ Otherwise the API will not be able to launch Google Chrome and LibreOffice (unoc > The more resources are granted, the quicker will be the conversions. +Also, in the deployment spec of the pod, specify the uid `1001` of the user `gotenberg`: +``` + securityContext: + privileged: false + runAsUser: 1001 +``` + In the following examples, we will assume your Gotenberg API is available at [http://localhost:3000](http://localhost:3000). \ No newline at end of file diff --git a/build/docs/content/03-environment-variables.md b/build/docs/content/03-environment-variables.md index 3f081d56..685cf91c 100644 --- a/build/docs/content/03-environment-variables.md +++ b/build/docs/content/03-environment-variables.md @@ -8,7 +8,7 @@ You may customize the API behaviour thanks to environment variables. In order to save some resources, the Gotenberg image accepts the environment variable `DISABLE_GOOGLE_CHROME`. -It takes the strings `"0"` or `"1"` as value. +It takes the strings `"0"` or `"1"` as value where `1` means `true` > If Google Chrome is disabled, the following conversions will **not** be available anymore: > [HTML](#html), [URL](#url) and [Markdown](#markdown) @@ -37,12 +37,19 @@ By default, the API will add a log entry when the [healthcheck endpoint](#ping) You may turn off this logging so as to avoid unnecessary entries in your logs with the environment variable `DISABLE_HEALTHCHECK_LOGGING`. -This environment variable operates in the same manner as the `DISABLE_GOOGLE_CHROME` and `DISABLE_UNOCONV` variables operate in that it accepts the strings `"0"` or `"1"` as values. - +This environment variable operates in the same manner as the `DISABLE_GOOGLE_CHROME` and `DISABLE_UNOCONV` variables operate in that it accepts the strings `"0"` or `"1"` as values, where `1` is enabled. ## Default listen port By default, the API will listen on port `3000`. For most use cases this is perfectly fine, but at times there may be cases where you need to change this due to port conflicts. You may customize this port location with the environment variable `DEFAULT_LISTEN_PORT`. -This environment variable accepts any string that can be turned into a port number (e.g., the string `"0"` up to the string `"65535"`). \ No newline at end of file +This environment variable accepts any string that can be turned into a port number (e.g., the string `"0"` up to the string `"65535"`). + +## Debug logging of process startup + +By default, stdout and stderr messages from the started processes are disabled. + +You may enable some debug logging from starting the process by setting the environment variable `DEBUG_PROCESS_STARTUP`. + +This environment variable operates in the same manner as the `DISABLE_GOOGLE_CHROME` and `DISABLE_UNOCONV` variables operate in that it accepts the strings `"0"` or `"1"` as values, where `1` means `true`. \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index bcf2fd81..fa8df116 100755 --- a/docs/index.html +++ b/docs/index.html @@ -139,6 +139,8 @@
$ docker run --rm -p 3000:3000 thecodingmachine/gotenberg:5
 
+

All processes in the docker container runs as a dedicated non-root user called gotenberg with user id 1001 from the working dir /gotenberg.

+

The API will be available at http://localhost:3000.

@@ -176,6 +178,13 @@ Otherwise the API will not be able to launch Google Chrome and LibreOffice (unoc

The more resources are granted, the quicker will be the conversions.

+

Also, in the deployment spec of the pod, specify the uid 1001 of the user gotenberg:

+ +
        securityContext:
+          privileged: false
+          runAsUser: 1001
+
+

In the following examples, we will assume your Gotenberg API is available at http://localhost:3000.

@@ -222,7 +231,7 @@ Gotenberg API is available at http://localhost:3

In order to save some resources, the Gotenberg image accepts the environment variable DISABLE_GOOGLE_CHROME.

-

It takes the strings "0" or "1" as value.

+

It takes the strings "0" or "1" as value where 1 means true

If Google Chrome is disabled, the following conversions will not be available anymore: @@ -263,7 +272,7 @@ See the timeout section.

You may turn off this logging so as to avoid unnecessary entries in your logs with the environment variable DISABLE_HEALTHCHECK_LOGGING.

-

This environment variable operates in the same manner as the DISABLE_GOOGLE_CHROME and DISABLE_UNOCONV variables operate in that it accepts the strings "0" or "1" as values.

+

This environment variable operates in the same manner as the DISABLE_GOOGLE_CHROME and DISABLE_UNOCONV variables operate in that it accepts the strings "0" or "1" as values, where 1 is enabled.

timeout section.

This environment variable accepts any string that can be turned into a port number (e.g., the string "0" up to the string "65535").

+

Debug logging of process startup

+ +

By default, stdout and stderr messages from the started processes are disabled.

+ +

You may enable some debug logging from starting the process by setting the environment variable DEBUG_PROCESS_STARTUP.

+ +

This environment variable operates in the same manner as the DISABLE_GOOGLE_CHROME and DISABLE_UNOCONV variables operate in that it accepts the strings "0" or "1" as values, where 1 means true.

+
From 6fa48c9222494df3055a4807c8e035ef1c9c4346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8gh=20Fangel?= Date: Mon, 17 Jun 2019 11:29:52 +0200 Subject: [PATCH 007/107] Apply suggestions from code review Co-Authored-By: Julien Neuhart --- build/base/Dockerfile | 7 +++++++ internal/pkg/pm2/chrome.go | 6 +++--- internal/pkg/pm2/pm2.go | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/build/base/Dockerfile b/build/base/Dockerfile index a4e44383..24ab4661 100644 --- a/build/base/Dockerfile +++ b/build/base/Dockerfile @@ -92,6 +92,13 @@ RUN apt-get install -y \ COPY build/base/fonts.conf /etc/fonts/conf.d/100-gotenberg.conf +# |-------------------------------------------------------------------------- +# | Default user +# |-------------------------------------------------------------------------- +# | +# | TODO find a correct description for why we're doing this. +# | + RUN groupadd --gid 1001 gotenberg \ && useradd --uid 1001 --gid gotenberg --shell /bin/bash --no-create-home gotenberg \ && mkdir /gotenberg \ diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index 52326713..105c76cc 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -66,15 +66,15 @@ func (p *chrome) viable() bool { 'http://localhost:9222/json/version'`, p.name()) v, err := devtool.New("http://localhost:9222").Version(ctx) if err != nil { - p.manager.notifyf("%v: Chrome version endpoint returned error: %v", p.name(), err) + p.manager.notifyf("%s: %s version endpoint returned error: %v", p.name(), p.Fullname(), err) return false } - p.manager.notifyf("%v: Chrome returned version info: %+v", p.name(), *v) + p.manager.notifyf("%s: %s returned version info: %+v", p.name(), p.Fullname(), *v) return true } func (p *chrome) warmup() { - p.manager.notifyf("%v: allowing Chrome %v to startup", p.name(), warmupTime) + p.manager.notifyf("%s: allowing %s %v to startup", p.name(), p.Fullname(), warmupTime) time.Sleep(warmupTime) } diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go index 9fc253c4..d8595cad 100644 --- a/internal/pkg/pm2/pm2.go +++ b/internal/pkg/pm2/pm2.go @@ -85,7 +85,7 @@ func (m *processManager) pm2(p Process, cmdName string) error { ) m.notifyf("executing command '%v'", strings.Join(cmd.Args, " ")) if m.verbose { - chromeStdErr, err := cmd.StderrPipe() + processStdErr, err := cmd.StderrPipe() if err != nil { return fmt.Errorf("failed getting Chrome stderr: %v", err) } @@ -95,7 +95,7 @@ func (m *processManager) pm2(p Process, cmdName string) error { } readFromPipe := func(name string, reader io.ReadCloser) { r := bufio.NewReader(reader) - defer reader.Close() + defer reader.Close() // nolint: errcheck for { line, _, err := r.ReadLine() if err != nil { From e30fd8eb9bc7741cdf6262baa477a3dc2a4c7d4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20B=C3=B8gh=20Fangel?= Date: Mon, 17 Jun 2019 11:55:36 +0200 Subject: [PATCH 008/107] fixed compile errors after accepting review suggestions --- internal/pkg/pm2/pm2.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go index d8595cad..167b3e0d 100644 --- a/internal/pkg/pm2/pm2.go +++ b/internal/pkg/pm2/pm2.go @@ -87,11 +87,11 @@ func (m *processManager) pm2(p Process, cmdName string) error { if m.verbose { processStdErr, err := cmd.StderrPipe() if err != nil { - return fmt.Errorf("failed getting Chrome stderr: %v", err) + return fmt.Errorf("failed getting stderr from '%s': %v", p.Fullname(), err) } - chromeStdOut, err := cmd.StdoutPipe() + processStdOut, err := cmd.StdoutPipe() if err != nil { - return fmt.Errorf("failed getting Chrome stdout: %v", err) + return fmt.Errorf("failed getting stdout from '%s': %v", p.Fullname(), err) } readFromPipe := func(name string, reader io.ReadCloser) { r := bufio.NewReader(reader) @@ -100,7 +100,7 @@ func (m *processManager) pm2(p Process, cmdName string) error { line, _, err := r.ReadLine() if err != nil { if err != io.EOF { - m.notifyf("error reading from %v for process %v", name, p.name()) + m.notifyf("error reading from %v for process '%v'", name, p.Fullname()) } break } @@ -109,8 +109,8 @@ func (m *processManager) pm2(p Process, cmdName string) error { } } } - go readFromPipe("stdout", chromeStdOut) - go readFromPipe("stderr", chromeStdErr) + go readFromPipe("stdout", processStdOut) + go readFromPipe("stderr", processStdErr) } if err := cmd.Start(); err != nil { return fmt.Errorf("%s %s with PM2: %v", cmdName, p.Fullname(), err) From 8ca9866440ff9e0bfebf68648702bd34e22734e5 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Fri, 21 Jun 2019 13:32:46 +0200 Subject: [PATCH 009/107] minor refactoring of @tbflw work --- Makefile | 20 +++++++++---------- build/base/Dockerfile | 4 ++-- build/docs/content/01-install.md | 10 +++++----- .../docs/content/03-environment-variables.md | 2 +- build/package/Dockerfile | 1 - cmd/gotenberg/main.go | 4 +++- docs/index.html | 10 +++++----- internal/pkg/pm2/chrome.go | 6 ++---- internal/pkg/pm2/pm2.go | 8 ++++---- internal/pkg/pm2/unoconv.go | 2 +- 10 files changed, 33 insertions(+), 34 deletions(-) diff --git a/Makefile b/Makefile index 30627d03..0af767b0 100644 --- a/Makefile +++ b/Makefile @@ -2,12 +2,12 @@ GOLANG_VERSION=1.12 VERSION=snapshot DOCKER_USER= DOCKER_PASSWORD= -DOCKER_REPO=thecodingmachine +DOCKER_REPOSITORY=thecodingmachine # generate documentation. doc: - docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) -t thecodingmachine/gotenberg:docs -f build/docs/Dockerfile . - docker run --rm -it -v "$(PWD):/docs" thecodingmachine/gotenberg:docs + docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:docs -f build/docs/Dockerfile . + docker run --rm -it -v "$(PWD):/docs" $(DOCKER_REPOSITORY)/gotenberg:docs # gofmt and goimports all go files. fmt: @@ -16,23 +16,23 @@ fmt: # run all linters. lint: - docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) -t thecodingmachine/gotenberg:lint -f build/lint/Dockerfile . - docker run --rm -it -v "$(PWD):/lint" thecodingmachine/gotenberg:lint + docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:lint -f build/lint/Dockerfile . + docker run --rm -it -v "$(PWD):/lint" $(DOCKER_REPOSITORY)/gotenberg:lint # run all tests. tests: - docker build -t thecodingmachine/gotenberg:base -f build/base/Dockerfile . - docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) -t thecodingmachine/gotenberg:tests -f build/tests/Dockerfile . - docker run --rm -it -v "$(PWD):/tests" thecodingmachine/gotenberg:tests + docker build -t $(DOCKER_REPOSITORY)/gotenberg:base -f build/base/Dockerfile . + docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:tests -f build/tests/Dockerfile . + docker run --rm -it -v "$(PWD):/tests" $(DOCKER_REPOSITORY)/gotenberg:tests # build Docker image. image: - docker build -t thecodingmachine/gotenberg:base -f build/base/Dockerfile . + docker build -t $(DOCKER_REPOSITORY)/gotenberg:base -f build/base/Dockerfile . docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) --build-arg VERSION=$(VERSION) -t $(DOCKER_REPO)/gotenberg:$(VERSION) -f build/package/Dockerfile . # start the API using previously built Docker image. gotenberg: - docker run -it --rm -p "3000:3000" thecodingmachine/gotenberg:$(VERSION) + docker run -it --rm -e DEBUG_PROCESS_STARTUP=1 -p "3000:3000" $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) # publish Gotenberg images according to version. publish: diff --git a/build/base/Dockerfile b/build/base/Dockerfile index 24ab4661..d6cbbb64 100644 --- a/build/base/Dockerfile +++ b/build/base/Dockerfile @@ -96,11 +96,11 @@ COPY build/base/fonts.conf /etc/fonts/conf.d/100-gotenberg.conf # | Default user # |-------------------------------------------------------------------------- # | -# | TODO find a correct description for why we're doing this. +# | All processes in the Docker container will run as a dedicated +# | non-root user. # | RUN groupadd --gid 1001 gotenberg \ && useradd --uid 1001 --gid gotenberg --shell /bin/bash --no-create-home gotenberg \ && mkdir /gotenberg \ && chown gotenberg: /gotenberg - diff --git a/build/docs/content/01-install.md b/build/docs/content/01-install.md index 0437115c..cc29d1ba 100644 --- a/build/docs/content/01-install.md +++ b/build/docs/content/01-install.md @@ -10,7 +10,7 @@ You may start it with: $ docker run --rm -p 3000:3000 thecodingmachine/gotenberg:5 ``` -All processes in the docker container runs as a dedicated non-root user called `gotenberg` with user id `1001` from the working dir `/gotenberg`. +All processes in the Docker container runs as a dedicated non-root user called `gotenberg` with user id `1001` from the working dir `/gotenberg`. > The API will be available at [http://localhost:3000](http://localhost:3000). @@ -40,11 +40,11 @@ Otherwise the API will not be able to launch Google Chrome and LibreOffice (unoc > The more resources are granted, the quicker will be the conversions. -Also, in the deployment spec of the pod, specify the uid `1001` of the user `gotenberg`: +Also, in the deployment spec of the pod, specify the uid `1001` of the user `gotenberg`: ``` - securityContext: - privileged: false - runAsUser: 1001 +securityContext: + privileged: false + runAsUser: 1001 ``` In the following examples, we will assume your diff --git a/build/docs/content/03-environment-variables.md b/build/docs/content/03-environment-variables.md index 685cf91c..70653291 100644 --- a/build/docs/content/03-environment-variables.md +++ b/build/docs/content/03-environment-variables.md @@ -48,7 +48,7 @@ This environment variable accepts any string that can be turned into a port numb ## Debug logging of process startup -By default, stdout and stderr messages from the started processes are disabled. +By default, `stdout` and `stderr` messages from the started processes are disabled. You may enable some debug logging from starting the process by setting the environment variable `DEBUG_PROCESS_STARTUP`. diff --git a/build/package/Dockerfile b/build/package/Dockerfile index 05fa13c0..532a55a2 100644 --- a/build/package/Dockerfile +++ b/build/package/Dockerfile @@ -24,7 +24,6 @@ COPY cmd ./cmd COPY go.sum go.sum COPY go.mod go.mod - # Build our binary. RUN go build -o /gotenberg/gotenberg -ldflags "-X main.version=${VERSION}" cmd/gotenberg/main.go diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index dae9192e..9d6a3088 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -50,7 +50,9 @@ func mustParseEnvVar() *api.Options { } opts.DefaultListenPort = v } - //checkBoolEnv is a convenience function for reading an env var with a bool value where `1` is true and `0` is false + // checkBoolEnv is a convenience function for reading + // an env var with a bool value where + // `1` is true and `0` is false. checkBoolEnv := func(name string) bool { if v, ok := os.LookupEnv(name); ok { if v != "1" && v != "0" { diff --git a/docs/index.html b/docs/index.html index fa8df116..6e1a1677 100755 --- a/docs/index.html +++ b/docs/index.html @@ -139,7 +139,7 @@
$ docker run --rm -p 3000:3000 thecodingmachine/gotenberg:5
 
-

All processes in the docker container runs as a dedicated non-root user called gotenberg with user id 1001 from the working dir /gotenberg.

+

All processes in the Docker container runs as a dedicated non-root user called gotenberg with user id 1001 from the working dir /gotenberg.

The API will be available at http://localhost:3000.

@@ -180,9 +180,9 @@ Otherwise the API will not be able to launch Google Chrome and LibreOffice (unoc

Also, in the deployment spec of the pod, specify the uid 1001 of the user gotenberg:

-
        securityContext:
-          privileged: false
-          runAsUser: 1001
+
securityContext:
+  privileged: false
+  runAsUser: 1001
 

In the following examples, we will assume your @@ -288,7 +288,7 @@ See the timeout section.

Debug logging of process startup -

By default, stdout and stderr messages from the started processes are disabled.

+

By default, stdout and stderr messages from the started processes are disabled.

You may enable some debug logging from starting the process by setting the environment variable DEBUG_PROCESS_STARTUP.

diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index 105c76cc..bad71c3e 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -7,15 +7,13 @@ import ( "github.com/mafredri/cdp/devtool" ) -const ( - warmupTime = 10 * time.Second -) +const warmupTime = 10 * time.Second type chrome struct { manager *processManager } -// NewChrome retruns a Google Chrome +// NewChrome returns a Google Chrome // headless process. func NewChrome(debug bool) Process { return &chrome{ diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go index 167b3e0d..fe2498d6 100644 --- a/internal/pkg/pm2/pm2.go +++ b/internal/pkg/pm2/pm2.go @@ -87,11 +87,11 @@ func (m *processManager) pm2(p Process, cmdName string) error { if m.verbose { processStdErr, err := cmd.StderrPipe() if err != nil { - return fmt.Errorf("failed getting stderr from '%s': %v", p.Fullname(), err) + return fmt.Errorf("failed getting stderr from %s: %s", p.Fullname(), err) } processStdOut, err := cmd.StdoutPipe() if err != nil { - return fmt.Errorf("failed getting stdout from '%s': %v", p.Fullname(), err) + return fmt.Errorf("failed getting stdout from %s: %s", p.Fullname(), err) } readFromPipe := func(name string, reader io.ReadCloser) { r := bufio.NewReader(reader) @@ -100,12 +100,12 @@ func (m *processManager) pm2(p Process, cmdName string) error { line, _, err := r.ReadLine() if err != nil { if err != io.EOF { - m.notifyf("error reading from %v for process '%v'", name, p.Fullname()) + m.notifyf("error reading from %s for process %s", name, p.Fullname()) } break } if len(line) != 0 { - m.notifyf("%v %v: %s", p.name(), name, string(line)) + m.notifyf("%s %s: %s", p.name(), name, string(line)) } } } diff --git a/internal/pkg/pm2/unoconv.go b/internal/pkg/pm2/unoconv.go index 7c4fa13e..e7274f69 100644 --- a/internal/pkg/pm2/unoconv.go +++ b/internal/pkg/pm2/unoconv.go @@ -4,7 +4,7 @@ type unoconv struct { manager *processManager } -// NewUnoconv retruns a unoconv listener +// NewUnoconv returns a unoconv listener // process. func NewUnoconv(debug bool) Process { return &unoconv{ From a4aa8dafac74c55ca617fd4491f5c274d27c1b04 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 1 Jul 2019 17:11:23 +0200 Subject: [PATCH 010/107] WIP: refactoring logging system --- Makefile | 9 +- build/tests/docker-entrypoint.sh | 1 - cmd/gotenberg/main.go | 162 +++++++++---------------------- go.mod | 4 +- go.sum | 11 ++- internal/app/api/api.go | 45 +++------ internal/app/api/handler.go | 36 ++++--- internal/app/api/middleware.go | 112 +++++++++++---------- internal/app/api/resource.go | 61 +++++------- internal/pkg/notify/doc.go | 5 - internal/pkg/notify/notify.go | 35 ------- internal/pkg/pm2/chrome.go | 14 +-- internal/pkg/pm2/pm2.go | 59 +++++------ internal/pkg/pm2/unoconv.go | 8 +- internal/pkg/printer/markdown.go | 7 +- internal/pkg/printer/office.go | 7 +- internal/pkg/rand/doc.go | 7 -- internal/pkg/rand/rand.go | 17 ---- internal/pkg/rand/rand_test.go | 16 --- 19 files changed, 225 insertions(+), 391 deletions(-) delete mode 100644 internal/pkg/notify/doc.go delete mode 100644 internal/pkg/notify/notify.go delete mode 100644 internal/pkg/rand/doc.go delete mode 100644 internal/pkg/rand/rand.go delete mode 100644 internal/pkg/rand/rand_test.go diff --git a/Makefile b/Makefile index 0af767b0..0651d971 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,11 @@ VERSION=snapshot DOCKER_USER= DOCKER_PASSWORD= DOCKER_REPOSITORY=thecodingmachine +DEFAULT_WAIT_TIMEOUT=10 +DEFAULT_LISTEN_PORT=3000 +DISABLE_GOOGLE_CHROME=0 +DISABLE_UNOCONV=0 +LOG_LEVEL=INFO # generate documentation. doc: @@ -28,11 +33,11 @@ tests: # build Docker image. image: docker build -t $(DOCKER_REPOSITORY)/gotenberg:base -f build/base/Dockerfile . - docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) --build-arg VERSION=$(VERSION) -t $(DOCKER_REPO)/gotenberg:$(VERSION) -f build/package/Dockerfile . + docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) --build-arg VERSION=$(VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) -f build/package/Dockerfile . # start the API using previously built Docker image. gotenberg: - docker run -it --rm -e DEBUG_PROCESS_STARTUP=1 -p "3000:3000" $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) + docker run -it --rm -e DEFAULT_WAIT_TIMEOUT=$(DEFAULT_WAIT_TIMEOUT) -e DEFAULT_LISTEN_PORT=$(DEFAULT_LISTEN_PORT) -e DISABLE_GOOGLE_CHROME=$(DISABLE_GOOGLE_CHROME) -e DISABLE_UNOCONV=$(DISABLE_UNOCONV) -e LOG_LEVEL=$(LOG_LEVEL) -p "3000:$(DEFAULT_LISTEN_PORT)" $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) # publish Gotenberg images according to version. publish: diff --git a/build/tests/docker-entrypoint.sh b/build/tests/docker-entrypoint.sh index fa2f311a..91cc7d79 100755 --- a/build/tests/docker-entrypoint.sh +++ b/build/tests/docker-entrypoint.sh @@ -10,7 +10,6 @@ go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestUnoconvS # Running others tests. go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/app/api -go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/rand # Finally testing processes shutdown. go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestChromeShutdown diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 9d6a3088..c3382512 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -6,12 +6,11 @@ import ( "net/http" "os" "os/signal" - "strconv" "time" - "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/app/api" - "github.com/thecodingmachine/gotenberg/internal/pkg/notify" + conf "github.com/thecodingmachine/gotenberg/internal/pkg/config" + log "github.com/thecodingmachine/gotenberg/internal/pkg/logger" "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" ) @@ -19,116 +18,37 @@ import ( // nolint: gochecknoglobals var version = "snapshot" -const ( - defaultWaitTimeoutEnvVar = "DEFAULT_WAIT_TIMEOUT" - defaultListenPortEnvVar = "DEFAULT_LISTEN_PORT" - disableGoogleChromeEnvVar = "DISABLE_GOOGLE_CHROME" - disableUnoconvEnvVar = "DISABLE_UNOCONV" - disableHealthcheckLoggingEnvVar = "DISABLE_HEALTHCHECK_LOGGING" - debugProcessStartup = "DEBUG_PROCESS_STARTUP" -) - -func mustParseEnvVar() *api.Options { - opts := api.DefaultOptions() - if os.Getenv(defaultWaitTimeoutEnvVar) != "" { - defaultWaitTimeout, err := strconv.ParseFloat(os.Getenv(defaultWaitTimeoutEnvVar), 64) - if err != nil { - notify.ErrPrint(fmt.Errorf("%s: wrong value: want float got %v", defaultWaitTimeoutEnvVar, err)) - os.Exit(1) - } - opts.DefaultWaitTimeout = defaultWaitTimeout - } - if v, ok := os.LookupEnv(defaultListenPortEnvVar); ok { - defaultListener, err := strconv.ParseUint(os.Getenv(defaultListenPortEnvVar), 10, 64) - if err != nil { - notify.ErrPrint(fmt.Errorf("%s: wrong value: want uint got %v", defaultListenPortEnvVar, err)) - os.Exit(1) - } - if defaultListener > 65535 { - notify.ErrPrint(fmt.Errorf("%s: wrong value: want uint < 65535 got %v", defaultListenPortEnvVar, defaultListener)) - os.Exit(1) - } - opts.DefaultListenPort = v - } - // checkBoolEnv is a convenience function for reading - // an env var with a bool value where - // `1` is true and `0` is false. - checkBoolEnv := func(name string) bool { - if v, ok := os.LookupEnv(name); ok { - if v != "1" && v != "0" { - notify.ErrPrint(fmt.Errorf("%s: wrong value: want \"0\" or \"1\" got %v", name, v)) - os.Exit(1) - } - return v == "1" - } - return false - } - opts.EnableChromeEndpoints = !checkBoolEnv(disableGoogleChromeEnvVar) - opts.EnableUnoconvEndpoints = !checkBoolEnv(disableUnoconvEnvVar) - opts.EnableHealthcheckLogging = !checkBoolEnv(disableHealthcheckLoggingEnvVar) - opts.DebugProcessStartup = checkBoolEnv(debugProcessStartup) - return opts -} - -func mustStartProcesses(opts *api.Options) []pm2.Process { - var processes []pm2.Process - if opts.EnableChromeEndpoints { - processes = append(processes, pm2.NewChrome(opts.DebugProcessStartup)) - } - if opts.EnableUnoconvEndpoints { - processes = append(processes, pm2.NewUnoconv(opts.DebugProcessStartup)) - } - for _, p := range processes { - notify.Printf("starting %s with PM2...", p.Fullname()) - if err := p.Start(); err != nil { - notify.ErrPrint(err) - os.Exit(1) - } - } - return processes -} - -func mustStartAPI(srv *echo.Echo, port string) { - notify.Printf("http server started on port %v", port) - if err := srv.Start(fmt.Sprintf(":%v", port)); err != nil { - if err != http.ErrServerClosed { - notify.ErrPrint(err) - os.Exit(1) - } - } -} - -func mustShutdownProcesses(processes []pm2.Process) { - for _, p := range processes { - notify.Printf("shutting down %s with PM2... (Ctrl+C to force)", p.Fullname()) - if err := p.Shutdown(); err != nil { - notify.ErrPrint(err) - os.Exit(1) - } - } -} - -func mustShutdownAPI(srv *echo.Echo) { - // create a deadline to wait for. - ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) - defer cancel() - // doesn't block if no connections, but will otherwise wait - // until the timeout deadline. - notify.Print("shutting down http server... (Ctrl+C to force)") - if err := srv.Shutdown(ctx); err != nil { - notify.ErrPrint(err) - os.Exit(1) - } -} - func main() { - notify.Printf("Gotenberg %s", version) - opts := mustParseEnvVar() - srv := api.New(opts) - processes := mustStartProcesses(opts) - // run our API in a goroutine so that it doesn't block.s + config, err := conf.FromEnv() + systemLogger := log.New(config.LogLevel(), "system") + if err != nil { + systemLogger.Fatal(err) + } + systemLogger.Infof("Gotenberg %s", version) + // start PM2 processes. + var processes []pm2.Process + if config.EnableChromeEndpoints() { + processes = append(processes, pm2.NewChrome(systemLogger)) + } + if config.EnableUnoconvEndpoints() { + processes = append(processes, pm2.NewUnoconv(systemLogger)) + } + for _, p := range processes { + systemLogger.Infof("starting %s with PM2...", p.Fullname()) + if err := p.Start(); err != nil { + systemLogger.Fatal(err) + } + } + // run our API in a goroutine so that it doesn't block. + // create our API. + srv := api.New(config) go func() { - mustStartAPI(srv, opts.DefaultListenPort) + systemLogger.Infof("http server started on port %s", config.DefaultListenPort()) + if err := srv.Start(fmt.Sprintf(":%s", config.DefaultListenPort())); err != nil { + if err != http.ErrServerClosed { + systemLogger.Fatal(err) + } + } }() quit := make(chan os.Signal, 1) // we'll accept graceful shutdowns when quit via SIGINT (Ctrl+C) @@ -136,8 +56,22 @@ func main() { signal.Notify(quit, os.Interrupt) // block until we receive our signal. <-quit - mustShutdownAPI(srv) - mustShutdownProcesses(processes) - notify.Print("bye!") + // create a deadline to wait for. + ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + defer cancel() + // doesn't block if no connections, but will otherwise wait + // until the timeout deadline. + systemLogger.Info("shutting down http server...") + if err := srv.Shutdown(ctx); err != nil { + systemLogger.Fatal(err) + } + // shutdown PM2 processes. + for _, p := range processes { + systemLogger.Infof("shutting down %s with PM2...", p.Fullname()) + if err := p.Shutdown(); err != nil { + systemLogger.Fatal(err) + } + } + systemLogger.Info("bye!") os.Exit(0) } diff --git a/go.mod b/go.mod index d67246a6..85ced362 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/thecodingmachine/gotenberg go 1.12 require ( - github.com/davecgh/go-spew v1.1.1 // indirect github.com/google/go-cmp v0.2.0 // indirect github.com/gorilla/websocket v1.4.0 // indirect github.com/labstack/echo/v4 v4.0.0 @@ -14,10 +13,11 @@ require ( github.com/microcosm-cc/bluemonday v1.0.1 github.com/russross/blackfriday/v2 v2.0.1 github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95 // indirect + github.com/sirupsen/logrus v1.4.2 github.com/stretchr/testify v1.3.0 github.com/valyala/fasttemplate v1.0.1 // indirect golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c // indirect golang.org/x/net v0.0.0-20181201002055-351d144fa1fc // indirect golang.org/x/sync v0.0.0-20181108010431-42b317875d0f - golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc // indirect + golang.org/x/sys v0.0.0-20190621062556-bf70e4678053 // indirect ) diff --git a/go.sum b/go.sum index 2e6eae15..32ff4bc2 100644 --- a/go.sum +++ b/go.sum @@ -7,6 +7,8 @@ github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/labstack/echo/v4 v4.0.0 h1:q1GH+caIXPP7H2StPIdzy/ez9CO0EepqYeUg6vi9SWM= github.com/labstack/echo/v4 v4.0.0/go.mod h1:tZv7nai5buKSg5h/8E6zz4LsD/Dqh9/91Mvs7Z5Zyno= github.com/labstack/gommon v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0= @@ -30,7 +32,11 @@ github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95 h1:/vdW8Cb7EXrkqWGufVMES1OH2sU9gKVb2n9/1y5NMBY= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -49,5 +55,6 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc h1:4gbWbmmPFp4ySWICouJl6emP0MyS31yy9SrTlAGFT+g= -golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190621062556-bf70e4678053 h1:T0MJjz97TtCXa3ZNW2Oenb3KQWB91K965zMEbIJ4ThA= +golang.org/x/sys v0.0.0-20190621062556-bf70e4678053/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/internal/app/api/api.go b/internal/app/api/api.go index d00e01eb..23db1d6f 100644 --- a/internal/app/api/api.go +++ b/internal/app/api/api.go @@ -1,51 +1,32 @@ package api -import "github.com/labstack/echo/v4" +import ( + "github.com/labstack/echo/v4" + conf "github.com/thecodingmachine/gotenberg/internal/pkg/config" +) const pingEndpoint = "/ping" -// Options allows to customize the behaviour -// of the API. -type Options struct { - DefaultWaitTimeout float64 - DefaultListenPort string - EnableChromeEndpoints bool - EnableUnoconvEndpoints bool - EnableHealthcheckLogging bool - DebugProcessStartup bool -} - -// DefaultOptions returns default options. -func DefaultOptions() *Options { - return &Options{ - DefaultWaitTimeout: 10, - DefaultListenPort: "3000", - EnableChromeEndpoints: true, - EnableUnoconvEndpoints: true, - EnableHealthcheckLogging: true, - } -} - // New returns an API. -func New(opts *Options) *echo.Echo { +func New(config *conf.Config) *echo.Echo { api := echo.New() api.HideBanner = true api.HidePort = true - api.Use(handleLogging(opts.EnableHealthcheckLogging)) + api.Use(contextMiddleware(config)) + api.Use(loggingMiddleware()) + api.Use(finalizeMiddleware()) api.GET(pingEndpoint, func(c echo.Context) error { return nil }) - g := api.Group("/convert") - g.Use(handleContext(opts)) - g.Use(handleError()) - g.POST("/merge", merge) - if !opts.EnableChromeEndpoints && !opts.EnableUnoconvEndpoints { + api.POST("/merge", merge) + if !config.EnableChromeEndpoints() && !config.EnableUnoconvEndpoints() { return api } - if opts.EnableChromeEndpoints { + g := api.Group("/convert") + if config.EnableChromeEndpoints() { g.POST("/html", convertHTML) g.POST("/url", convertURL) g.POST("/markdown", convertMarkdown) } - if opts.EnableUnoconvEndpoints { + if config.EnableUnoconvEndpoints() { g.POST("/office", convertOffice) } return api diff --git a/internal/app/api/handler.go b/internal/app/api/handler.go index f350e452..69e97763 100644 --- a/internal/app/api/handler.go +++ b/internal/app/api/handler.go @@ -6,8 +6,8 @@ import ( "os" "github.com/labstack/echo/v4" + "github.com/labstack/gommon/random" "github.com/thecodingmachine/gotenberg/internal/pkg/printer" - "github.com/thecodingmachine/gotenberg/internal/pkg/rand" ) type errBadRequest struct { @@ -20,7 +20,7 @@ func (e *errBadRequest) Error() string { func merge(c echo.Context) error { ctx := c.(*resourceContext) - opts, err := ctx.resource.mergePrinterOptions() + opts, err := ctx.resource.mergePrinterOptions(ctx.config.DefaultWaitTimeout()) if err != nil { return &errBadRequest{err} } @@ -34,7 +34,7 @@ func merge(c echo.Context) error { func convertHTML(c echo.Context) error { ctx := c.(*resourceContext) - opts, err := ctx.resource.chromePrinterOptions() + opts, err := ctx.resource.chromePrinterOptions(ctx.config.DefaultWaitTimeout()) if err != nil { return &errBadRequest{err} } @@ -48,7 +48,7 @@ func convertHTML(c echo.Context) error { func convertMarkdown(c echo.Context) error { ctx := c.(*resourceContext) - opts, err := ctx.resource.chromePrinterOptions() + opts, err := ctx.resource.chromePrinterOptions(ctx.config.DefaultWaitTimeout()) if err != nil { return &errBadRequest{err} } @@ -65,7 +65,7 @@ func convertMarkdown(c echo.Context) error { func convertURL(c echo.Context) error { ctx := c.(*resourceContext) - opts, err := ctx.resource.chromePrinterOptions() + opts, err := ctx.resource.chromePrinterOptions(ctx.config.DefaultWaitTimeout()) if err != nil { return &errBadRequest{err} } @@ -79,7 +79,7 @@ func convertURL(c echo.Context) error { func convertOffice(c echo.Context) error { ctx := c.(*resourceContext) - opts, err := ctx.resource.officePrinterOptions() + opts, err := ctx.resource.officePrinterOptions(ctx.config.DefaultWaitTimeout()) if err != nil { return &errBadRequest{err} } @@ -105,10 +105,7 @@ func convertOffice(c echo.Context) error { } func convert(ctx *resourceContext, p printer.Printer) error { - baseFilename, err := rand.Get() - if err != nil { - return err - } + baseFilename := random.String(32) filename := fmt.Sprintf("%s.pdf", baseFilename) fpath := fmt.Sprintf("%s/%s", ctx.resource.formFilesDirPath, filename) // if no webhook URL given, run conversion @@ -118,11 +115,12 @@ func convert(ctx *resourceContext, p printer.Printer) error { if err := p.Print(fpath); err != nil { return err } - if ctx.resource.has(resultFilename) { - filename, err = ctx.resource.get(resultFilename) - if err != nil { - return &errBadRequest{err} - } + if !ctx.resource.has(resultFilename) { + return ctx.Attachment(fpath, filename) + } + filename, err := ctx.resource.get(resultFilename) + if err != nil { + return &errBadRequest{err} } return ctx.Attachment(fpath, filename) } @@ -132,23 +130,23 @@ func convert(ctx *resourceContext, p printer.Printer) error { go func() { defer ctx.resource.close() // nolint: errcheck if err := p.Print(fpath); err != nil { - ctx.Logger().Error(err) + ctx.logger.Error(err) return } f, err := os.Open(fpath) if err != nil { - ctx.Logger().Error(err) + ctx.logger.Error(err) return } defer f.Close() // nolint: errcheck webhook, err := ctx.resource.get(webhookURL) if err != nil { - ctx.Logger().Error(err) + ctx.logger.Error(err) return } resp, err := http.Post(webhook, "application/pdf", f) /* #nosec */ if err != nil { - ctx.Logger().Error(err) + ctx.logger.Error(err) return } defer resp.Body.Close() // nolint: errcheck diff --git a/internal/app/api/middleware.go b/internal/app/api/middleware.go index a3329f6d..1cb35b97 100644 --- a/internal/app/api/middleware.go +++ b/internal/app/api/middleware.go @@ -6,70 +6,84 @@ import ( "strings" "github.com/labstack/echo/v4" - "github.com/labstack/echo/v4/middleware" + "github.com/labstack/gommon/random" + conf "github.com/thecodingmachine/gotenberg/internal/pkg/config" + log "github.com/thecodingmachine/gotenberg/internal/pkg/logger" ) -func handleLogging(enableHealthcheckLogging bool) echo.MiddlewareFunc { - if enableHealthcheckLogging { - // default logging middleware. - return middleware.Logger() - } - // middleware for skipping logging when the ping endpoint is called. - return middleware.LoggerWithConfig(middleware.LoggerConfig{ - Skipper: func(c echo.Context) bool { - return c.Request().URL.Path == pingEndpoint - }, - }) -} - -func handleContext(opts *Options) echo.MiddlewareFunc { - // middleware for extending default context with our - // custom constext. +func contextMiddleware(config *conf.Config) echo.MiddlewareFunc { + // middleware for extending the default context + // with one of our own context. return func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { - ctx := &resourceContext{c, opts, nil} - r, err := newResource(ctx) - if err != nil { - if resourceErr := r.close(); resourceErr != nil { - c.Logger().Error(resourceErr) + // generate a unique identifier for our request. + trace := random.String(32) + // create the logger for this request using + // the previous identifier as trace. + logger := log.New(config.LogLevel(), trace) + // extend the current echo context with our standard + // context. + ctx := newStandardContext(c, logger, config) + // if the endpoint is not for liveness, make a + // context with resource. + if ctx.Path() != pingEndpoint { + ctx, err := ctx.withResource(trace) + if err != nil { + ctx.Error(err) + return ctx.logEndOfRequest(err) } - return err } - ctx.resource = r return next(ctx) } } } -func handleError() echo.MiddlewareFunc { - // middleware for handling errors and removing resources - // once the request has been handled. +func loggingMiddleware() echo.MiddlewareFunc { + // middleware for enabling logging. return func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { - err := next(c) - ctx := c.(*resourceContext) - // if a webhookURL has been given, - // do not remove the resources here because - // we don't know if the result file has been - // generated or sent. - if !ctx.resource.has(webhookURL) { - if resourceErr := ctx.resource.close(); resourceErr != nil { - c.Logger().Error(resourceErr) - } - } + ctx := c.(*standardContext) + err := next(ctx) if err != nil { - if _, ok := err.(*echo.HTTPError); ok { - return err - } - if _, ok := err.(*errBadRequest); ok { - return echo.NewHTTPError(http.StatusBadRequest, err.Error()) - } - if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { - return echo.NewHTTPError(http.StatusRequestTimeout) - } - return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + ctx.Error(err) } - return nil + return ctx.logEndOfRequest(err) + } + } +} + +func finalizeMiddleware() echo.MiddlewareFunc { + // middleware for removing resources at the end of a request + // and for improving response in case of error. + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + err := next(c) + ctx, ok := c.(*resourceContext) + // a resource is associated with the context. + if ok { + // if a webhookURL has been given, + // do not remove the resources here because + // we don't know if the result file has been + // generated or sent. + if !ctx.resource.has(webhookURL) { + if resourceErr := ctx.resource.close(); resourceErr != nil { + ctx.logger.Error(err) + } + } + } + if err == nil { + return nil + } + if _, ok := err.(*echo.HTTPError); ok { + return err + } + if _, ok := err.(*errBadRequest); ok { + return echo.NewHTTPError(http.StatusBadRequest, err.Error()) + } + if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { + return echo.NewHTTPError(http.StatusRequestTimeout, err.Error()) + } + return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } } } diff --git a/internal/app/api/resource.go b/internal/app/api/resource.go index 6648466d..5a359cee 100644 --- a/internal/app/api/resource.go +++ b/internal/app/api/resource.go @@ -10,7 +10,6 @@ import ( "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/pkg/printer" - "github.com/thecodingmachine/gotenberg/internal/pkg/rand" ) const ( @@ -31,53 +30,41 @@ const ( type resource struct { formValues map[string]string formFilesDirPath string - opts *Options } -type resourceContext struct { - echo.Context - opts *Options - resource *resource -} - -func newResource(ctx *resourceContext) (*resource, error) { +func newResource(c echo.Context, dirPath string) (*resource, error) { r := &resource{ - formValues: formValues(ctx), - opts: ctx.opts, - } - dirPath, err := rand.Get() - if err != nil { - return r, err + formValues: formValues(c), } r.formFilesDirPath = dirPath if err := os.MkdirAll(dirPath, 0755); err != nil { return nil, fmt.Errorf("%s: making directory: %v", dirPath, err) } - if err := formFiles(ctx, dirPath); err != nil { + if err := formFiles(c, dirPath); err != nil { return r, err } return r, nil } -func formValues(ctx *resourceContext) map[string]string { +func formValues(c echo.Context) map[string]string { v := make(map[string]string) - v[resultFilename] = ctx.FormValue(resultFilename) - v[waitTimeout] = ctx.FormValue(waitTimeout) - v[webhookURL] = ctx.FormValue(webhookURL) - v[remoteURL] = ctx.FormValue(remoteURL) - v[waitDelay] = ctx.FormValue(waitDelay) - v[paperWidth] = ctx.FormValue(paperWidth) - v[paperHeight] = ctx.FormValue(paperHeight) - v[marginTop] = ctx.FormValue(marginTop) - v[marginBottom] = ctx.FormValue(marginBottom) - v[marginLeft] = ctx.FormValue(marginLeft) - v[marginRight] = ctx.FormValue(marginRight) - v[landscape] = ctx.FormValue(landscape) + v[resultFilename] = c.FormValue(resultFilename) + v[waitTimeout] = c.FormValue(waitTimeout) + v[webhookURL] = c.FormValue(webhookURL) + v[remoteURL] = c.FormValue(remoteURL) + v[waitDelay] = c.FormValue(waitDelay) + v[paperWidth] = c.FormValue(paperWidth) + v[paperHeight] = c.FormValue(paperHeight) + v[marginTop] = c.FormValue(marginTop) + v[marginBottom] = c.FormValue(marginBottom) + v[marginLeft] = c.FormValue(marginLeft) + v[marginRight] = c.FormValue(marginRight) + v[landscape] = c.FormValue(landscape) return v } -func formFiles(ctx *resourceContext, dirPath string) error { - form, err := ctx.MultipartForm() +func formFiles(c echo.Context, dirPath string) error { + form, err := c.MultipartForm() if err != nil { return fmt.Errorf("getting multipart form: %v", err) } @@ -117,8 +104,8 @@ func (r *resource) close() error { const defaultHeaderFooterHTML string = "" -func (r *resource) chromePrinterOptions() (*printer.ChromeOptions, error) { - timeout, err := r.float64(waitTimeout, r.opts.DefaultWaitTimeout) +func (r *resource) chromePrinterOptions(defaultWaitTimeout float64) (*printer.ChromeOptions, error) { + timeout, err := r.float64(waitTimeout, defaultWaitTimeout) if err != nil { return nil, err } @@ -177,8 +164,8 @@ func (r *resource) chromePrinterOptions() (*printer.ChromeOptions, error) { }, nil } -func (r *resource) officePrinterOptions() (*printer.OfficeOptions, error) { - timeout, err := r.float64(waitTimeout, r.opts.DefaultWaitTimeout) +func (r *resource) officePrinterOptions(defaultWaitTimeout float64) (*printer.OfficeOptions, error) { + timeout, err := r.float64(waitTimeout, defaultWaitTimeout) if err != nil { return nil, err } @@ -192,8 +179,8 @@ func (r *resource) officePrinterOptions() (*printer.OfficeOptions, error) { }, nil } -func (r *resource) mergePrinterOptions() (*printer.MergeOptions, error) { - timeout, err := r.float64(waitTimeout, r.opts.DefaultWaitTimeout) +func (r *resource) mergePrinterOptions(defaultWaitTimeout float64) (*printer.MergeOptions, error) { + timeout, err := r.float64(waitTimeout, defaultWaitTimeout) if err != nil { return nil, err } diff --git a/internal/pkg/notify/doc.go b/internal/pkg/notify/doc.go deleted file mode 100644 index d60f45c6..00000000 --- a/internal/pkg/notify/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -/* -Package notify helps displaying nice outputs -to the user. -*/ -package notify diff --git a/internal/pkg/notify/notify.go b/internal/pkg/notify/notify.go deleted file mode 100644 index 6690e2cc..00000000 --- a/internal/pkg/notify/notify.go +++ /dev/null @@ -1,35 +0,0 @@ -package notify - -import ( - "fmt" - "os" - - "github.com/labstack/gommon/color" -) - -// Print prints a message to stdout. -func Print(message string) { - stdout := color.New() - stdout.SetOutput(os.Stdout) - stdout.Printf("⇨ %s\n", message) -} - -// Printf prints a formatted message to stdout. -func Printf(format string, a ...interface{}) { - message := fmt.Sprintf(format, a...) - Print(message) -} - -// WarnPrint prints a warning to stderr. -func WarnPrint(err error) { - stderr := color.New() - stderr.SetOutput(os.Stderr) - stderr.Printf("%s\n", color.Yellow(fmt.Sprintf("⇨ warn: %v", err))) -} - -// ErrPrint prints an error to stderr. -func ErrPrint(err error) { - stderr := color.New() - stderr.SetOutput(os.Stderr) - stderr.Printf("%s\n", color.Red(fmt.Sprintf("⇨ error: %v", err))) -} diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index bad71c3e..aa04d4f1 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -5,6 +5,7 @@ import ( "time" "github.com/mafredri/cdp/devtool" + log "github.com/thecodingmachine/gotenberg/internal/pkg/logger" ) const warmupTime = 10 * time.Second @@ -15,9 +16,9 @@ type chrome struct { // NewChrome returns a Google Chrome // headless process. -func NewChrome(debug bool) Process { +func NewChrome(logger *log.StandardLogger) Process { return &chrome{ - manager: &processManager{verbose: debug}, + manager: &processManager{logger: logger}, } } @@ -60,19 +61,18 @@ func (p *chrome) viable() bool { // check if Google Chrome is correctly running. ctx, cancel := context.WithCancel(context.Background()) defer cancel() - p.manager.notifyf(`%v: checking Chrome liveness via debug version endpoint -'http://localhost:9222/json/version'`, p.name()) + p.manager.logger.Debugf("%s: checking liveness via debug version endpoint http://localhost:9222/json/version", p.Fullname()) v, err := devtool.New("http://localhost:9222").Version(ctx) if err != nil { - p.manager.notifyf("%s: %s version endpoint returned error: %v", p.name(), p.Fullname(), err) + p.manager.logger.Debugf("%s: debug version endpoint returned error: %v", p.Fullname(), err) return false } - p.manager.notifyf("%s: %s returned version info: %+v", p.name(), p.Fullname(), *v) + p.manager.logger.Debugf("%s: debug version endpoint returned version info: %+v", p.Fullname(), *v) return true } func (p *chrome) warmup() { - p.manager.notifyf("%s: allowing %s %v to startup", p.name(), p.Fullname(), warmupTime) + p.manager.logger.Debugf("%s: allowing %v to startup", p.Fullname(), warmupTime) time.Sleep(warmupTime) } diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go index fe2498d6..2850c9ac 100644 --- a/internal/pkg/pm2/pm2.go +++ b/internal/pkg/pm2/pm2.go @@ -6,9 +6,8 @@ import ( "io" "os/exec" "strings" - "time" - "github.com/thecodingmachine/gotenberg/internal/pkg/notify" + log "github.com/thecodingmachine/gotenberg/internal/pkg/logger" ) const ( @@ -31,7 +30,7 @@ type Process interface { type processManager struct { heuristicState int32 - verbose bool + logger *log.StandardLogger } func (m *processManager) start(p Process) error { @@ -83,43 +82,35 @@ func (m *processManager) pm2(p Process, cmdName string) error { "pm2", cmdArgs..., ) - m.notifyf("executing command '%v'", strings.Join(cmd.Args, " ")) - if m.verbose { - processStdErr, err := cmd.StderrPipe() - if err != nil { - return fmt.Errorf("failed getting stderr from %s: %s", p.Fullname(), err) - } - processStdOut, err := cmd.StdoutPipe() - if err != nil { - return fmt.Errorf("failed getting stdout from %s: %s", p.Fullname(), err) - } - readFromPipe := func(name string, reader io.ReadCloser) { - r := bufio.NewReader(reader) - defer reader.Close() // nolint: errcheck - for { - line, _, err := r.ReadLine() - if err != nil { - if err != io.EOF { - m.notifyf("error reading from %s for process %s", name, p.Fullname()) - } - break - } - if len(line) != 0 { - m.notifyf("%s %s: %s", p.name(), name, string(line)) + m.logger.Debugf("executing command: %v", strings.Join(cmd.Args, " ")) + processStdOut, err := cmd.StdoutPipe() + if err != nil { + return fmt.Errorf("failed getting stdout from %s: %s", p.Fullname(), err) + } + processStdErr, err := cmd.StderrPipe() + if err != nil { + return fmt.Errorf("failed getting stderr from %s: %s", p.Fullname(), err) + } + readFromPipe := func(outputType string, reader io.ReadCloser) { + r := bufio.NewReader(reader) + defer reader.Close() // nolint: errcheck + for { + line, _, err := r.ReadLine() + if err != nil { + if err != io.EOF { + m.logger.Errorf("error reading from %s for process %s", outputType, p.Fullname()) } + break + } + if len(line) != 0 { + m.logger.Debugf("%s %s: %s", p.Fullname(), outputType, string(line)) } } - go readFromPipe("stdout", processStdOut) - go readFromPipe("stderr", processStdErr) } + go readFromPipe("stdout", processStdOut) + go readFromPipe("stderr", processStdErr) if err := cmd.Start(); err != nil { return fmt.Errorf("%s %s with PM2: %v", cmdName, p.Fullname(), err) } return nil } - -func (m *processManager) notifyf(format string, args ...interface{}) { - if m.verbose { - notify.Printf(fmt.Sprintf("%v: %s", time.Now().Format(time.RFC3339), format), args...) - } -} diff --git a/internal/pkg/pm2/unoconv.go b/internal/pkg/pm2/unoconv.go index e7274f69..9350ab26 100644 --- a/internal/pkg/pm2/unoconv.go +++ b/internal/pkg/pm2/unoconv.go @@ -1,14 +1,18 @@ package pm2 +import ( + log "github.com/thecodingmachine/gotenberg/internal/pkg/logger" +) + type unoconv struct { manager *processManager } // NewUnoconv returns a unoconv listener // process. -func NewUnoconv(debug bool) Process { +func NewUnoconv(logger *log.StandardLogger) Process { return &unoconv{ - manager: &processManager{verbose: debug}, + manager: &processManager{logger: logger}, } } diff --git a/internal/pkg/printer/markdown.go b/internal/pkg/printer/markdown.go index 0bbaa518..9c84830c 100644 --- a/internal/pkg/printer/markdown.go +++ b/internal/pkg/printer/markdown.go @@ -7,9 +7,9 @@ import ( "io/ioutil" "path/filepath" + "github.com/labstack/gommon/random" "github.com/microcosm-cc/bluemonday" "github.com/russross/blackfriday/v2" - "github.com/thecodingmachine/gotenberg/internal/pkg/rand" ) // NewMarkdown returns a Markdown printer. @@ -27,10 +27,7 @@ func NewMarkdown(fpath string, opts *ChromeOptions) (Printer, error) { if err := tmpl.Execute(&buffer, data); err != nil { return nil, fmt.Errorf("%s: executing template: %v", fpath, err) } - baseFilename, err := rand.Get() - if err != nil { - return nil, err - } + baseFilename := random.String(32) dst := fmt.Sprintf("%s/%s.html", dirPath, baseFilename) if err := ioutil.WriteFile(dst, buffer.Bytes(), 0644); err != nil { return nil, fmt.Errorf("%s: writing file: %v", dst, err) diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index 6a104ccf..8e83824e 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -9,7 +9,7 @@ import ( "sync" "time" - "github.com/thecodingmachine/gotenberg/internal/pkg/rand" + "github.com/labstack/gommon/random" ) type office struct { @@ -38,10 +38,7 @@ func (p *office) Print(destination string) error { fpaths := make([]string, len(p.fpaths)) dirPath := filepath.Dir(destination) for i, fpath := range p.fpaths { - baseFilename, err := rand.Get() - if err != nil { - return err - } + baseFilename := random.String(32) tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) if err := unoconv(ctx, fpath, tmpDest, p.opts); err != nil { return err diff --git a/internal/pkg/rand/doc.go b/internal/pkg/rand/doc.go deleted file mode 100644 index 35fa53e7..00000000 --- a/internal/pkg/rand/doc.go +++ /dev/null @@ -1,7 +0,0 @@ -/* -Package rand helps generating a random string. - -It should be used for creating directory and -file names in order to avoid collision. -*/ -package rand diff --git a/internal/pkg/rand/rand.go b/internal/pkg/rand/rand.go deleted file mode 100644 index 6291b515..00000000 --- a/internal/pkg/rand/rand.go +++ /dev/null @@ -1,17 +0,0 @@ -package rand - -import ( - "crypto/rand" - "encoding/hex" - "fmt" -) - -// Get returns a random string. -func Get() (string, error) { - randBytes := make([]byte, 16) - _, err := rand.Read(randBytes) - if err != nil { - return "", fmt.Errorf("creating random string: %v", err) - } - return hex.EncodeToString(randBytes), nil -} diff --git a/internal/pkg/rand/rand_test.go b/internal/pkg/rand/rand_test.go deleted file mode 100644 index c171539c..00000000 --- a/internal/pkg/rand/rand_test.go +++ /dev/null @@ -1,16 +0,0 @@ -package rand - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestGet(t *testing.T) { - rand1, err := Get() - require.Nil(t, err) - rand2, err := Get() - require.Nil(t, err) - assert.NotEqual(t, rand1, rand2) -} From c8f7ea934c6599a17c7d5c0455f821546a7bab03 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Sun, 7 Jul 2019 17:45:07 +0200 Subject: [PATCH 011/107] wip refactoring: better logging and error systems --- go.mod | 24 +- go.sum | 74 ++-- internal/app/api/api.go | 29 +- internal/app/api/api_test.go | 128 ------ internal/app/api/handler.go | 155 -------- internal/app/api/handler_test.go | 360 ----------------- internal/app/api/middleware.go | 89 ----- internal/app/api/pkg/context/context.go | 137 +++++++ internal/app/api/pkg/context/doc.go | 3 + internal/app/api/pkg/handler/doc.go | 3 + internal/app/api/pkg/handler/handler.go | 151 +++++++ internal/app/api/pkg/handler/html.go | 24 ++ internal/app/api/pkg/handler/markdown.go | 27 ++ internal/app/api/pkg/handler/merge.go | 24 ++ internal/app/api/pkg/handler/office.go | 37 ++ internal/app/api/pkg/handler/ping.go | 10 + internal/app/api/pkg/handler/url.go | 25 ++ internal/app/api/pkg/middleware/cleanup.go | 38 ++ internal/app/api/pkg/middleware/context.go | 41 ++ internal/app/api/pkg/middleware/doc.go | 3 + internal/app/api/pkg/middleware/error.go | 43 ++ internal/app/api/pkg/middleware/logger.go | 21 + internal/app/api/pkg/resource/doc.go | 5 + internal/app/api/pkg/resource/resource.go | 417 ++++++++++++++++++++ internal/app/api/resource.go | 297 -------------- internal/pkg/config/config.go | 122 ++++++ internal/pkg/config/doc.go | 1 + internal/pkg/logger/doc.go | 1 + internal/pkg/logger/logger.go | 33 ++ internal/pkg/pm2/chrome.go | 9 +- internal/pkg/pm2/pm2.go | 4 +- internal/pkg/pm2/unoconv.go | 4 +- internal/pkg/random/doc.go | 3 + internal/pkg/random/random.go | 10 + internal/pkg/standarderror/doc.go | 5 + internal/pkg/standarderror/standarderror.go | 85 ++++ 36 files changed, 1346 insertions(+), 1096 deletions(-) delete mode 100644 internal/app/api/api_test.go delete mode 100644 internal/app/api/handler.go delete mode 100644 internal/app/api/handler_test.go delete mode 100644 internal/app/api/middleware.go create mode 100644 internal/app/api/pkg/context/context.go create mode 100644 internal/app/api/pkg/context/doc.go create mode 100644 internal/app/api/pkg/handler/doc.go create mode 100644 internal/app/api/pkg/handler/handler.go create mode 100644 internal/app/api/pkg/handler/html.go create mode 100644 internal/app/api/pkg/handler/markdown.go create mode 100644 internal/app/api/pkg/handler/merge.go create mode 100644 internal/app/api/pkg/handler/office.go create mode 100644 internal/app/api/pkg/handler/ping.go create mode 100644 internal/app/api/pkg/handler/url.go create mode 100644 internal/app/api/pkg/middleware/cleanup.go create mode 100644 internal/app/api/pkg/middleware/context.go create mode 100644 internal/app/api/pkg/middleware/doc.go create mode 100644 internal/app/api/pkg/middleware/error.go create mode 100644 internal/app/api/pkg/middleware/logger.go create mode 100644 internal/app/api/pkg/resource/doc.go create mode 100644 internal/app/api/pkg/resource/resource.go delete mode 100644 internal/app/api/resource.go create mode 100644 internal/pkg/config/config.go create mode 100644 internal/pkg/config/doc.go create mode 100644 internal/pkg/logger/doc.go create mode 100644 internal/pkg/logger/logger.go create mode 100644 internal/pkg/random/doc.go create mode 100644 internal/pkg/random/random.go create mode 100644 internal/pkg/standarderror/doc.go create mode 100644 internal/pkg/standarderror/standarderror.go diff --git a/go.mod b/go.mod index 85ced362..82700001 100644 --- a/go.mod +++ b/go.mod @@ -3,21 +3,19 @@ module github.com/thecodingmachine/gotenberg go 1.12 require ( - github.com/google/go-cmp v0.2.0 // indirect + github.com/google/go-cmp v0.3.0 // indirect github.com/gorilla/websocket v1.4.0 // indirect - github.com/labstack/echo/v4 v4.0.0 - github.com/labstack/gommon v0.2.8 - github.com/mafredri/cdp v0.22.0 - github.com/mattn/go-colorable v0.1.1 // indirect - github.com/mattn/go-isatty v0.0.7 // indirect - github.com/microcosm-cc/bluemonday v1.0.1 + github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect + github.com/labstack/echo/v4 v4.1.6 + github.com/labstack/gommon v0.2.9 + github.com/mafredri/cdp v0.23.4 + github.com/microcosm-cc/bluemonday v1.0.2 github.com/russross/blackfriday/v2 v2.0.1 - github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95 // indirect + github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/sirupsen/logrus v1.4.2 github.com/stretchr/testify v1.3.0 - github.com/valyala/fasttemplate v1.0.1 // indirect - golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c // indirect - golang.org/x/net v0.0.0-20181201002055-351d144fa1fc // indirect - golang.org/x/sync v0.0.0-20181108010431-42b317875d0f - golang.org/x/sys v0.0.0-20190621062556-bf70e4678053 // indirect + golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 // indirect + golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect + golang.org/x/sync v0.0.0-20190423024810-112230192c58 + golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect ) diff --git a/go.sum b/go.sum index 32ff4bc2..ececb92e 100644 --- a/go.sum +++ b/go.sum @@ -3,58 +3,66 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/labstack/echo/v4 v4.0.0 h1:q1GH+caIXPP7H2StPIdzy/ez9CO0EepqYeUg6vi9SWM= -github.com/labstack/echo/v4 v4.0.0/go.mod h1:tZv7nai5buKSg5h/8E6zz4LsD/Dqh9/91Mvs7Z5Zyno= -github.com/labstack/gommon v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0= -github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4= -github.com/mafredri/cdp v0.22.0 h1:BV17j8hXLDWczo2SZIAFuOjMpQMIOq5DOcd9sgB2hv0= -github.com/mafredri/cdp v0.22.0/go.mod h1:hgdiA0yp1uqhSaDOHJWPgXpMbh+LAfUdD9vbN2AM8gE= -github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/microcosm-cc/bluemonday v1.0.1 h1:SIYunPjnlXcW+gVfvm0IlSeR5U3WZUOLfVmqg85Go44= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/labstack/echo/v4 v4.1.6 h1:WOvLa4T1KzWCRpANwz0HGgWDelXSSGwIKtKBbFdHTv4= +github.com/labstack/echo/v4 v4.1.6/go.mod h1:kU/7PwzgNxZH4das4XNsSpBSOD09XIF5YEPzjpkGnGE= +github.com/labstack/gommon v0.2.9 h1:heVeuAYtevIQVYkGj6A41dtfT91LrvFG220lavpWhrU= +github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4= +github.com/mafredri/cdp v0.23.4 h1:ffp4qq6slfCL4rFWBDeRHapkLE776gER4tX5Z3LS8CY= +github.com/mafredri/cdp v0.23.4/go.mod h1:hgdiA0yp1uqhSaDOHJWPgXpMbh+LAfUdD9vbN2AM8gE= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95 h1:/vdW8Cb7EXrkqWGufVMES1OH2sU9gKVb2n9/1y5NMBY= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4 h1:gKMu1Bf6QINDnvyZuTaACm9ofY+PRh+5vFz4oxBZeF8= -github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4/go.mod h1:50wTf68f99/Zt14pr046Tgt3Lp2vLyFZKzbFXTOabXw= github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -golang.org/x/crypto v0.0.0-20190130090550-b01c7a725664/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc h1:a3CU5tJYVj92DY2LaA1kUkrsqD5/3mLDhx2NcNqyW+0= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190607181551-461777fb6f67/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190621062556-bf70e4678053 h1:T0MJjz97TtCXa3ZNW2Oenb3KQWB91K965zMEbIJ4ThA= -golang.org/x/sys v0.0.0-20190621062556-bf70e4678053/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190609082536-301114b31cce/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190608022120-eacb66d2a7c3/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= diff --git a/internal/app/api/api.go b/internal/app/api/api.go index 23db1d6f..3a711782 100644 --- a/internal/app/api/api.go +++ b/internal/app/api/api.go @@ -2,32 +2,33 @@ package api import ( "github.com/labstack/echo/v4" - conf "github.com/thecodingmachine/gotenberg/internal/pkg/config" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/handler" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/middleware" + "github.com/thecodingmachine/gotenberg/internal/pkg/config" ) -const pingEndpoint = "/ping" - // New returns an API. -func New(config *conf.Config) *echo.Echo { +func New(config *config.Config) *echo.Echo { api := echo.New() api.HideBanner = true api.HidePort = true - api.Use(contextMiddleware(config)) - api.Use(loggingMiddleware()) - api.Use(finalizeMiddleware()) - api.GET(pingEndpoint, func(c echo.Context) error { return nil }) - api.POST("/merge", merge) + api.Use(middleware.Context(config)) + api.Use(middleware.Logger()) + api.Use(middleware.Cleanup()) + api.Use(middleware.Error()) + api.GET(handler.PingEndpoint, handler.Ping) + api.POST(handler.MergeEndpoint, handler.Merge) if !config.EnableChromeEndpoints() && !config.EnableUnoconvEndpoints() { return api } - g := api.Group("/convert") + g := api.Group(handler.ConvertGroupEndpoint) if config.EnableChromeEndpoints() { - g.POST("/html", convertHTML) - g.POST("/url", convertURL) - g.POST("/markdown", convertMarkdown) + g.POST(handler.HTMLEndpoint, handler.HTML) + g.POST(handler.URLEndpoint, handler.URL) + g.POST(handler.MarkdownEndpoint, handler.Markdown) } if config.EnableUnoconvEndpoints() { - g.POST("/office", convertOffice) + g.POST(handler.OfficeEndpoint, handler.Office) } return api } diff --git a/internal/app/api/api_test.go b/internal/app/api/api_test.go deleted file mode 100644 index 1f29b33c..00000000 --- a/internal/app/api/api_test.go +++ /dev/null @@ -1,128 +0,0 @@ -package api - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/test" -) - -func TestDefaultWaitTimeout(t *testing.T) { - opts := DefaultOptions() - opts.DefaultWaitTimeout = 0 - srv := New(opts) - // testing if timeout. - body, contentType := test.URLTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) - // testing if no timeout. - body, contentType = test.URLTestMultipartForm(t, map[string]string{waitTimeout: "10"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) -} - -func TestDisableChromeEndpoints(t *testing.T) { - opts := DefaultOptions() - opts.EnableChromeEndpoints = false - srv := New(opts) - // Ping. - req := httptest.NewRequest(http.MethodGet, "/ping", nil) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // Merge. - body, contentType := test.PDFTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // HTML. - body, contentType = test.HTMLTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusNotFound, srv, req) - // Markdown. - body, contentType = test.MarkdownTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusNotFound, srv, req) - // URL. - body, contentType = test.URLTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusNotFound, srv, req) - // Office. - body, contentType = test.OfficeTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/office", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) -} - -func TestDisableUnoconvEndpoints(t *testing.T) { - opts := DefaultOptions() - opts.EnableUnoconvEndpoints = false - srv := New(opts) - // Ping. - req := httptest.NewRequest(http.MethodGet, "/ping", nil) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // Merge. - body, contentType := test.PDFTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // HTML. - body, contentType = test.HTMLTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // Markdown. - body, contentType = test.MarkdownTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // URL. - body, contentType = test.URLTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // Office. - body, contentType = test.OfficeTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/office", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusNotFound, srv, req) -} -func TestDisableChromeAndUnoconvEndpoints(t *testing.T) { - opts := DefaultOptions() - opts.EnableChromeEndpoints = false - opts.EnableUnoconvEndpoints = false - srv := New(opts) - // Ping. - req := httptest.NewRequest(http.MethodGet, "/ping", nil) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // Merge. - body, contentType := test.PDFTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // HTML. - body, contentType = test.HTMLTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusNotFound, srv, req) - // Markdown. - body, contentType = test.MarkdownTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusNotFound, srv, req) - // URL. - body, contentType = test.URLTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusNotFound, srv, req) - // Office. - body, contentType = test.OfficeTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/office", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusNotFound, srv, req) -} diff --git a/internal/app/api/handler.go b/internal/app/api/handler.go deleted file mode 100644 index 69e97763..00000000 --- a/internal/app/api/handler.go +++ /dev/null @@ -1,155 +0,0 @@ -package api - -import ( - "fmt" - "net/http" - "os" - - "github.com/labstack/echo/v4" - "github.com/labstack/gommon/random" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" -) - -type errBadRequest struct { - err error -} - -func (e *errBadRequest) Error() string { - return e.err.Error() -} - -func merge(c echo.Context) error { - ctx := c.(*resourceContext) - opts, err := ctx.resource.mergePrinterOptions(ctx.config.DefaultWaitTimeout()) - if err != nil { - return &errBadRequest{err} - } - fpaths, err := ctx.resource.fpaths(".pdf") - if err != nil { - return &errBadRequest{err} - } - p := printer.NewMerge(fpaths, opts) - return convert(ctx, p) -} - -func convertHTML(c echo.Context) error { - ctx := c.(*resourceContext) - opts, err := ctx.resource.chromePrinterOptions(ctx.config.DefaultWaitTimeout()) - if err != nil { - return &errBadRequest{err} - } - fpath, err := ctx.resource.fpath("index.html") - if err != nil { - return &errBadRequest{err} - } - p := printer.NewHTML(fpath, opts) - return convert(ctx, p) -} - -func convertMarkdown(c echo.Context) error { - ctx := c.(*resourceContext) - opts, err := ctx.resource.chromePrinterOptions(ctx.config.DefaultWaitTimeout()) - if err != nil { - return &errBadRequest{err} - } - fpath, err := ctx.resource.fpath("index.html") - if err != nil { - return &errBadRequest{err} - } - p, err := printer.NewMarkdown(fpath, opts) - if err != nil { - return err - } - return convert(ctx, p) -} - -func convertURL(c echo.Context) error { - ctx := c.(*resourceContext) - opts, err := ctx.resource.chromePrinterOptions(ctx.config.DefaultWaitTimeout()) - if err != nil { - return &errBadRequest{err} - } - remote, err := ctx.resource.get(remoteURL) - if err != nil { - return &errBadRequest{err} - } - p := printer.NewURL(remote, opts) - return convert(ctx, p) -} - -func convertOffice(c echo.Context) error { - ctx := c.(*resourceContext) - opts, err := ctx.resource.officePrinterOptions(ctx.config.DefaultWaitTimeout()) - if err != nil { - return &errBadRequest{err} - } - fpaths, err := ctx.resource.fpaths( - ".txt", - ".rtf", - ".fodt", - ".doc", - ".docx", - ".odt", - ".xls", - ".xlsx", - ".ods", - ".ppt", - ".pptx", - ".odp", - ) - if err != nil { - return &errBadRequest{err} - } - p := printer.NewOffice(fpaths, opts) - return convert(ctx, p) -} - -func convert(ctx *resourceContext, p printer.Printer) error { - baseFilename := random.String(32) - filename := fmt.Sprintf("%s.pdf", baseFilename) - fpath := fmt.Sprintf("%s/%s", ctx.resource.formFilesDirPath, filename) - // if no webhook URL given, run conversion - // and directly return the resulting PDF file - // or an error. - if !ctx.resource.has(webhookURL) { - if err := p.Print(fpath); err != nil { - return err - } - if !ctx.resource.has(resultFilename) { - return ctx.Attachment(fpath, filename) - } - filename, err := ctx.resource.get(resultFilename) - if err != nil { - return &errBadRequest{err} - } - return ctx.Attachment(fpath, filename) - } - // as a webhook URL has been given, we - // run the following lines in a goroutine so that - // it doesn't block. - go func() { - defer ctx.resource.close() // nolint: errcheck - if err := p.Print(fpath); err != nil { - ctx.logger.Error(err) - return - } - f, err := os.Open(fpath) - if err != nil { - ctx.logger.Error(err) - return - } - defer f.Close() // nolint: errcheck - webhook, err := ctx.resource.get(webhookURL) - if err != nil { - ctx.logger.Error(err) - return - } - resp, err := http.Post(webhook, "application/pdf", f) /* #nosec */ - if err != nil { - ctx.logger.Error(err) - return - } - defer resp.Body.Close() // nolint: errcheck - }() - return nil -} diff --git a/internal/app/api/handler_test.go b/internal/app/api/handler_test.go deleted file mode 100644 index 32cfd159..00000000 --- a/internal/app/api/handler_test.go +++ /dev/null @@ -1,360 +0,0 @@ -package api - -import ( - "errors" - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" - - "github.com/labstack/echo/v4" - "github.com/stretchr/testify/assert" - "github.com/thecodingmachine/gotenberg/test" -) - -func TestMerge(t *testing.T) { - opts := DefaultOptions() - srv := New(opts) - // OK. - body, contentType := test.PDFTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // Bad request. - body, contentType = test.PDFTestMultipartForm(t, map[string]string{waitTimeout: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - // Timeout. - body, contentType = test.PDFTestMultipartForm(t, map[string]string{waitTimeout: "0"}) - req = httptest.NewRequest(http.MethodPost, "/convert/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) -} - -func TestHTML(t *testing.T) { - opts := DefaultOptions() - srv := New(opts) - // OK. - body, contentType := test.HTMLTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // Bad request. - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{waitTimeout: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{waitDelay: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{paperWidth: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{paperHeight: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{marginTop: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{marginBottom: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{marginLeft: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{marginRight: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{landscape: "not a bool"}) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - // Timeout. - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{waitTimeout: "0"}) - req = httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) -} - -func TestMarkdown(t *testing.T) { - opts := DefaultOptions() - srv := New(opts) - // OK. - body, contentType := test.MarkdownTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // Bad request. - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{waitTimeout: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{waitDelay: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{paperWidth: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{paperHeight: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{marginTop: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{marginBottom: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{marginLeft: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{marginRight: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{landscape: "not a bool"}) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - // Timeout. - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{waitTimeout: "0"}) - req = httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) -} - -func TestURL(t *testing.T) { - opts := DefaultOptions() - srv := New(opts) - // OK. - body, contentType := test.URLTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // Bad request. - body, contentType = test.URLTestMultipartForm(t, map[string]string{waitTimeout: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{waitDelay: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{paperWidth: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{paperHeight: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{marginTop: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{marginBottom: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{marginLeft: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{marginRight: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{landscape: "not a bool"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - // Timeout. - body, contentType = test.URLTestMultipartForm(t, map[string]string{waitTimeout: "0"}) - req = httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) -} - -func TestOffice(t *testing.T) { - opts := DefaultOptions() - srv := New(opts) - // OK. - body, contentType := test.OfficeTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/office", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // Bad request. - body, contentType = test.OfficeTestMultipartForm(t, map[string]string{waitTimeout: "not a float"}) - req = httptest.NewRequest(http.MethodPost, "/convert/office", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.OfficeTestMultipartForm(t, map[string]string{landscape: "not a bool"}) - req = httptest.NewRequest(http.MethodPost, "/convert/office", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, nil) - req = httptest.NewRequest(http.MethodPost, "/convert/office", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - // Timeout. - body, contentType = test.OfficeTestMultipartForm(t, map[string]string{waitTimeout: "0"}) - req = httptest.NewRequest(http.MethodPost, "/convert/office", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) -} - -func TestConcurrent(t *testing.T) { - opts := DefaultOptions() - opts.DefaultWaitTimeout = 30 - srv := New(opts) - // Merge. - test.AssertConcurrent( - t, - func() error { - body, contentType := test.MarkdownTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - return fmt.Errorf("wrong status code: want %d got %d", http.StatusOK, rec.Code) - } - return nil - }, - 10, - ) - // HTML. - test.AssertConcurrent( - t, - func() error { - body, contentType := test.HTMLTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/html", body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - return fmt.Errorf("wrong status code: want %d got %d", http.StatusOK, rec.Code) - } - return nil - }, - 10, - ) - // Markdown. - test.AssertConcurrent( - t, - func() error { - body, contentType := test.MarkdownTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/markdown", body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - return fmt.Errorf("wrong status code: want %d got %d", http.StatusOK, rec.Code) - } - return nil - }, - 10, - ) - // URL. - test.AssertConcurrent( - t, - func() error { - body, contentType := test.URLTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/url", body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - return fmt.Errorf("wrong status code: want %d got %d", http.StatusOK, rec.Code) - } - return nil - }, - 10, - ) - // Office. - test.AssertConcurrent( - t, - func() error { - body, contentType := test.OfficeTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, "/convert/office", body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - return fmt.Errorf("wrong status code: want %d got %d", http.StatusOK, rec.Code) - } - return nil - }, - 10, - ) -} - -func TestWebhook(t *testing.T) { - status := make(chan error, 2) - rcv := echo.New() - rcv.POST("/foo", func(c echo.Context) error { - if c.Request().Header.Get("Content-type") != "application/pdf" { - status <- fmt.Errorf("wrong Content-type: got %s want %s", c.Request().Header.Get("Content-type"), "application/pdf") - return nil - } - body, err := ioutil.ReadAll(c.Request().Body) - if err != nil { - status <- err - return nil - } - if body == nil || len(body) == 0 { - status <- errors.New("empty body") - return nil - } - status <- nil - return nil - }) - go func() { - rcv.Start(":3001") - }() - opts := DefaultOptions() - srv := New(opts) - body, contentType := test.PDFTestMultipartForm(t, map[string]string{webhookURL: "http://localhost:3001/foo"}) - req := httptest.NewRequest(http.MethodPost, "/convert/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - err := <-status - assert.NoError(t, err) -} - -func TestResultFilename(t *testing.T) { - opts := DefaultOptions() - srv := New(opts) - body, contentType := test.PDFTestMultipartForm(t, map[string]string{resultFilename: "foo.pdf"}) - req := httptest.NewRequest(http.MethodPost, "/convert/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - assert.Equal(t, "attachment; filename=\"foo.pdf\"", rec.Header().Get("Content-Disposition")) -} diff --git a/internal/app/api/middleware.go b/internal/app/api/middleware.go deleted file mode 100644 index 1cb35b97..00000000 --- a/internal/app/api/middleware.go +++ /dev/null @@ -1,89 +0,0 @@ -package api - -import ( - "context" - "net/http" - "strings" - - "github.com/labstack/echo/v4" - "github.com/labstack/gommon/random" - conf "github.com/thecodingmachine/gotenberg/internal/pkg/config" - log "github.com/thecodingmachine/gotenberg/internal/pkg/logger" -) - -func contextMiddleware(config *conf.Config) echo.MiddlewareFunc { - // middleware for extending the default context - // with one of our own context. - return func(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { - // generate a unique identifier for our request. - trace := random.String(32) - // create the logger for this request using - // the previous identifier as trace. - logger := log.New(config.LogLevel(), trace) - // extend the current echo context with our standard - // context. - ctx := newStandardContext(c, logger, config) - // if the endpoint is not for liveness, make a - // context with resource. - if ctx.Path() != pingEndpoint { - ctx, err := ctx.withResource(trace) - if err != nil { - ctx.Error(err) - return ctx.logEndOfRequest(err) - } - } - return next(ctx) - } - } -} - -func loggingMiddleware() echo.MiddlewareFunc { - // middleware for enabling logging. - return func(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { - ctx := c.(*standardContext) - err := next(ctx) - if err != nil { - ctx.Error(err) - } - return ctx.logEndOfRequest(err) - } - } -} - -func finalizeMiddleware() echo.MiddlewareFunc { - // middleware for removing resources at the end of a request - // and for improving response in case of error. - return func(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { - err := next(c) - ctx, ok := c.(*resourceContext) - // a resource is associated with the context. - if ok { - // if a webhookURL has been given, - // do not remove the resources here because - // we don't know if the result file has been - // generated or sent. - if !ctx.resource.has(webhookURL) { - if resourceErr := ctx.resource.close(); resourceErr != nil { - ctx.logger.Error(err) - } - } - } - if err == nil { - return nil - } - if _, ok := err.(*echo.HTTPError); ok { - return err - } - if _, ok := err.(*errBadRequest); ok { - return echo.NewHTTPError(http.StatusBadRequest, err.Error()) - } - if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { - return echo.NewHTTPError(http.StatusRequestTimeout, err.Error()) - } - return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) - } - } -} diff --git a/internal/app/api/pkg/context/context.go b/internal/app/api/pkg/context/context.go new file mode 100644 index 00000000..3b298ffc --- /dev/null +++ b/internal/app/api/pkg/context/context.go @@ -0,0 +1,137 @@ +package context + +import ( + "net/http" + "strconv" + "time" + + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" + "github.com/thecodingmachine/gotenberg/internal/pkg/config" + "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" +) + +// Context extends the default echo.Context. +type Context struct { + echo.Context + logger *logger.Logger + config *config.Config + resource *resource.Resource + startTime time.Time +} + +// New creates a new context. +func New(c echo.Context, logger *logger.Logger, config *config.Config) *Context { + // TODO timeout context? + return &Context{ + c, + logger, + config, + nil, + time.Now(), + } +} + +// MustCastFromEchoContext cast an echo.Context to our custom +// context. If something goes wrong, panic. +func MustCastFromEchoContext(c echo.Context) *Context { + ctx, ok := c.(*Context) + if !ok { + panic("unable to cast an echo.Context to a custom context") + } + return ctx +} + +// StandardLogger returns the custom logger. +// This method should be used instead of the +// default Logger() method coming from +// the echo.Context! +func (ctx *Context) StandardLogger() *logger.Logger { + return ctx.logger +} + +// Resource returns the associated resource +// to the context. +func (ctx *Context) Resource() *resource.Resource { + return ctx.resource +} + +// WithResource adds a resource to the context. +func (ctx *Context) WithResource(resourceDirPath string) error { + const op = "context.WithResource" + r, err := resource.New(ctx, ctx.logger, ctx.config, resourceDirPath) + ctx.resource = r + if err != nil { + return &standarderror.Error{ + Op: op, + Err: err, + } + } + return nil +} + +// LogRequestResult logs the result of a request. +// This method should only be used by a middleware! +func (ctx *Context) LogRequestResult(err error, isDebug bool) error { + req := ctx.Request() + resp := ctx.Response() + stopTime := time.Now() + fields := map[string]interface{}{ + "time_rfc3339": timeRFC3339(), // FIXME required? + "remote_ip": ctx.RealIP(), + "host": req.Host, + "uri": req.RequestURI, + "method": req.Method, + "path": path(req), + "referer": req.Referer(), + "user_agent": req.UserAgent(), + "status": resp.Status, + "latency": lantency(ctx.startTime, stopTime), + "latency_human": latencyHuman(ctx.startTime, stopTime), + "bytes_in": bytesIn(req), + "bytes_out": bytesOut(resp), + } + if err != nil { + ctx.logger.WithFields(fields).Error("request failed") + return err + } + if isDebug { + ctx.logger.WithFields(fields).Debug("request handled") + return nil + } + ctx.logger.WithFields(fields).Info("request handled") + return nil +} + +func timeRFC3339() string { + return time.Now().Format(time.RFC3339) +} + +func path(r *http.Request) string { + path := r.URL.Path + if path == "" { + path = "/" + } + return path +} + +func lantency(startTime time.Time, stopTime time.Time) string { + return strconv.FormatInt(int64(stopTime.Sub(startTime)), 10) +} + +func latencyHuman(startTime time.Time, stopTime time.Time) string { + return stopTime.Sub(startTime).String() +} + +func bytesIn(r *http.Request) string { + bytesIn := r.Header.Get(echo.HeaderContentLength) + if bytesIn == "" { + bytesIn = "0" + } + return bytesIn +} + +func bytesOut(r *echo.Response) string { + return strconv.FormatInt(r.Size, 10) +} diff --git a/internal/app/api/pkg/context/doc.go b/internal/app/api/pkg/context/doc.go new file mode 100644 index 00000000..4c8b2439 --- /dev/null +++ b/internal/app/api/pkg/context/doc.go @@ -0,0 +1,3 @@ +// Package context helps extending +// the default echo.Context. +package context diff --git a/internal/app/api/pkg/handler/doc.go b/internal/app/api/pkg/handler/doc.go new file mode 100644 index 00000000..c7fdafe7 --- /dev/null +++ b/internal/app/api/pkg/handler/doc.go @@ -0,0 +1,3 @@ +// Package handler contains all +// the endpoint methods of the API. +package handler diff --git a/internal/app/api/pkg/handler/handler.go b/internal/app/api/pkg/handler/handler.go new file mode 100644 index 00000000..c15b29ea --- /dev/null +++ b/internal/app/api/pkg/handler/handler.go @@ -0,0 +1,151 @@ +package handler + +import ( + "fmt" + "net/http" + "os" + + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/random" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" +) + +const ( + // PingEndpoint is the route for healthcheck. + PingEndpoint = "/ping" + // MergeEndpoint is the route for merging PDF files. + MergeEndpoint = "/merge" + // ConvertGroupEndpoint is the route of the group + // in charge of converting files to PDF. + ConvertGroupEndpoint = "/convert" + // HTMLEndpoint is the route for converting + // HTML to PDF. + HTMLEndpoint = "/html" + // URLEndpoint is the route for converting + // a URL to PDF. + URLEndpoint = "/url" + // MarkdownEndpoint is the route for converting + // Markdown to PDF. + MarkdownEndpoint = "/markdown" + // OfficeEndpoint is the route for converting + // Office files to PDF. + OfficeEndpoint = "/office" +) + +func convert(ctx *context.Context, p printer.Printer) error { + const ( + op = "convert" + debugOp = "handler.convert" + ) + r := ctx.Resource() + logger := ctx.StandardLogger() + baseFilename := random.Get() + filename := fmt.Sprintf("%s.pdf", baseFilename) + fpath := fmt.Sprintf("%s/%s", r.DirPath(), filename) + // if no webhook URL given, run conversion + // and directly return the resulting PDF file + // or an error. + if !r.Has(resource.WebhookURLFormField) { + logger.DebugfOp(debugOp, "no '%s' found, converting synchronously", resource.WebhookURLFormField) + if err := convertSync(filename, fpath, ctx, p); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil + } + // as a webhook URL has been given, we + // run the following lines in a goroutine so that + // it doesn't block. + logger.DebugfOp(debugOp, "'%s' found, converting asynchronously", resource.WebhookURLFormField) + return convertAsync(filename, fpath, ctx, p) +} + +func convertSync(filename, fpath string, ctx *context.Context, p printer.Printer) error { + const ( + op = "convertSync" + debugOp = "handler.convertSync" + ) + r := ctx.Resource() + logger := ctx.StandardLogger() + if err := p.Print(fpath); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + if !r.Has(resource.ResultFilenameFormField) { + logger.DebugfOp( + debugOp, + "no '%s' found, using generated filename '%s'", + resource.ResultFilenameFormField, + filename, + ) + if err := ctx.Attachment(fpath, filename); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil + } + logger.DebugfOp( + debugOp, + "'%s' found, so not using generated filename", + resource.ResultFilenameFormField, + ) + filename, err := r.Get(resource.ResultFilenameFormField) + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + if err := ctx.Attachment(fpath, filename); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil +} + +func convertAsync(filename, fpath string, ctx *context.Context, p printer.Printer) error { + const ( + op = "convertAsync" + debugOp = "handler.convertAsync" + ) + r := ctx.Resource() + logger := ctx.StandardLogger() + go func() { + defer r.Close() // nolint: errcheck + if err := p.Print(fpath); err != nil { + logger.ErrorOp( + op, + &standarderror.Error{Op: op, Err: err}, + ) + return + } + f, err := os.Open(fpath) + if err != nil { + logger.ErrorOp( + op, + &standarderror.Error{Op: op, Err: err}, + ) + return + } + defer f.Close() // nolint: errcheck + webhookURL, err := r.Get(resource.WebhookURLFormField) + if err != nil { + logger.ErrorOp( + op, + &standarderror.Error{Op: op, Err: err}, + ) + return + } + logger.DebugfOp( + debugOp, + "sending result file '%s' to '%s'", + filename, + webhookURL, + ) + resp, err := http.Post(webhookURL, "application/pdf", f) /* #nosec */ + if err != nil { + logger.ErrorOp( + op, + &standarderror.Error{Op: op, Err: err}, + ) + return + } + defer resp.Body.Close() // nolint: errcheck + }() + return nil +} diff --git a/internal/app/api/pkg/handler/html.go b/internal/app/api/pkg/handler/html.go new file mode 100644 index 00000000..d5850685 --- /dev/null +++ b/internal/app/api/pkg/handler/html.go @@ -0,0 +1,24 @@ +package handler + +import ( + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" +) + +// HTML is the endpoint for converting +// HTML to PDF. +func HTML(c echo.Context) error { + ctx := context.MustCastFromEchoContext(c) + r := ctx.Resource() + opts, err := r.ChromePrinterOptions() + if err != nil { + return err + } + fpath, err := r.Fpath("index.html") + if err != nil { + return err + } + p := printer.NewHTML(fpath, opts) + return convert(ctx, p) +} diff --git a/internal/app/api/pkg/handler/markdown.go b/internal/app/api/pkg/handler/markdown.go new file mode 100644 index 00000000..a4255fd2 --- /dev/null +++ b/internal/app/api/pkg/handler/markdown.go @@ -0,0 +1,27 @@ +package handler + +import ( + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" +) + +// Markdown is the endpoint for converting +// Markdown to PDF. +func Markdown(c echo.Context) error { + ctx := context.MustCastFromEchoContext(c) + r := ctx.Resource() + opts, err := r.ChromePrinterOptions() + if err != nil { + return err + } + fpath, err := r.Fpath("index.html") + if err != nil { + return err + } + p, err := printer.NewMarkdown(fpath, opts) + if err != nil { + return err + } + return convert(ctx, p) +} diff --git a/internal/app/api/pkg/handler/merge.go b/internal/app/api/pkg/handler/merge.go new file mode 100644 index 00000000..f9d1e5d1 --- /dev/null +++ b/internal/app/api/pkg/handler/merge.go @@ -0,0 +1,24 @@ +package handler + +import ( + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" +) + +// Merge is the endpoint for +// merging PDF files. +func Merge(c echo.Context) error { + ctx := context.MustCastFromEchoContext(c) + r := ctx.Resource() + opts, err := r.MergePrinterOptions() + if err != nil { + return err + } + fpaths, err := r.Fpaths(".pdf") + if err != nil { + return err + } + p := printer.NewMerge(fpaths, opts) + return convert(ctx, p) +} diff --git a/internal/app/api/pkg/handler/office.go b/internal/app/api/pkg/handler/office.go new file mode 100644 index 00000000..3cf5c315 --- /dev/null +++ b/internal/app/api/pkg/handler/office.go @@ -0,0 +1,37 @@ +package handler + +import ( + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" +) + +// Office is the endpoint for converting +// Office files to PDF. +func Office(c echo.Context) error { + ctx := context.MustCastFromEchoContext(c) + r := ctx.Resource() + opts, err := r.OfficePrinterOptions() + if err != nil { + return err + } + fpaths, err := r.Fpaths( + ".txt", + ".rtf", + ".fodt", + ".doc", + ".docx", + ".odt", + ".xls", + ".xlsx", + ".ods", + ".ppt", + ".pptx", + ".odp", + ) + if err != nil { + return err + } + p := printer.NewOffice(fpaths, opts) + return convert(ctx, p) +} diff --git a/internal/app/api/pkg/handler/ping.go b/internal/app/api/pkg/handler/ping.go new file mode 100644 index 00000000..c2fa275d --- /dev/null +++ b/internal/app/api/pkg/handler/ping.go @@ -0,0 +1,10 @@ +package handler + +import ( + "github.com/labstack/echo/v4" +) + +// Ping is the endpoint for healthcheck. +func Ping(c echo.Context) error { + return nil +} diff --git a/internal/app/api/pkg/handler/url.go b/internal/app/api/pkg/handler/url.go new file mode 100644 index 00000000..cf1bc75d --- /dev/null +++ b/internal/app/api/pkg/handler/url.go @@ -0,0 +1,25 @@ +package handler + +import ( + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" +) + +// URL is the endpoint for converting +// a URL to PDF. +func URL(c echo.Context) error { + ctx := context.MustCastFromEchoContext(c) + r := ctx.Resource() + opts, err := r.ChromePrinterOptions() + if err != nil { + return err + } + remoteURL, err := r.Get(resource.RemoteURLFormField) + if err != nil { + return err + } + p := printer.NewURL(remoteURL, opts) + return convert(ctx, p) +} diff --git a/internal/app/api/pkg/middleware/cleanup.go b/internal/app/api/pkg/middleware/cleanup.go new file mode 100644 index 00000000..ee21c9fb --- /dev/null +++ b/internal/app/api/pkg/middleware/cleanup.go @@ -0,0 +1,38 @@ +package middleware + +import ( + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" +) + +// Cleanup helps removing a resource at the end of a request. +func Cleanup() echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + const op = "middleware.Cleanup" + err := next(c) + ctx := context.MustCastFromEchoContext(c) + r := ctx.Resource() + if r == nil { + return err + } + // if a webhook URL has been given, + // do not remove the resource here because + // we don't know if the result file has been + // generated or sent. + if r.Has(resource.WebhookURLFormField) { + return err + } + // a resource is associated with our custom context. + if resourceErr := r.Close(); resourceErr != nil { + ctx.StandardLogger().ErrorOp(op, &standarderror.Error{ + Op: op, + Err: resourceErr, + }) + } + return err + } + } +} diff --git a/internal/app/api/pkg/middleware/context.go b/internal/app/api/pkg/middleware/context.go new file mode 100644 index 00000000..29dc26c0 --- /dev/null +++ b/internal/app/api/pkg/middleware/context.go @@ -0,0 +1,41 @@ +package middleware + +import ( + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/handler" + "github.com/thecodingmachine/gotenberg/internal/pkg/config" + "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/pkg/random" +) + +// Context helps extending the default echo.Context with +// our custom context. +func Context(config *config.Config) echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + // generate a unique identifier for the request. + trace := random.Get() + // create the logger for this request using + // the previous identifier as trace. + logger := logger.New(config.LogLevel(), trace) + // extend the current echo context with our custom + // context. + ctx := context.New(c, logger, config) + // if its an healthcheck request, there + // is no resource associated to it. + if ctx.Path() == handler.PingEndpoint { + return next(ctx) + } + // if the endpoint is not for healthcheck, associate a + // resource to our custom context. + if err := ctx.WithResource(trace); err != nil { + // required to have a correct status code + // in the logs. + ctx.Error(err) + return ctx.LogRequestResult(err, false) + } + return next(ctx) + } + } +} diff --git a/internal/app/api/pkg/middleware/doc.go b/internal/app/api/pkg/middleware/doc.go new file mode 100644 index 00000000..91719d08 --- /dev/null +++ b/internal/app/api/pkg/middleware/doc.go @@ -0,0 +1,3 @@ +// Package middleware contains the +// middleware of the API. +package middleware diff --git a/internal/app/api/pkg/middleware/error.go b/internal/app/api/pkg/middleware/error.go new file mode 100644 index 00000000..7cdb6199 --- /dev/null +++ b/internal/app/api/pkg/middleware/error.go @@ -0,0 +1,43 @@ +package middleware + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" +) + +// Error helps handling errors (if any). +func Error() echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + ctx := context.MustCastFromEchoContext(c) + err := next(ctx) + if err == nil { + // so far so good! + return nil + } + // we log the initial error before returning + // the HTTP error. + logger := ctx.StandardLogger() + logger.Error(err.Error()) + // handle our custom HTTP error. + var httpErr error + errCode := standarderror.Code(err) + errMessage := standarderror.Message(err) + switch errCode { + case standarderror.Invalid: + httpErr = echo.NewHTTPError(http.StatusBadRequest, errMessage) + case standarderror.Timeout: + httpErr = echo.NewHTTPError(http.StatusRequestTimeout, errMessage) + default: + httpErr = echo.NewHTTPError(http.StatusInternalServerError, errMessage) + } + // required to have a correct status code + // in the logs. + ctx.Error(httpErr) + return httpErr + } + } +} diff --git a/internal/app/api/pkg/middleware/logger.go b/internal/app/api/pkg/middleware/logger.go new file mode 100644 index 00000000..5fb2579e --- /dev/null +++ b/internal/app/api/pkg/middleware/logger.go @@ -0,0 +1,21 @@ +package middleware + +import ( + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/handler" +) + +// Logger helps logging the result of a request. +func Logger() echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + ctx := context.MustCastFromEchoContext(c) + err := next(ctx) + // we do not want to log healthcheck requests if + // log level is not set to DEBUG. + isDebug := ctx.Path() == handler.PingEndpoint + return ctx.LogRequestResult(err, isDebug) + } + } +} diff --git a/internal/app/api/pkg/resource/doc.go b/internal/app/api/pkg/resource/doc.go new file mode 100644 index 00000000..56c149b0 --- /dev/null +++ b/internal/app/api/pkg/resource/doc.go @@ -0,0 +1,5 @@ +// Package resource helps creating a folder +// containing all uploaded files and the resulting +// PDF file. It also helps centralizing all +// the form values. +package resource diff --git a/internal/app/api/pkg/resource/resource.go b/internal/app/api/pkg/resource/resource.go new file mode 100644 index 00000000..985bd30d --- /dev/null +++ b/internal/app/api/pkg/resource/resource.go @@ -0,0 +1,417 @@ +package resource + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strconv" + + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/pkg/config" + "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" +) + +const ( + // ResultFilenameFormField contains the name + // of a form field. + ResultFilenameFormField string = "resultFilename" + // WaitTimeoutFormField contains the name + // of a form field. + WaitTimeoutFormField string = "waitTimeout" + // WebhookURLFormField contains the name + // of a form field. + WebhookURLFormField string = "webhookURL" + // RemoteURLFormField contains the name + // of a form field. + RemoteURLFormField string = "remoteURL" + // WaitDelayFormField contains the name + // of a form field. + WaitDelayFormField string = "waitDelay" + // PaperWidthFormField contains the name + // of a form field. + PaperWidthFormField string = "paperWidth" + // PaperHeightFormField contains the name + // of a form field. + PaperHeightFormField string = "paperHeight" + // MarginTopFormField contains the name + // of a form field. + MarginTopFormField string = "marginTop" + // MarginBottomFormField contains the name + // of a form field. + MarginBottomFormField string = "marginBottom" + // MarginLeftFormField contains the name + // of a form field. + MarginLeftFormField string = "marginLeft" + // MarginRightFormField contains the name + // of a form field. + MarginRightFormField string = "marginRight" + // LandscapeFormField contains the name + // of a form field. + LandscapeFormField string = "landscape" +) + +// Resource helps retrieving form values +// and form files from a request. +type Resource struct { + logger *logger.Logger + config *config.Config + formValues map[string]string + formFilesDirPath string +} + +// New creates a new resource. +func New(c echo.Context, logger *logger.Logger, config *config.Config, dirPath string) (*Resource, error) { + const op = "resource.New" + r := &Resource{ + logger: logger, + config: config, + formValues: formValues(c, logger), + formFilesDirPath: dirPath, + } + if err := os.MkdirAll(dirPath, 0755); err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + r.logger.DebugfOp(op, "directory '%s' created", dirPath) + if err := formFiles(c, logger, dirPath); err != nil { + return r, &standarderror.Error{Op: op, Err: err} + } + return r, nil +} + +func formValues(c echo.Context, logger *logger.Logger) map[string]string { + const debugOp = "resource.formValues" + v := make(map[string]string) + v[ResultFilenameFormField] = c.FormValue(ResultFilenameFormField) + v[WaitTimeoutFormField] = c.FormValue(WaitTimeoutFormField) + v[WebhookURLFormField] = c.FormValue(WebhookURLFormField) + v[RemoteURLFormField] = c.FormValue(RemoteURLFormField) + v[WaitDelayFormField] = c.FormValue(WaitDelayFormField) + v[PaperWidthFormField] = c.FormValue(PaperWidthFormField) + v[PaperHeightFormField] = c.FormValue(PaperHeightFormField) + v[MarginTopFormField] = c.FormValue(MarginTopFormField) + v[MarginBottomFormField] = c.FormValue(MarginBottomFormField) + v[MarginLeftFormField] = c.FormValue(MarginLeftFormField) + v[MarginRightFormField] = c.FormValue(MarginRightFormField) + v[LandscapeFormField] = c.FormValue(LandscapeFormField) + logger.DebugfOp(debugOp, "%v", v) + return v +} + +func formFiles(c echo.Context, logger *logger.Logger, dirPath string) error { + const ( + op = "formFiles" + debugOp = "resource.formFiles" + ) + form, err := c.MultipartForm() + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + for _, files := range form.File { + for _, fh := range files { + in, err := fh.Open() + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + defer in.Close() // nolint: errcheck + fpath := fmt.Sprintf("%s/%s", dirPath, fh.Filename) + out, err := os.Create(fpath) + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + defer out.Close() // nolint: errcheck + if err := out.Chmod(0644); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + if _, err := io.Copy(out, in); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + if _, err := out.Seek(0, 0); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + logger.DebugfOp(debugOp, "'%s' created", fh.Filename) + } + } + return nil +} + +// DirPath returns the directory +// path where are stored the form +// files and the resulting PDF file. +func (r *Resource) DirPath() string { + return r.formFilesDirPath +} + +// Close deletes the working directory of the +// resource if it exists. +func (r *Resource) Close() error { + const op = "resource.Close" + if _, err := os.Stat(r.formFilesDirPath); os.IsNotExist(err) { + r.logger.DebugfOp(op, "directory '%s' does not exist, nothing to remove", r.formFilesDirPath) + return nil + } + if err := os.RemoveAll(r.formFilesDirPath); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + r.logger.DebugfOp(op, "directory '%s' removed", r.formFilesDirPath) + return nil +} + +const defaultHeaderFooterHTML string = "" + +// ChromePrinterOptions returns the Chrome printer options +// thanks to the form values and form files from the request +// plus the default values from the configuration. +func (r *Resource) ChromePrinterOptions() (*printer.ChromeOptions, error) { + const op = "resource.ChromePrinterOptions" + waitTimeout, err := r.float64(WaitTimeoutFormField, r.config.DefaultWaitTimeout()) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + waitDelay, err := r.float64(WaitDelayFormField, 0.0) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + headerHTML, err := r.content("header.html", defaultHeaderFooterHTML) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + footerHTML, err := r.content("footer.html", defaultHeaderFooterHTML) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + paperWidth, err := r.float64(PaperWidthFormField, 8.27) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + paperHeight, err := r.float64(PaperHeightFormField, 11.7) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + marginTop, err := r.float64(MarginTopFormField, 1) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + marginBottom, err := r.float64(MarginBottomFormField, 1) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + marginLeft, err := r.float64(MarginLeftFormField, 1) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + marginRight, err := r.float64(MarginRightFormField, 1) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + landscape, err := r.bool(LandscapeFormField, false) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + opts := &printer.ChromeOptions{ + WaitTimeout: waitTimeout, + WaitDelay: waitDelay, + HeaderHTML: headerHTML, + FooterHTML: footerHTML, + PaperWidth: paperWidth, + PaperHeight: paperHeight, + MarginTop: marginTop, + MarginBottom: marginBottom, + MarginLeft: marginLeft, + MarginRight: marginRight, + Landscape: landscape, + } + r.logger.DebugfOp(op, "%v", opts) + return opts, nil +} + +// OfficePrinterOptions returns the Office printer options +// thanks to the form values from the request +// plus the default values from the configuration. +func (r *Resource) OfficePrinterOptions() (*printer.OfficeOptions, error) { + const op = "resource.OfficePrinterOptions" + waitTimeout, err := r.float64(WaitTimeoutFormField, r.config.DefaultWaitTimeout()) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + landscape, err := r.bool(LandscapeFormField, false) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + opts := &printer.OfficeOptions{ + WaitTimeout: waitTimeout, + Landscape: landscape, + } + r.logger.DebugfOp(op, "%v", opts) + return opts, nil +} + +// MergePrinterOptions returns the merge printer options +// thanks to the form values from the request +// plus the default values from the configuration. +func (r *Resource) MergePrinterOptions() (*printer.MergeOptions, error) { + const op = "resource.MergePrinterOptions" + waitTimeout, err := r.float64(WaitTimeoutFormField, r.config.DefaultWaitTimeout()) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + opts := &printer.MergeOptions{ + WaitTimeout: waitTimeout, + } + r.logger.DebugfOp(op, "%v", opts) + return opts, nil +} + +// Has returns true if the resource +// contains the given form field and +// its value is not empty. +func (r *Resource) Has(formField string) bool { + v, ok := r.formValues[formField] + if ok { + ok = v != "" + } + return ok +} + +func (r *Resource) hasFile(filename string) bool { + fpath := fmt.Sprintf("%s/%s", r.formFilesDirPath, filename) + _, err := os.Stat(fpath) + return !os.IsNotExist(err) +} + +// Get returns the form field value. +func (r *Resource) Get(formField string) (string, error) { + const op = "resource.Get" + v, err := r.value(formField) + if err != nil { + return "", &standarderror.Error{Op: op, Err: err} + } + return v, nil +} + +func (r *Resource) value(formField string) (string, error) { + const op = "value" + v, ok := r.formValues[formField] + if !ok { + return "", &standarderror.Error{ + Code: standarderror.Invalid, + Message: fmt.Sprintf("'%s' does not exist", formField), + Op: op, + } + } + return v, nil +} + +func (r *Resource) float64(formField string, defaultValue float64) (float64, error) { + const op = "float64" + if !r.Has(formField) { + return defaultValue, nil + } + v, err := r.value(formField) + if err != nil { + return 0.0, &standarderror.Error{Op: op, Err: err} + } + f, err := strconv.ParseFloat(v, 64) + if err != nil { + return 0.0, &standarderror.Error{ + Code: standarderror.Invalid, + Message: fmt.Sprintf("'%s' is not a float", formField), + Op: op, + } + } + return f, nil +} + +func (r *Resource) bool(formField string, defaultValue bool) (bool, error) { + const op = "bool" + if !r.Has(formField) { + return defaultValue, nil + } + v, err := r.value(formField) + if err != nil { + return false, &standarderror.Error{Op: op, Err: err} + } + b, err := strconv.ParseBool(v) + if err != nil { + return false, &standarderror.Error{ + Code: standarderror.Invalid, + Message: fmt.Sprintf("'%s' is not a boolean", formField), + Op: op, + } + } + return b, nil +} + +// Fpath returns the path of the given filename. +// This filename should be the name of a form file. +func (r *Resource) Fpath(filename string) (string, error) { + const op = "resource.Fpath" + fpath := fmt.Sprintf("%s/%s", r.formFilesDirPath, filename) + _, err := os.Stat(fpath) + if os.IsNotExist(err) { + return "", &standarderror.Error{ + Code: standarderror.Invalid, + Message: fmt.Sprintf("file '%s' does not exist", filename), + Op: op, + } + } + absPath, err := filepath.Abs(fpath) + if err != nil { + return "", &standarderror.Error{Op: op, Err: err} + } + return absPath, nil +} + +func (r *Resource) content(filename string, defaultValue string) (string, error) { + const op = "content" + if !r.hasFile(filename) { + return defaultValue, nil + } + fpath, err := r.Fpath(filename) + if err != nil { + return "", &standarderror.Error{Op: op, Err: err} + } + b, err := ioutil.ReadFile(fpath) + if err != nil { + return "", &standarderror.Error{Op: op, Err: err} + } + return string(b), nil +} + +// Fpaths returns the list of files of the resource +// according to given file extensions. +func (r *Resource) Fpaths(exts ...string) ([]string, error) { + const op = "resource.Fpaths" + var fpaths []string + err := filepath.Walk(r.formFilesDirPath, func(path string, info os.FileInfo, _ error) error { + const walkOp = "filepath.Walk" + if info.IsDir() { + return nil + } + fpath, err := r.Fpath(info.Name()) + if err != nil { + return &standarderror.Error{Op: walkOp, Err: err} + } + for _, ext := range exts { + if filepath.Ext(fpath) == ext { + fpaths = append(fpaths, fpath) + return nil + } + } + return nil + }) + if err != nil { + return nil, &standarderror.Error{Op: op, Err: err} + } + if len(fpaths) == 0 { + return nil, &standarderror.Error{ + Code: standarderror.Invalid, + Message: fmt.Sprintf("no file found for extentions %v", exts), + Op: op, + } + } + return fpaths, nil +} diff --git a/internal/app/api/resource.go b/internal/app/api/resource.go deleted file mode 100644 index 5a359cee..00000000 --- a/internal/app/api/resource.go +++ /dev/null @@ -1,297 +0,0 @@ -package api - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strconv" - - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" -) - -const ( - resultFilename string = "resultFilename" - waitTimeout string = "waitTimeout" - webhookURL string = "webhookURL" - remoteURL string = "remoteURL" - waitDelay string = "waitDelay" - paperWidth string = "paperWidth" - paperHeight string = "paperHeight" - marginTop string = "marginTop" - marginBottom string = "marginBottom" - marginLeft string = "marginLeft" - marginRight string = "marginRight" - landscape string = "landscape" -) - -type resource struct { - formValues map[string]string - formFilesDirPath string -} - -func newResource(c echo.Context, dirPath string) (*resource, error) { - r := &resource{ - formValues: formValues(c), - } - r.formFilesDirPath = dirPath - if err := os.MkdirAll(dirPath, 0755); err != nil { - return nil, fmt.Errorf("%s: making directory: %v", dirPath, err) - } - if err := formFiles(c, dirPath); err != nil { - return r, err - } - return r, nil -} - -func formValues(c echo.Context) map[string]string { - v := make(map[string]string) - v[resultFilename] = c.FormValue(resultFilename) - v[waitTimeout] = c.FormValue(waitTimeout) - v[webhookURL] = c.FormValue(webhookURL) - v[remoteURL] = c.FormValue(remoteURL) - v[waitDelay] = c.FormValue(waitDelay) - v[paperWidth] = c.FormValue(paperWidth) - v[paperHeight] = c.FormValue(paperHeight) - v[marginTop] = c.FormValue(marginTop) - v[marginBottom] = c.FormValue(marginBottom) - v[marginLeft] = c.FormValue(marginLeft) - v[marginRight] = c.FormValue(marginRight) - v[landscape] = c.FormValue(landscape) - return v -} - -func formFiles(c echo.Context, dirPath string) error { - form, err := c.MultipartForm() - if err != nil { - return fmt.Errorf("getting multipart form: %v", err) - } - for _, files := range form.File { - for _, fh := range files { - in, err := fh.Open() - if err != nil { - return fmt.Errorf("%s: opening file: %v", fh.Filename, err) - } - defer in.Close() // nolint: errcheck - fpath := fmt.Sprintf("%s/%s", dirPath, fh.Filename) - out, err := os.Create(fpath) - if err != nil { - return fmt.Errorf("%s: creating new file: %v", fpath, err) - } - defer out.Close() // nolint: errcheck - if err := out.Chmod(0644); err != nil { - return fmt.Errorf("%s: changing file mode: %v", fpath, err) - } - if _, err := io.Copy(out, in); err != nil { - return fmt.Errorf("%s: writing file: %v", fpath, err) - } - if _, err := out.Seek(0, 0); err != nil { - return fmt.Errorf("%s: resetting read pointer: %v", fpath, err) - } - } - } - return nil -} - -func (r *resource) close() error { - if _, err := os.Stat(r.formFilesDirPath); os.IsNotExist(err) { - return nil - } - return os.RemoveAll(r.formFilesDirPath) -} - -const defaultHeaderFooterHTML string = "" - -func (r *resource) chromePrinterOptions(defaultWaitTimeout float64) (*printer.ChromeOptions, error) { - timeout, err := r.float64(waitTimeout, defaultWaitTimeout) - if err != nil { - return nil, err - } - delay, err := r.float64(waitDelay, 0.0) - if err != nil { - return nil, err - } - header, err := r.content("header.html", defaultHeaderFooterHTML) - if err != nil { - return nil, err - } - footer, err := r.content("footer.html", defaultHeaderFooterHTML) - if err != nil { - return nil, err - } - width, err := r.float64(paperWidth, 8.27) - if err != nil { - return nil, err - } - height, err := r.float64(paperHeight, 11.7) - if err != nil { - return nil, err - } - top, err := r.float64(marginTop, 1) - if err != nil { - return nil, err - } - bottom, err := r.float64(marginBottom, 1) - if err != nil { - return nil, err - } - left, err := r.float64(marginLeft, 1) - if err != nil { - return nil, err - } - right, err := r.float64(marginRight, 1) - if err != nil { - return nil, err - } - landscape, err := r.bool(landscape, false) - if err != nil { - return nil, err - } - return &printer.ChromeOptions{ - WaitTimeout: timeout, - WaitDelay: delay, - HeaderHTML: header, - FooterHTML: footer, - PaperWidth: width, - PaperHeight: height, - MarginTop: top, - MarginBottom: bottom, - MarginLeft: left, - MarginRight: right, - Landscape: landscape, - }, nil -} - -func (r *resource) officePrinterOptions(defaultWaitTimeout float64) (*printer.OfficeOptions, error) { - timeout, err := r.float64(waitTimeout, defaultWaitTimeout) - if err != nil { - return nil, err - } - landscape, err := r.bool(landscape, false) - if err != nil { - return nil, err - } - return &printer.OfficeOptions{ - WaitTimeout: timeout, - Landscape: landscape, - }, nil -} - -func (r *resource) mergePrinterOptions(defaultWaitTimeout float64) (*printer.MergeOptions, error) { - timeout, err := r.float64(waitTimeout, defaultWaitTimeout) - if err != nil { - return nil, err - } - return &printer.MergeOptions{ - WaitTimeout: timeout, - }, nil -} - -func (r *resource) has(key string) bool { - v, ok := r.formValues[key] - if ok { - ok = v != "" - } - return ok -} - -func (r *resource) hasFile(filename string) bool { - fpath := fmt.Sprintf("%s/%s", r.formFilesDirPath, filename) - _, err := os.Stat(fpath) - return !os.IsNotExist(err) -} - -func (r *resource) get(key string) (string, error) { - v, ok := r.formValues[key] - if !ok { - return "", fmt.Errorf("form value %s does not exist", key) - } - return v, nil -} - -func (r *resource) float64(key string, defaultValue float64) (float64, error) { - if !r.has(key) { - return defaultValue, nil - } - v, err := r.get(key) - if err != nil { - return 0.0, err - } - f, err := strconv.ParseFloat(v, 64) - if err != nil { - return 0.0, fmt.Errorf("form value %s: %v", key, err) - } - return f, nil -} - -func (r *resource) bool(key string, defaultValue bool) (bool, error) { - if !r.has(key) { - return defaultValue, nil - } - v, err := r.get(key) - if err != nil { - return false, err - } - b, err := strconv.ParseBool(v) - if err != nil { - return false, fmt.Errorf("form value %s: %v", key, err) - } - return b, nil -} - -func (r *resource) fpath(filename string) (string, error) { - fpath := fmt.Sprintf("%s/%s", r.formFilesDirPath, filename) - _, err := os.Stat(fpath) - if os.IsNotExist(err) { - return "", fmt.Errorf("%s: form file does not exist", filename) - } - absPath, err := filepath.Abs(fpath) - if err != nil { - return "", fmt.Errorf("%s: getting absolute path: %v", fpath, err) - } - return absPath, nil -} - -func (r *resource) content(filename string, defaultValue string) (string, error) { - if !r.hasFile(filename) { - return defaultValue, nil - } - fpath, err := r.fpath(filename) - if err != nil { - return "", err - } - b, err := ioutil.ReadFile(fpath) - if err != nil { - return "", fmt.Errorf("%s: reading form file: %v", fpath, err) - } - return string(b), nil -} - -func (r *resource) fpaths(exts ...string) ([]string, error) { - var fpaths []string - err := filepath.Walk(r.formFilesDirPath, func(path string, info os.FileInfo, _ error) error { - if info.IsDir() { - return nil - } - fpath, err := r.fpath(info.Name()) - if err != nil { - return err - } - for _, ext := range exts { - if filepath.Ext(fpath) == ext { - fpaths = append(fpaths, fpath) - return nil - } - } - return nil - }) - if err != nil { - return nil, err - } - if len(fpaths) == 0 { - return nil, fmt.Errorf("no form files found for extensions: %v", exts) - } - return fpaths, nil -} diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go new file mode 100644 index 00000000..56dca33d --- /dev/null +++ b/internal/pkg/config/config.go @@ -0,0 +1,122 @@ +package config + +import ( + "fmt" + "os" + "strconv" + + log "github.com/sirupsen/logrus" +) + +const ( + defaultWaitTimeoutEnvVar = "DEFAULT_WAIT_TIMEOUT" + defaultListenPortEnvVar = "DEFAULT_LISTEN_PORT" + disableGoogleChromeEnvVar = "DISABLE_GOOGLE_CHROME" + disableUnoconvEnvVar = "DISABLE_UNOCONV" + logLevelEnvVar = "LOG_LEVEL" +) + +type Config struct { + defaultWaitTimeout float64 + defaultListenPort string + enableChromeEndpoints bool + enableUnoconvEndpoints bool + logLevel log.Level +} + +func defaultConfig() *Config { + return &Config{ + defaultWaitTimeout: 10, + defaultListenPort: "3000", + enableChromeEndpoints: true, + enableUnoconvEndpoints: true, + logLevel: log.InfoLevel, + } +} + +func FromEnv() (*Config, error) { + c := defaultConfig() + defaultWaitTimeout, err := defaultWaitTimeoutFromEnv(defaultWaitTimeoutEnvVar, c.DefaultWaitTimeout()) + c.defaultWaitTimeout = defaultWaitTimeout + if err != nil { + return c, err + } + defaultListenPort, err := defaultListenPortFromEnv(defaultListenPortEnvVar, c.DefaultListenPort()) + c.defaultListenPort = defaultListenPort + if err != nil { + return c, err + } + disableChromeEndpoints, err := boolFromEnv(disableGoogleChromeEnvVar, c.EnableChromeEndpoints()) + c.enableChromeEndpoints = !disableChromeEndpoints + if err != nil { + return c, err + } + disableUnoconvEndpoints, err := boolFromEnv(disableUnoconvEnvVar, c.EnableUnoconvEndpoints()) + c.enableUnoconvEndpoints = !disableUnoconvEndpoints + if err != nil { + return c, err + } + logLevel, err := logLevelFromEnv(logLevelEnvVar, c.LogLevel()) + c.logLevel = logLevel + if err != nil { + return c, err + } + return c, nil +} + +func (c *Config) DefaultWaitTimeout() float64 { return c.defaultWaitTimeout } +func (c *Config) DefaultListenPort() string { return c.defaultListenPort } +func (c *Config) EnableChromeEndpoints() bool { return c.enableChromeEndpoints } +func (c *Config) EnableUnoconvEndpoints() bool { return c.enableUnoconvEndpoints } +func (c *Config) LogLevel() log.Level { return c.logLevel } + +func defaultWaitTimeoutFromEnv(envVar string, defaultValue float64) (float64, error) { + if v, ok := os.LookupEnv(envVar); ok { + waitTimeout, err := strconv.ParseFloat(v, 64) + if err != nil { + return defaultValue, fmt.Errorf("%s: wrong value: want float got %v", envVar, err) + } + return waitTimeout, nil + } + return defaultValue, nil +} + +func defaultListenPortFromEnv(envVar string, defaultValue string) (string, error) { + if v, ok := os.LookupEnv(envVar); ok { + portAsUint, err := strconv.ParseUint(v, 10, 64) + if err != nil { + return defaultValue, fmt.Errorf("%s: wrong value: want uint got %v", envVar, err) + } + if portAsUint > 65535 { + return defaultValue, fmt.Errorf("%s: wrong value: want uint < 65535 got %d", envVar, portAsUint) + } + return v, nil + } + return defaultValue, nil +} + +func boolFromEnv(envVar string, defaultValue bool) (bool, error) { + if v, ok := os.LookupEnv(envVar); ok { + if v != "1" && v != "0" { + return defaultValue, fmt.Errorf("%s: wrong value: want \"0\" or \"1\" got %s", envVar, v) + } + return v == "1", nil + } + return defaultValue, nil +} + +func logLevelFromEnv(envVar string, defaultValue log.Level) (log.Level, error) { + if v, ok := os.LookupEnv(envVar); ok { + switch v { + case "DEBUG": + return log.DebugLevel, nil + case "INFO": + return log.InfoLevel, nil + case "ERROR": + return log.ErrorLevel, nil + default: + return defaultValue, fmt.Errorf("%s: wrong value: want \"DEBUG\",\"INFO\" or \"ERROR\" got %s", envVar, v) + } + } + return defaultValue, nil +} diff --git a/internal/pkg/config/doc.go b/internal/pkg/config/doc.go new file mode 100644 index 00000000..d912156b --- /dev/null +++ b/internal/pkg/config/doc.go @@ -0,0 +1 @@ +package config diff --git a/internal/pkg/logger/doc.go b/internal/pkg/logger/doc.go new file mode 100644 index 00000000..90c66f62 --- /dev/null +++ b/internal/pkg/logger/doc.go @@ -0,0 +1 @@ +package logger diff --git a/internal/pkg/logger/logger.go b/internal/pkg/logger/logger.go new file mode 100644 index 00000000..cd290564 --- /dev/null +++ b/internal/pkg/logger/logger.go @@ -0,0 +1,33 @@ +package logger + +import ( + "github.com/sirupsen/logrus" +) + +// Logger enforces specific log message formats. +type Logger struct { + *logrus.Entry +} + +// New initializes the logger. +func New(level logrus.Level, trace string) *Logger { + l := logrus.New() + l.SetLevel(level) + // TODO no formatter if TTY. + l.SetFormatter(&logrus.JSONFormatter{}) + return &Logger{ + l.WithField("trace", trace), + } +} + +// DebugfOp logs a debug message for given +// logical operation. +func (l *Logger) DebugfOp(op string, format string, args ...interface{}) { + l.WithField("op", op).Debugf(format, args...) +} + +// ErrorOp logs an error message for given +// logical operation. +func (l *Logger) ErrorOp(op string, err error) { + l.WithField("op", op).Error(err.Error()) +} diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index aa04d4f1..df87a4e5 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -5,7 +5,7 @@ import ( "time" "github.com/mafredri/cdp/devtool" - log "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/pkg/logger" ) const warmupTime = 10 * time.Second @@ -16,7 +16,7 @@ type chrome struct { // NewChrome returns a Google Chrome // headless process. -func NewChrome(logger *log.StandardLogger) Process { +func NewChrome(logger *logger.Logger) Process { return &chrome{ manager: &processManager{logger: logger}, } @@ -61,7 +61,10 @@ func (p *chrome) viable() bool { // check if Google Chrome is correctly running. ctx, cancel := context.WithCancel(context.Background()) defer cancel() - p.manager.logger.Debugf("%s: checking liveness via debug version endpoint http://localhost:9222/json/version", p.Fullname()) + p.manager.logger.Debugf( + "%s: checking liveness via debug version endpoint http://localhost:9222/json/version", + p.Fullname(), + ) v, err := devtool.New("http://localhost:9222").Version(ctx) if err != nil { p.manager.logger.Debugf("%s: debug version endpoint returned error: %v", p.Fullname(), err) diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go index 2850c9ac..c53709fa 100644 --- a/internal/pkg/pm2/pm2.go +++ b/internal/pkg/pm2/pm2.go @@ -7,7 +7,7 @@ import ( "os/exec" "strings" - log "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/pkg/logger" ) const ( @@ -30,7 +30,7 @@ type Process interface { type processManager struct { heuristicState int32 - logger *log.StandardLogger + logger *logger.Logger } func (m *processManager) start(p Process) error { diff --git a/internal/pkg/pm2/unoconv.go b/internal/pkg/pm2/unoconv.go index 9350ab26..2bd53745 100644 --- a/internal/pkg/pm2/unoconv.go +++ b/internal/pkg/pm2/unoconv.go @@ -1,7 +1,7 @@ package pm2 import ( - log "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/pkg/logger" ) type unoconv struct { @@ -10,7 +10,7 @@ type unoconv struct { // NewUnoconv returns a unoconv listener // process. -func NewUnoconv(logger *log.StandardLogger) Process { +func NewUnoconv(logger *logger.Logger) Process { return &unoconv{ manager: &processManager{logger: logger}, } diff --git a/internal/pkg/random/doc.go b/internal/pkg/random/doc.go new file mode 100644 index 00000000..d79456c1 --- /dev/null +++ b/internal/pkg/random/doc.go @@ -0,0 +1,3 @@ +// Package random helps generating +// a random string. +package random diff --git a/internal/pkg/random/random.go b/internal/pkg/random/random.go new file mode 100644 index 00000000..07556b5b --- /dev/null +++ b/internal/pkg/random/random.go @@ -0,0 +1,10 @@ +package random + +import ( + "github.com/labstack/gommon/random" +) + +// Get returns a random string. +func Get() string { + return random.String(32) +} diff --git a/internal/pkg/standarderror/doc.go b/internal/pkg/standarderror/doc.go new file mode 100644 index 00000000..b834229b --- /dev/null +++ b/internal/pkg/standarderror/doc.go @@ -0,0 +1,5 @@ +// Package standarderror helps standardizing +// the errors in the application. +// +// Credits: https://middlemost.com/failure-is-your-domain/ +package standarderror diff --git a/internal/pkg/standarderror/standarderror.go b/internal/pkg/standarderror/standarderror.go new file mode 100644 index 00000000..f77bbe58 --- /dev/null +++ b/internal/pkg/standarderror/standarderror.go @@ -0,0 +1,85 @@ +package standarderror + +import ( + "bytes" + "fmt" +) + +const ( + // Internal is a code + // for internal errors. + Internal = "internal" + // Invalid is a code + // for validation errors. + Invalid = "invalid" + // Timeout is a code + // for timeout errors. + Timeout = "timeout" +) + +// Error defines a standard application +// error. +type Error struct { + // Code is a machine-readable + // error code. + Code string + // Message is a human-readable + // message. + Message string + // Op is a logical operation. + Op string + // Err is a nested error. + Err error +} + +// Error returns the string representation of the error message. +func (err *Error) Error() string { + var buf bytes.Buffer + // print the current operation in our stack, if any. + if err.Op != "" { + fmt.Fprintf(&buf, "%s: ", err.Op) + } + // if wrapping an error, print its Error() message. + // Otherwise print the error code & message. + if err.Err != nil { + buf.WriteString(err.Err.Error()) + } else { + if err.Code != "" { + fmt.Fprintf(&buf, "<%s> ", err.Code) + } + buf.WriteString(err.Message) + } + return buf.String() +} + +// Code returns the code of the root error, if available. +// Otherwise returns Internal. +func Code(err error) string { + if err == nil { + return "" + } + e, ok := err.(*Error) + if ok && e.Code != "" { + return e.Code + } + if ok && e.Err != nil { + return Code(e.Err) + } + return Internal +} + +// Message returns the human-readable message of the error, if available. +// Otherwise returns a generic error message. +func Message(err error) string { + if err == nil { + return "" + } + e, ok := err.(*Error) + if ok && e.Message != "" { + return e.Message + } + if ok && e.Err != nil { + return Message(e.Err) + } + return "An internal error has occurred. Please contact technical support." +} From 5f6ab2fc087cf28c6404def3faece30f3545616b Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Sun, 7 Jul 2019 19:54:44 +0200 Subject: [PATCH 012/107] all logs now have an op field --- build/lint/Dockerfile | 2 +- build/tests/Dockerfile | 2 +- cmd/gotenberg/main.go | 31 +++--- go.mod | 1 + internal/app/api/pkg/context/context.go | 12 +-- internal/app/api/pkg/middleware/error.go | 3 +- internal/app/api/pkg/resource/resource.go | 4 +- internal/pkg/config/config.go | 100 +++++++++++++++----- internal/pkg/config/doc.go | 2 + internal/pkg/logger/doc.go | 2 + internal/pkg/logger/logger.go | 44 +++++++-- internal/pkg/pm2/chrome.go | 39 ++++++-- internal/pkg/pm2/pm2.go | 28 ++++-- internal/pkg/pm2/unoconv.go | 13 ++- internal/pkg/standarderror/doc.go | 10 +- internal/pkg/standarderror/standarderror.go | 32 ++++++- 16 files changed, 240 insertions(+), 85 deletions(-) diff --git a/build/lint/Dockerfile b/build/lint/Dockerfile index 869447e6..87fc8096 100644 --- a/build/lint/Dockerfile +++ b/build/lint/Dockerfile @@ -22,7 +22,7 @@ RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.s # | Last instructions of this build. # | -# Define our workding outside of $GOPATH (we're using go modules). +# Define our working directory outside of $GOPATH (we're using go modules). WORKDIR /lint # Copy our module dependencies definitions. diff --git a/build/tests/Dockerfile b/build/tests/Dockerfile index 0c8b7c32..7aaa9586 100644 --- a/build/tests/Dockerfile +++ b/build/tests/Dockerfile @@ -35,7 +35,7 @@ ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH # | Last instructions of this build. # | -# Define our workding outside of $GOPATH (we're using go modules). +# Define our working directory outside of $GOPATH (we're using go modules). WORKDIR /tests # Copy our module dependencies definitions. diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index c3382512..28a8e976 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -9,8 +9,8 @@ import ( "time" "github.com/thecodingmachine/gotenberg/internal/app/api" - conf "github.com/thecodingmachine/gotenberg/internal/pkg/config" - log "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/pkg/config" + "github.com/thecodingmachine/gotenberg/internal/pkg/logger" "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" ) @@ -19,12 +19,13 @@ import ( var version = "snapshot" func main() { - config, err := conf.FromEnv() - systemLogger := log.New(config.LogLevel(), "system") + const op = "main" + config, err := config.FromEnv() + systemLogger := logger.New(config.LogLevel(), "system") if err != nil { - systemLogger.Fatal(err) + systemLogger.FatalOp(op, err) } - systemLogger.Infof("Gotenberg %s", version) + systemLogger.InfofOp(op, "Gotenberg %s", version) // start PM2 processes. var processes []pm2.Process if config.EnableChromeEndpoints() { @@ -34,19 +35,19 @@ func main() { processes = append(processes, pm2.NewUnoconv(systemLogger)) } for _, p := range processes { - systemLogger.Infof("starting %s with PM2...", p.Fullname()) + systemLogger.InfofOp(op, "starting %s with PM2...", p.Fullname()) if err := p.Start(); err != nil { - systemLogger.Fatal(err) + systemLogger.FatalOp(op, err) } } // run our API in a goroutine so that it doesn't block. // create our API. srv := api.New(config) go func() { - systemLogger.Infof("http server started on port %s", config.DefaultListenPort()) + systemLogger.InfofOp(op, "http server started on port %s", config.DefaultListenPort()) if err := srv.Start(fmt.Sprintf(":%s", config.DefaultListenPort())); err != nil { if err != http.ErrServerClosed { - systemLogger.Fatal(err) + systemLogger.FatalOp(op, err) } } }() @@ -61,17 +62,17 @@ func main() { defer cancel() // doesn't block if no connections, but will otherwise wait // until the timeout deadline. - systemLogger.Info("shutting down http server...") + systemLogger.InfofOp(op, "shutting down http server...") if err := srv.Shutdown(ctx); err != nil { - systemLogger.Fatal(err) + systemLogger.FatalOp(op, err) } // shutdown PM2 processes. for _, p := range processes { - systemLogger.Infof("shutting down %s with PM2...", p.Fullname()) + systemLogger.InfofOp(op, "shutting down %s with PM2...", p.Fullname()) if err := p.Shutdown(); err != nil { - systemLogger.Fatal(err) + systemLogger.FatalOp(op, err) } } - systemLogger.Info("bye!") + systemLogger.InfofOp(op, "bye!") os.Exit(0) } diff --git a/go.mod b/go.mod index 82700001..12672302 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/labstack/echo/v4 v4.1.6 github.com/labstack/gommon v0.2.9 github.com/mafredri/cdp v0.23.4 + github.com/mattn/go-isatty v0.0.8 github.com/microcosm-cc/bluemonday v1.0.2 github.com/russross/blackfriday/v2 v2.0.1 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect diff --git a/internal/app/api/pkg/context/context.go b/internal/app/api/pkg/context/context.go index 3b298ffc..1ee8ab5b 100644 --- a/internal/app/api/pkg/context/context.go +++ b/internal/app/api/pkg/context/context.go @@ -74,11 +74,11 @@ func (ctx *Context) WithResource(resourceDirPath string) error { // LogRequestResult logs the result of a request. // This method should only be used by a middleware! func (ctx *Context) LogRequestResult(err error, isDebug bool) error { + const op = "context.LogRequestResult" req := ctx.Request() resp := ctx.Response() stopTime := time.Now() fields := map[string]interface{}{ - "time_rfc3339": timeRFC3339(), // FIXME required? "remote_ip": ctx.RealIP(), "host": req.Host, "uri": req.RequestURI, @@ -93,21 +93,17 @@ func (ctx *Context) LogRequestResult(err error, isDebug bool) error { "bytes_out": bytesOut(resp), } if err != nil { - ctx.logger.WithFields(fields).Error("request failed") + ctx.logger.WithFields(fields).ErrorfOp(op, "request failed") return err } if isDebug { - ctx.logger.WithFields(fields).Debug("request handled") + ctx.logger.WithFields(fields).DebugfOp(op, "request handled") return nil } - ctx.logger.WithFields(fields).Info("request handled") + ctx.logger.WithFields(fields).InfofOp(op, "request handled") return nil } -func timeRFC3339() string { - return time.Now().Format(time.RFC3339) -} - func path(r *http.Request) string { path := r.URL.Path if path == "" { diff --git a/internal/app/api/pkg/middleware/error.go b/internal/app/api/pkg/middleware/error.go index 7cdb6199..48928e26 100644 --- a/internal/app/api/pkg/middleware/error.go +++ b/internal/app/api/pkg/middleware/error.go @@ -20,8 +20,9 @@ func Error() echo.MiddlewareFunc { } // we log the initial error before returning // the HTTP error. + errOp := standarderror.Op(err) logger := ctx.StandardLogger() - logger.Error(err.Error()) + logger.ErrorOp(errOp, err) // handle our custom HTTP error. var httpErr error errCode := standarderror.Code(err) diff --git a/internal/app/api/pkg/resource/resource.go b/internal/app/api/pkg/resource/resource.go index 985bd30d..67d0eda9 100644 --- a/internal/app/api/pkg/resource/resource.go +++ b/internal/app/api/pkg/resource/resource.go @@ -318,7 +318,7 @@ func (r *Resource) float64(formField string, defaultValue float64) (float64, err if err != nil { return 0.0, &standarderror.Error{ Code: standarderror.Invalid, - Message: fmt.Sprintf("'%s' is not a float", formField), + Message: fmt.Sprintf("'%s' is not a float, got '%s'", formField, v), Op: op, } } @@ -338,7 +338,7 @@ func (r *Resource) bool(formField string, defaultValue bool) (bool, error) { if err != nil { return false, &standarderror.Error{ Code: standarderror.Invalid, - Message: fmt.Sprintf("'%s' is not a boolean", formField), + Message: fmt.Sprintf("'%s' is not a boolean, got '%s'", formField, v), Op: op, } } diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 56dca33d..10168ff3 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -5,7 +5,8 @@ import ( "os" "strconv" - log "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) const ( @@ -16,12 +17,14 @@ const ( logLevelEnvVar = "LOG_LEVEL" ) +// Config contains the application +// configuration. type Config struct { defaultWaitTimeout float64 defaultListenPort string enableChromeEndpoints bool enableUnoconvEndpoints bool - logLevel log.Level + logLevel logrus.Level } func defaultConfig() *Config { @@ -30,51 +33,85 @@ func defaultConfig() *Config { defaultListenPort: "3000", enableChromeEndpoints: true, enableUnoconvEndpoints: true, - logLevel: log.InfoLevel, + logLevel: logrus.InfoLevel, } } +// FromEnv fetches configuration +// from environment variables. func FromEnv() (*Config, error) { + const op = "config.FromEnv" c := defaultConfig() defaultWaitTimeout, err := defaultWaitTimeoutFromEnv(defaultWaitTimeoutEnvVar, c.DefaultWaitTimeout()) c.defaultWaitTimeout = defaultWaitTimeout if err != nil { - return c, err + return c, &standarderror.Error{Op: op, Err: err} } defaultListenPort, err := defaultListenPortFromEnv(defaultListenPortEnvVar, c.DefaultListenPort()) c.defaultListenPort = defaultListenPort if err != nil { - return c, err + return c, &standarderror.Error{Op: op, Err: err} } disableChromeEndpoints, err := boolFromEnv(disableGoogleChromeEnvVar, c.EnableChromeEndpoints()) c.enableChromeEndpoints = !disableChromeEndpoints if err != nil { - return c, err + return c, &standarderror.Error{Op: op, Err: err} } disableUnoconvEndpoints, err := boolFromEnv(disableUnoconvEnvVar, c.EnableUnoconvEndpoints()) c.enableUnoconvEndpoints = !disableUnoconvEndpoints if err != nil { - return c, err + return c, &standarderror.Error{Op: op, Err: err} } logLevel, err := logLevelFromEnv(logLevelEnvVar, c.LogLevel()) c.logLevel = logLevel if err != nil { - return c, err + return c, &standarderror.Error{Op: op, Err: err} } return c, nil } -func (c *Config) DefaultWaitTimeout() float64 { return c.defaultWaitTimeout } -func (c *Config) DefaultListenPort() string { return c.defaultListenPort } -func (c *Config) EnableChromeEndpoints() bool { return c.enableChromeEndpoints } -func (c *Config) EnableUnoconvEndpoints() bool { return c.enableUnoconvEndpoints } -func (c *Config) LogLevel() log.Level { return c.logLevel } +// DefaultWaitTimeout returns the default +// wait timeout from the configuration. +func (c *Config) DefaultWaitTimeout() float64 { + return c.defaultWaitTimeout +} + +// DefaultListenPort returns the default +// listen port from the configuration. +func (c *Config) DefaultListenPort() string { + return c.defaultListenPort +} + +// EnableChromeEndpoints returns true if +// Chrome endpoints are enabled in the +// configuration. +func (c *Config) EnableChromeEndpoints() bool { + return c.enableChromeEndpoints +} + +// EnableUnoconvEndpoints returns true if +// Unoconv endpoints are enabled in the +// configuration. +func (c *Config) EnableUnoconvEndpoints() bool { + return c.enableUnoconvEndpoints +} + +// LogLevel returns the logrus.Level from +// the configuration. +func (c *Config) LogLevel() logrus.Level { + return c.logLevel +} func defaultWaitTimeoutFromEnv(envVar string, defaultValue float64) (float64, error) { + const op = "defaultWaitTimeoutFromEnv" if v, ok := os.LookupEnv(envVar); ok { waitTimeout, err := strconv.ParseFloat(v, 64) if err != nil { - return defaultValue, fmt.Errorf("%s: wrong value: want float got %v", envVar, err) + return defaultValue, &standarderror.Error{ + Code: standarderror.Invalid, + Message: fmt.Sprintf("'%s' is not a float, got '%s'", envVar, v), + Op: op, + } } return waitTimeout, nil } @@ -82,13 +119,22 @@ func defaultWaitTimeoutFromEnv(envVar string, defaultValue float64) (float64, er } func defaultListenPortFromEnv(envVar string, defaultValue string) (string, error) { + const op = "defaultListenPortFromEnv" if v, ok := os.LookupEnv(envVar); ok { portAsUint, err := strconv.ParseUint(v, 10, 64) if err != nil { - return defaultValue, fmt.Errorf("%s: wrong value: want uint got %v", envVar, err) + return defaultValue, &standarderror.Error{ + Code: standarderror.Invalid, + Message: fmt.Sprintf("'%s' is not a uint, got '%s'", envVar, v), + Op: op, + } } if portAsUint > 65535 { - return defaultValue, fmt.Errorf("%s: wrong value: want uint < 65535 got %d", envVar, portAsUint) + return defaultValue, &standarderror.Error{ + Code: standarderror.Invalid, + Message: fmt.Sprintf("'%s' is not a uint < 65535, got '%d'", envVar, portAsUint), + Op: op, + } } return v, nil } @@ -96,26 +142,36 @@ func defaultListenPortFromEnv(envVar string, defaultValue string) (string, error } func boolFromEnv(envVar string, defaultValue bool) (bool, error) { + const op = "boolFromEnv" if v, ok := os.LookupEnv(envVar); ok { if v != "1" && v != "0" { - return defaultValue, fmt.Errorf("%s: wrong value: want \"0\" or \"1\" got %s", envVar, v) + return defaultValue, &standarderror.Error{ + Code: standarderror.Invalid, + Message: fmt.Sprintf("'%s' is not '0' or '1', got %s", envVar, v), + Op: op, + } } return v == "1", nil } return defaultValue, nil } -func logLevelFromEnv(envVar string, defaultValue log.Level) (log.Level, error) { +func logLevelFromEnv(envVar string, defaultValue logrus.Level) (logrus.Level, error) { + const op = "logLevelFromEnv" if v, ok := os.LookupEnv(envVar); ok { switch v { case "DEBUG": - return log.DebugLevel, nil + return logrus.DebugLevel, nil case "INFO": - return log.InfoLevel, nil + return logrus.InfoLevel, nil case "ERROR": - return log.ErrorLevel, nil + return logrus.ErrorLevel, nil default: - return defaultValue, fmt.Errorf("%s: wrong value: want \"DEBUG\",\"INFO\" or \"ERROR\" got %s", envVar, v) + return defaultValue, &standarderror.Error{ + Code: standarderror.Invalid, + Message: fmt.Sprintf("'%s' is not 'DEBUG', 'INFO' or 'ERROR', got '%s'", envVar, v), + Op: op, + } } } return defaultValue, nil diff --git a/internal/pkg/config/doc.go b/internal/pkg/config/doc.go index d912156b..55b7416f 100644 --- a/internal/pkg/config/doc.go +++ b/internal/pkg/config/doc.go @@ -1 +1,3 @@ +// Package config gathers all +// configuration data. package config diff --git a/internal/pkg/logger/doc.go b/internal/pkg/logger/doc.go index 90c66f62..b9fcafe6 100644 --- a/internal/pkg/logger/doc.go +++ b/internal/pkg/logger/doc.go @@ -1 +1,3 @@ +// Package logger defines a standard +// logger for the application. package logger diff --git a/internal/pkg/logger/logger.go b/internal/pkg/logger/logger.go index cd290564..ee24d8c3 100644 --- a/internal/pkg/logger/logger.go +++ b/internal/pkg/logger/logger.go @@ -1,33 +1,63 @@ package logger import ( + "os" + + "github.com/mattn/go-isatty" "github.com/sirupsen/logrus" ) // Logger enforces specific log message formats. type Logger struct { - *logrus.Entry + entry *logrus.Entry } // New initializes the logger. func New(level logrus.Level, trace string) *Logger { l := logrus.New() l.SetLevel(level) - // TODO no formatter if TTY. - l.SetFormatter(&logrus.JSONFormatter{}) + if !isatty.IsTerminal(os.Stdout.Fd()) { + l.SetFormatter(&logrus.JSONFormatter{}) + } return &Logger{ - l.WithField("trace", trace), + entry: l.WithField("trace", trace), + } +} + +// WithFields creates a new logger with +// given fields. +func (l *Logger) WithFields(fields map[string]interface{}) *Logger { + return &Logger{ + entry: l.entry.WithFields(fields), } } // DebugfOp logs a debug message for given // logical operation. func (l *Logger) DebugfOp(op string, format string, args ...interface{}) { - l.WithField("op", op).Debugf(format, args...) + l.entry.WithField("op", op).Debugf(format, args...) } -// ErrorOp logs an error message for given +// InfofOp logs an info message for given +// logical operation. +func (l *Logger) InfofOp(op string, format string, args ...interface{}) { + l.entry.WithField("op", op).Infof(format, args...) +} + +// ErrorOp logs an error for given // logical operation. func (l *Logger) ErrorOp(op string, err error) { - l.WithField("op", op).Error(err.Error()) + l.entry.WithField("op", op).Error(err.Error()) +} + +// ErrorfOp logs an error message for given +// logical operation. +func (l *Logger) ErrorfOp(op string, message string) { + l.entry.WithField("op", op).Error(message) +} + +// FatalOp logs an error message for given +// logical operation. +func (l *Logger) FatalOp(op string, err error) { + l.entry.WithField("op", op).Error(err.Error()) } diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index df87a4e5..07abc846 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -6,6 +6,7 @@ import ( "github.com/mafredri/cdp/devtool" "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) const warmupTime = 10 * time.Second @@ -27,11 +28,19 @@ func (p *chrome) Fullname() string { } func (p *chrome) Start() error { - return p.manager.start(p) + const op = "chrome.Start" + if err := p.manager.start(p); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } func (p *chrome) Shutdown() error { - return p.manager.shutdown(p) + const op = "chrome.Shutdown" + if err := p.manager.shutdown(p); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } func (p *chrome) args() []string { @@ -58,24 +67,38 @@ func (p *chrome) name() string { } func (p *chrome) viable() bool { + const debugOp = "chrome.viable" // check if Google Chrome is correctly running. ctx, cancel := context.WithCancel(context.Background()) defer cancel() - p.manager.logger.Debugf( - "%s: checking liveness via debug version endpoint http://localhost:9222/json/version", - p.Fullname(), + p.manager.logger.DebugfOp( + debugOp, + "checking liveness via debug version endpoint http://localhost:9222/json/version", ) v, err := devtool.New("http://localhost:9222").Version(ctx) if err != nil { - p.manager.logger.Debugf("%s: debug version endpoint returned error: %v", p.Fullname(), err) + p.manager.logger.DebugfOp( + debugOp, + "debug version endpoint returned error: %v", + err, + ) return false } - p.manager.logger.Debugf("%s: debug version endpoint returned version info: %+v", p.Fullname(), *v) + p.manager.logger.DebugfOp( + debugOp, + "debug version endpoint returned version info: %+v", + *v, + ) return true } func (p *chrome) warmup() { - p.manager.logger.Debugf("%s: allowing %v to startup", p.Fullname(), warmupTime) + const debugOp = "chrome.warmup" + p.manager.logger.DebugfOp( + debugOp, + "allowing %v to startup", + warmupTime, + ) time.Sleep(warmupTime) } diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go index c53709fa..065ff5eb 100644 --- a/internal/pkg/pm2/pm2.go +++ b/internal/pkg/pm2/pm2.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) const ( @@ -34,8 +35,9 @@ type processManager struct { } func (m *processManager) start(p Process) error { + const op = "pm2.start" if err := m.pm2(p, "start"); err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } p.warmup() if !p.viable() { @@ -43,14 +45,17 @@ func (m *processManager) start(p Process) error { for attempts < 5 && !p.viable() { if err := m.pm2(p, "restart"); err != nil { m.heuristicState = errorState - return err + return &standarderror.Error{Op: op, Err: err} } p.warmup() attempts++ } if !p.viable() { m.heuristicState = errorState - return fmt.Errorf("failed to launch %s", p.Fullname()) + return &standarderror.Error{ + Op: op, + Message: fmt.Sprintf("failed to launch %s", p.Fullname()), + } } } m.heuristicState = runningState @@ -58,18 +63,20 @@ func (m *processManager) start(p Process) error { } func (m *processManager) shutdown(p Process) error { + const op = "pm2.shutdown" if m.heuristicState != runningState { return nil } if err := m.pm2(p, "stop"); err != nil { m.heuristicState = errorState - return err + return &standarderror.Error{Op: op, Err: err} } m.heuristicState = stoppedState return nil } func (m *processManager) pm2(p Process, cmdName string) error { + const op = "pm2.pm2" cmdArgs := []string{ cmdName, p.name(), @@ -82,35 +89,36 @@ func (m *processManager) pm2(p Process, cmdName string) error { "pm2", cmdArgs..., ) - m.logger.Debugf("executing command: %v", strings.Join(cmd.Args, " ")) + m.logger.DebugfOp(op, "executing command: %s", strings.Join(cmd.Args, " ")) processStdOut, err := cmd.StdoutPipe() if err != nil { - return fmt.Errorf("failed getting stdout from %s: %s", p.Fullname(), err) + return &standarderror.Error{Op: op, Err: err} } processStdErr, err := cmd.StderrPipe() if err != nil { - return fmt.Errorf("failed getting stderr from %s: %s", p.Fullname(), err) + return &standarderror.Error{Op: op, Err: err} } readFromPipe := func(outputType string, reader io.ReadCloser) { + readFromPipeOp := fmt.Sprintf("pm2.%s.%s", p.name(), outputType) r := bufio.NewReader(reader) defer reader.Close() // nolint: errcheck for { line, _, err := r.ReadLine() if err != nil { if err != io.EOF { - m.logger.Errorf("error reading from %s for process %s", outputType, p.Fullname()) + m.logger.ErrorOp(readFromPipeOp, err) } break } if len(line) != 0 { - m.logger.Debugf("%s %s: %s", p.Fullname(), outputType, string(line)) + m.logger.DebugfOp(readFromPipeOp, string(line)) } } } go readFromPipe("stdout", processStdOut) go readFromPipe("stderr", processStdErr) if err := cmd.Start(); err != nil { - return fmt.Errorf("%s %s with PM2: %v", cmdName, p.Fullname(), err) + return &standarderror.Error{Op: op, Err: err} } return nil } diff --git a/internal/pkg/pm2/unoconv.go b/internal/pkg/pm2/unoconv.go index 2bd53745..87319718 100644 --- a/internal/pkg/pm2/unoconv.go +++ b/internal/pkg/pm2/unoconv.go @@ -2,6 +2,7 @@ package pm2 import ( "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) type unoconv struct { @@ -21,11 +22,19 @@ func (p *unoconv) Fullname() string { } func (p *unoconv) Start() error { - return p.manager.start(p) + const op = "unoconv.Start" + if err := p.manager.start(p); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } func (p *unoconv) Shutdown() error { - return p.manager.shutdown(p) + const op = "unoconv.Shutdown" + if err := p.manager.shutdown(p); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } func (p *unoconv) args() []string { diff --git a/internal/pkg/standarderror/doc.go b/internal/pkg/standarderror/doc.go index b834229b..b932abe3 100644 --- a/internal/pkg/standarderror/doc.go +++ b/internal/pkg/standarderror/doc.go @@ -1,5 +1,7 @@ -// Package standarderror helps standardizing -// the errors in the application. -// -// Credits: https://middlemost.com/failure-is-your-domain/ +/* +Package standarderror helps standardizing +the errors in the application. + +Credits: https://middlemost.com/failure-is-your-domain/ +*/ package standarderror diff --git a/internal/pkg/standarderror/standarderror.go b/internal/pkg/standarderror/standarderror.go index f77bbe58..cda9cae9 100644 --- a/internal/pkg/standarderror/standarderror.go +++ b/internal/pkg/standarderror/standarderror.go @@ -35,10 +35,6 @@ type Error struct { // Error returns the string representation of the error message. func (err *Error) Error() string { var buf bytes.Buffer - // print the current operation in our stack, if any. - if err.Op != "" { - fmt.Fprintf(&buf, "%s: ", err.Op) - } // if wrapping an error, print its Error() message. // Otherwise print the error code & message. if err.Err != nil { @@ -83,3 +79,31 @@ func Message(err error) string { } return "An internal error has occurred. Please contact technical support." } + +// Op returns the logical operation of the error, if available. +// Otherwise returns an empty string. +// FIXME: "resource.ChromePrinterOptions: float64: : " +func Op(err error) string { + if err == nil { + return "" + } + e, ok := err.(*Error) + if !ok { + return "" + } + var buf bytes.Buffer + if e.Op != "" { + fmt.Fprintf(&buf, "%s: ", e.Op) + } + if e.Err != nil { + if wrappedOp := Op(e.Err); wrappedOp != "" { + fmt.Fprintf(&buf, "%s: ", wrappedOp) + } + } + return buf.String() +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = error(new(Error)) +) From 5af01505c2148fa15997742416b45ae9132aa54d Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 8 Jul 2019 10:28:43 +0200 Subject: [PATCH 013/107] better op names + fixing issue with op chaining in errors --- internal/app/api/pkg/handler/handler.go | 25 +++++++-------------- internal/app/api/pkg/handler/html.go | 11 ++++++--- internal/app/api/pkg/handler/markdown.go | 13 +++++++---- internal/app/api/pkg/handler/merge.go | 11 ++++++--- internal/app/api/pkg/handler/office.go | 11 ++++++--- internal/app/api/pkg/handler/url.go | 11 ++++++--- internal/app/api/pkg/resource/resource.go | 21 ++++++++--------- internal/pkg/config/config.go | 8 +++---- internal/pkg/pm2/chrome.go | 14 ++++++------ internal/pkg/pm2/unoconv.go | 4 ++-- internal/pkg/standarderror/standarderror.go | 9 +++----- 11 files changed, 74 insertions(+), 64 deletions(-) diff --git a/internal/app/api/pkg/handler/handler.go b/internal/app/api/pkg/handler/handler.go index c15b29ea..b511818c 100644 --- a/internal/app/api/pkg/handler/handler.go +++ b/internal/app/api/pkg/handler/handler.go @@ -35,10 +35,7 @@ const ( ) func convert(ctx *context.Context, p printer.Printer) error { - const ( - op = "convert" - debugOp = "handler.convert" - ) + const op = "handler.convert" r := ctx.Resource() logger := ctx.StandardLogger() baseFilename := random.Get() @@ -48,7 +45,7 @@ func convert(ctx *context.Context, p printer.Printer) error { // and directly return the resulting PDF file // or an error. if !r.Has(resource.WebhookURLFormField) { - logger.DebugfOp(debugOp, "no '%s' found, converting synchronously", resource.WebhookURLFormField) + logger.DebugfOp(op, "no '%s' found, converting synchronously", resource.WebhookURLFormField) if err := convertSync(filename, fpath, ctx, p); err != nil { return &standarderror.Error{Op: op, Err: err} } @@ -57,15 +54,12 @@ func convert(ctx *context.Context, p printer.Printer) error { // as a webhook URL has been given, we // run the following lines in a goroutine so that // it doesn't block. - logger.DebugfOp(debugOp, "'%s' found, converting asynchronously", resource.WebhookURLFormField) + logger.DebugfOp(op, "'%s' found, converting asynchronously", resource.WebhookURLFormField) return convertAsync(filename, fpath, ctx, p) } func convertSync(filename, fpath string, ctx *context.Context, p printer.Printer) error { - const ( - op = "convertSync" - debugOp = "handler.convertSync" - ) + const op = "handler.convertSync" r := ctx.Resource() logger := ctx.StandardLogger() if err := p.Print(fpath); err != nil { @@ -73,7 +67,7 @@ func convertSync(filename, fpath string, ctx *context.Context, p printer.Printer } if !r.Has(resource.ResultFilenameFormField) { logger.DebugfOp( - debugOp, + op, "no '%s' found, using generated filename '%s'", resource.ResultFilenameFormField, filename, @@ -84,7 +78,7 @@ func convertSync(filename, fpath string, ctx *context.Context, p printer.Printer return nil } logger.DebugfOp( - debugOp, + op, "'%s' found, so not using generated filename", resource.ResultFilenameFormField, ) @@ -99,10 +93,7 @@ func convertSync(filename, fpath string, ctx *context.Context, p printer.Printer } func convertAsync(filename, fpath string, ctx *context.Context, p printer.Printer) error { - const ( - op = "convertAsync" - debugOp = "handler.convertAsync" - ) + const op = "handler.convertAsync" r := ctx.Resource() logger := ctx.StandardLogger() go func() { @@ -132,7 +123,7 @@ func convertAsync(filename, fpath string, ctx *context.Context, p printer.Printe return } logger.DebugfOp( - debugOp, + op, "sending result file '%s' to '%s'", filename, webhookURL, diff --git a/internal/app/api/pkg/handler/html.go b/internal/app/api/pkg/handler/html.go index d5850685..117e1749 100644 --- a/internal/app/api/pkg/handler/html.go +++ b/internal/app/api/pkg/handler/html.go @@ -4,21 +4,26 @@ import ( "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) // HTML is the endpoint for converting // HTML to PDF. func HTML(c echo.Context) error { + const op = "handler.HTML" ctx := context.MustCastFromEchoContext(c) r := ctx.Resource() opts, err := r.ChromePrinterOptions() if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } fpath, err := r.Fpath("index.html") if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } p := printer.NewHTML(fpath, opts) - return convert(ctx, p) + if err := convert(ctx, p); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } diff --git a/internal/app/api/pkg/handler/markdown.go b/internal/app/api/pkg/handler/markdown.go index a4255fd2..6e22a556 100644 --- a/internal/app/api/pkg/handler/markdown.go +++ b/internal/app/api/pkg/handler/markdown.go @@ -4,24 +4,29 @@ import ( "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) // Markdown is the endpoint for converting // Markdown to PDF. func Markdown(c echo.Context) error { + const op = "handler.Markdown" ctx := context.MustCastFromEchoContext(c) r := ctx.Resource() opts, err := r.ChromePrinterOptions() if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } fpath, err := r.Fpath("index.html") if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } p, err := printer.NewMarkdown(fpath, opts) if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } - return convert(ctx, p) + if err := convert(ctx, p); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } diff --git a/internal/app/api/pkg/handler/merge.go b/internal/app/api/pkg/handler/merge.go index f9d1e5d1..6bd74d27 100644 --- a/internal/app/api/pkg/handler/merge.go +++ b/internal/app/api/pkg/handler/merge.go @@ -4,21 +4,26 @@ import ( "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) // Merge is the endpoint for // merging PDF files. func Merge(c echo.Context) error { + const op = "handler.Merge" ctx := context.MustCastFromEchoContext(c) r := ctx.Resource() opts, err := r.MergePrinterOptions() if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } fpaths, err := r.Fpaths(".pdf") if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } p := printer.NewMerge(fpaths, opts) - return convert(ctx, p) + if err := convert(ctx, p); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } diff --git a/internal/app/api/pkg/handler/office.go b/internal/app/api/pkg/handler/office.go index 3cf5c315..09d294b4 100644 --- a/internal/app/api/pkg/handler/office.go +++ b/internal/app/api/pkg/handler/office.go @@ -4,16 +4,18 @@ import ( "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) // Office is the endpoint for converting // Office files to PDF. func Office(c echo.Context) error { + const op = "handler.Office" ctx := context.MustCastFromEchoContext(c) r := ctx.Resource() opts, err := r.OfficePrinterOptions() if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } fpaths, err := r.Fpaths( ".txt", @@ -30,8 +32,11 @@ func Office(c echo.Context) error { ".odp", ) if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } p := printer.NewOffice(fpaths, opts) - return convert(ctx, p) + if err := convert(ctx, p); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } diff --git a/internal/app/api/pkg/handler/url.go b/internal/app/api/pkg/handler/url.go index cf1bc75d..f38eda0a 100644 --- a/internal/app/api/pkg/handler/url.go +++ b/internal/app/api/pkg/handler/url.go @@ -5,21 +5,26 @@ import ( "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) // URL is the endpoint for converting // a URL to PDF. func URL(c echo.Context) error { + const op = "handler.URL" ctx := context.MustCastFromEchoContext(c) r := ctx.Resource() opts, err := r.ChromePrinterOptions() if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } remoteURL, err := r.Get(resource.RemoteURLFormField) if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } p := printer.NewURL(remoteURL, opts) - return convert(ctx, p) + if err := convert(ctx, p); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } diff --git a/internal/app/api/pkg/resource/resource.go b/internal/app/api/pkg/resource/resource.go index 67d0eda9..479eb38d 100644 --- a/internal/app/api/pkg/resource/resource.go +++ b/internal/app/api/pkg/resource/resource.go @@ -83,7 +83,7 @@ func New(c echo.Context, logger *logger.Logger, config *config.Config, dirPath s } func formValues(c echo.Context, logger *logger.Logger) map[string]string { - const debugOp = "resource.formValues" + const op = "resource.formValues" v := make(map[string]string) v[ResultFilenameFormField] = c.FormValue(ResultFilenameFormField) v[WaitTimeoutFormField] = c.FormValue(WaitTimeoutFormField) @@ -97,15 +97,12 @@ func formValues(c echo.Context, logger *logger.Logger) map[string]string { v[MarginLeftFormField] = c.FormValue(MarginLeftFormField) v[MarginRightFormField] = c.FormValue(MarginRightFormField) v[LandscapeFormField] = c.FormValue(LandscapeFormField) - logger.DebugfOp(debugOp, "%v", v) + logger.DebugfOp(op, "%v", v) return v } func formFiles(c echo.Context, logger *logger.Logger, dirPath string) error { - const ( - op = "formFiles" - debugOp = "resource.formFiles" - ) + const op = "resource.formFiles" form, err := c.MultipartForm() if err != nil { return &standarderror.Error{Op: op, Err: err} @@ -132,7 +129,7 @@ func formFiles(c echo.Context, logger *logger.Logger, dirPath string) error { if _, err := out.Seek(0, 0); err != nil { return &standarderror.Error{Op: op, Err: err} } - logger.DebugfOp(debugOp, "'%s' created", fh.Filename) + logger.DebugfOp(op, "'%s' created", fh.Filename) } } return nil @@ -293,7 +290,7 @@ func (r *Resource) Get(formField string) (string, error) { } func (r *Resource) value(formField string) (string, error) { - const op = "value" + const op = "resource.value" v, ok := r.formValues[formField] if !ok { return "", &standarderror.Error{ @@ -306,7 +303,7 @@ func (r *Resource) value(formField string) (string, error) { } func (r *Resource) float64(formField string, defaultValue float64) (float64, error) { - const op = "float64" + const op = "resource.float64" if !r.Has(formField) { return defaultValue, nil } @@ -326,7 +323,7 @@ func (r *Resource) float64(formField string, defaultValue float64) (float64, err } func (r *Resource) bool(formField string, defaultValue bool) (bool, error) { - const op = "bool" + const op = "resource.bool" if !r.Has(formField) { return defaultValue, nil } @@ -366,7 +363,7 @@ func (r *Resource) Fpath(filename string) (string, error) { } func (r *Resource) content(filename string, defaultValue string) (string, error) { - const op = "content" + const op = "resource.content" if !r.hasFile(filename) { return defaultValue, nil } @@ -387,7 +384,7 @@ func (r *Resource) Fpaths(exts ...string) ([]string, error) { const op = "resource.Fpaths" var fpaths []string err := filepath.Walk(r.formFilesDirPath, func(path string, info os.FileInfo, _ error) error { - const walkOp = "filepath.Walk" + const walkOp = "resource.filepath.Walk" if info.IsDir() { return nil } diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 10168ff3..59246ede 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -103,7 +103,7 @@ func (c *Config) LogLevel() logrus.Level { } func defaultWaitTimeoutFromEnv(envVar string, defaultValue float64) (float64, error) { - const op = "defaultWaitTimeoutFromEnv" + const op = "config.defaultWaitTimeoutFromEnv" if v, ok := os.LookupEnv(envVar); ok { waitTimeout, err := strconv.ParseFloat(v, 64) if err != nil { @@ -119,7 +119,7 @@ func defaultWaitTimeoutFromEnv(envVar string, defaultValue float64) (float64, er } func defaultListenPortFromEnv(envVar string, defaultValue string) (string, error) { - const op = "defaultListenPortFromEnv" + const op = "config.defaultListenPortFromEnv" if v, ok := os.LookupEnv(envVar); ok { portAsUint, err := strconv.ParseUint(v, 10, 64) if err != nil { @@ -142,7 +142,7 @@ func defaultListenPortFromEnv(envVar string, defaultValue string) (string, error } func boolFromEnv(envVar string, defaultValue bool) (bool, error) { - const op = "boolFromEnv" + const op = "config.boolFromEnv" if v, ok := os.LookupEnv(envVar); ok { if v != "1" && v != "0" { return defaultValue, &standarderror.Error{ @@ -157,7 +157,7 @@ func boolFromEnv(envVar string, defaultValue bool) (bool, error) { } func logLevelFromEnv(envVar string, defaultValue logrus.Level) (logrus.Level, error) { - const op = "logLevelFromEnv" + const op = "config.logLevelFromEnv" if v, ok := os.LookupEnv(envVar); ok { switch v { case "DEBUG": diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index 07abc846..120baa50 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -28,7 +28,7 @@ func (p *chrome) Fullname() string { } func (p *chrome) Start() error { - const op = "chrome.Start" + const op = "pm2.chrome.Start" if err := p.manager.start(p); err != nil { return &standarderror.Error{Op: op, Err: err} } @@ -36,7 +36,7 @@ func (p *chrome) Start() error { } func (p *chrome) Shutdown() error { - const op = "chrome.Shutdown" + const op = "pm2.chrome.Shutdown" if err := p.manager.shutdown(p); err != nil { return &standarderror.Error{Op: op, Err: err} } @@ -67,25 +67,25 @@ func (p *chrome) name() string { } func (p *chrome) viable() bool { - const debugOp = "chrome.viable" + const op = "pm2.chrome.viable" // check if Google Chrome is correctly running. ctx, cancel := context.WithCancel(context.Background()) defer cancel() p.manager.logger.DebugfOp( - debugOp, + op, "checking liveness via debug version endpoint http://localhost:9222/json/version", ) v, err := devtool.New("http://localhost:9222").Version(ctx) if err != nil { p.manager.logger.DebugfOp( - debugOp, + op, "debug version endpoint returned error: %v", err, ) return false } p.manager.logger.DebugfOp( - debugOp, + op, "debug version endpoint returned version info: %+v", *v, ) @@ -93,7 +93,7 @@ func (p *chrome) viable() bool { } func (p *chrome) warmup() { - const debugOp = "chrome.warmup" + const debugOp = "pm2.chrome.warmup" p.manager.logger.DebugfOp( debugOp, "allowing %v to startup", diff --git a/internal/pkg/pm2/unoconv.go b/internal/pkg/pm2/unoconv.go index 87319718..48ec164d 100644 --- a/internal/pkg/pm2/unoconv.go +++ b/internal/pkg/pm2/unoconv.go @@ -22,7 +22,7 @@ func (p *unoconv) Fullname() string { } func (p *unoconv) Start() error { - const op = "unoconv.Start" + const op = "pm2.unoconv.Start" if err := p.manager.start(p); err != nil { return &standarderror.Error{Op: op, Err: err} } @@ -30,7 +30,7 @@ func (p *unoconv) Start() error { } func (p *unoconv) Shutdown() error { - const op = "unoconv.Shutdown" + const op = "pm2.unoconv.Shutdown" if err := p.manager.shutdown(p); err != nil { return &standarderror.Error{Op: op, Err: err} } diff --git a/internal/pkg/standarderror/standarderror.go b/internal/pkg/standarderror/standarderror.go index cda9cae9..4391374e 100644 --- a/internal/pkg/standarderror/standarderror.go +++ b/internal/pkg/standarderror/standarderror.go @@ -82,7 +82,6 @@ func Message(err error) string { // Op returns the logical operation of the error, if available. // Otherwise returns an empty string. -// FIXME: "resource.ChromePrinterOptions: float64: : " func Op(err error) string { if err == nil { return "" @@ -93,12 +92,10 @@ func Op(err error) string { } var buf bytes.Buffer if e.Op != "" { - fmt.Fprintf(&buf, "%s: ", e.Op) + fmt.Fprintf(&buf, "%s", e.Op) } - if e.Err != nil { - if wrappedOp := Op(e.Err); wrappedOp != "" { - fmt.Fprintf(&buf, "%s: ", wrappedOp) - } + if nestedOp := Op(e.Err); nestedOp != "" { + fmt.Fprintf(&buf, ": %s", nestedOp) } return buf.String() } From 70b185a37a809c3fb69a2ad25640a61cf86436e5 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 8 Jul 2019 11:06:26 +0200 Subject: [PATCH 014/107] improving logging --- cmd/gotenberg/main.go | 1 + internal/app/api/pkg/handler/html.go | 1 + internal/app/api/pkg/handler/markdown.go | 1 + internal/app/api/pkg/handler/merge.go | 1 + internal/app/api/pkg/handler/office.go | 1 + internal/app/api/pkg/handler/url.go | 1 + internal/app/api/pkg/middleware/context.go | 3 +- internal/app/api/pkg/middleware/error.go | 3 +- internal/app/api/pkg/resource/resource.go | 43 +++++++++++++--------- internal/pkg/pm2/chrome.go | 10 ++--- internal/pkg/pm2/unoconv.go | 12 +++++- 11 files changed, 49 insertions(+), 28 deletions(-) diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 28a8e976..92131b52 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -26,6 +26,7 @@ func main() { systemLogger.FatalOp(op, err) } systemLogger.InfofOp(op, "Gotenberg %s", version) + systemLogger.DebugfOp(op, "configuration: %+v", config) // start PM2 processes. var processes []pm2.Process if config.EnableChromeEndpoints() { diff --git a/internal/app/api/pkg/handler/html.go b/internal/app/api/pkg/handler/html.go index 117e1749..eb1581bb 100644 --- a/internal/app/api/pkg/handler/html.go +++ b/internal/app/api/pkg/handler/html.go @@ -12,6 +12,7 @@ import ( func HTML(c echo.Context) error { const op = "handler.HTML" ctx := context.MustCastFromEchoContext(c) + ctx.StandardLogger().DebugfOp(op, "html request") r := ctx.Resource() opts, err := r.ChromePrinterOptions() if err != nil { diff --git a/internal/app/api/pkg/handler/markdown.go b/internal/app/api/pkg/handler/markdown.go index 6e22a556..a7f59379 100644 --- a/internal/app/api/pkg/handler/markdown.go +++ b/internal/app/api/pkg/handler/markdown.go @@ -12,6 +12,7 @@ import ( func Markdown(c echo.Context) error { const op = "handler.Markdown" ctx := context.MustCastFromEchoContext(c) + ctx.StandardLogger().DebugfOp(op, "markdown request") r := ctx.Resource() opts, err := r.ChromePrinterOptions() if err != nil { diff --git a/internal/app/api/pkg/handler/merge.go b/internal/app/api/pkg/handler/merge.go index 6bd74d27..381e7da2 100644 --- a/internal/app/api/pkg/handler/merge.go +++ b/internal/app/api/pkg/handler/merge.go @@ -12,6 +12,7 @@ import ( func Merge(c echo.Context) error { const op = "handler.Merge" ctx := context.MustCastFromEchoContext(c) + ctx.StandardLogger().DebugfOp(op, "merge request") r := ctx.Resource() opts, err := r.MergePrinterOptions() if err != nil { diff --git a/internal/app/api/pkg/handler/office.go b/internal/app/api/pkg/handler/office.go index 09d294b4..60ccca1c 100644 --- a/internal/app/api/pkg/handler/office.go +++ b/internal/app/api/pkg/handler/office.go @@ -12,6 +12,7 @@ import ( func Office(c echo.Context) error { const op = "handler.Office" ctx := context.MustCastFromEchoContext(c) + ctx.StandardLogger().DebugfOp(op, "office request") r := ctx.Resource() opts, err := r.OfficePrinterOptions() if err != nil { diff --git a/internal/app/api/pkg/handler/url.go b/internal/app/api/pkg/handler/url.go index f38eda0a..f7383a3c 100644 --- a/internal/app/api/pkg/handler/url.go +++ b/internal/app/api/pkg/handler/url.go @@ -13,6 +13,7 @@ import ( func URL(c echo.Context) error { const op = "handler.URL" ctx := context.MustCastFromEchoContext(c) + ctx.StandardLogger().DebugfOp(op, "url request") r := ctx.Resource() opts, err := r.ChromePrinterOptions() if err != nil { diff --git a/internal/app/api/pkg/middleware/context.go b/internal/app/api/pkg/middleware/context.go index 29dc26c0..c711683b 100644 --- a/internal/app/api/pkg/middleware/context.go +++ b/internal/app/api/pkg/middleware/context.go @@ -30,8 +30,7 @@ func Context(config *config.Config) echo.MiddlewareFunc { // if the endpoint is not for healthcheck, associate a // resource to our custom context. if err := ctx.WithResource(trace); err != nil { - // required to have a correct status code - // in the logs. + // required to have a correct status code. ctx.Error(err) return ctx.LogRequestResult(err, false) } diff --git a/internal/app/api/pkg/middleware/error.go b/internal/app/api/pkg/middleware/error.go index 48928e26..876459db 100644 --- a/internal/app/api/pkg/middleware/error.go +++ b/internal/app/api/pkg/middleware/error.go @@ -35,8 +35,7 @@ func Error() echo.MiddlewareFunc { default: httpErr = echo.NewHTTPError(http.StatusInternalServerError, errMessage) } - // required to have a correct status code - // in the logs. + // required to have a correct status code. ctx.Error(httpErr) return httpErr } diff --git a/internal/app/api/pkg/resource/resource.go b/internal/app/api/pkg/resource/resource.go index 479eb38d..69eb487a 100644 --- a/internal/app/api/pkg/resource/resource.go +++ b/internal/app/api/pkg/resource/resource.go @@ -85,19 +85,27 @@ func New(c echo.Context, logger *logger.Logger, config *config.Config, dirPath s func formValues(c echo.Context, logger *logger.Logger) map[string]string { const op = "resource.formValues" v := make(map[string]string) - v[ResultFilenameFormField] = c.FormValue(ResultFilenameFormField) - v[WaitTimeoutFormField] = c.FormValue(WaitTimeoutFormField) - v[WebhookURLFormField] = c.FormValue(WebhookURLFormField) - v[RemoteURLFormField] = c.FormValue(RemoteURLFormField) - v[WaitDelayFormField] = c.FormValue(WaitDelayFormField) - v[PaperWidthFormField] = c.FormValue(PaperWidthFormField) - v[PaperHeightFormField] = c.FormValue(PaperHeightFormField) - v[MarginTopFormField] = c.FormValue(MarginTopFormField) - v[MarginBottomFormField] = c.FormValue(MarginBottomFormField) - v[MarginLeftFormField] = c.FormValue(MarginLeftFormField) - v[MarginRightFormField] = c.FormValue(MarginRightFormField) - v[LandscapeFormField] = c.FormValue(LandscapeFormField) - logger.DebugfOp(op, "%v", v) + fetch := func(formField string) string { + value := c.FormValue(formField) + if value == "" { + logger.DebugfOp(op, "'%s' is empty", formField) + return value + } + logger.DebugfOp(op, "'%s' retrieved, got '%s'", formField, value) + return value + } + v[ResultFilenameFormField] = fetch(ResultFilenameFormField) + v[WaitTimeoutFormField] = fetch(WaitTimeoutFormField) + v[WebhookURLFormField] = fetch(WebhookURLFormField) + v[RemoteURLFormField] = fetch(RemoteURLFormField) + v[WaitDelayFormField] = fetch(WaitDelayFormField) + v[PaperWidthFormField] = fetch(PaperWidthFormField) + v[PaperHeightFormField] = fetch(PaperHeightFormField) + v[MarginTopFormField] = fetch(MarginTopFormField) + v[MarginBottomFormField] = fetch(MarginBottomFormField) + v[MarginLeftFormField] = fetch(MarginLeftFormField) + v[MarginRightFormField] = fetch(MarginRightFormField) + v[LandscapeFormField] = fetch(LandscapeFormField) return v } @@ -221,7 +229,7 @@ func (r *Resource) ChromePrinterOptions() (*printer.ChromeOptions, error) { MarginRight: marginRight, Landscape: landscape, } - r.logger.DebugfOp(op, "%v", opts) + r.logger.DebugfOp(op, "printer options: %+v", opts) return opts, nil } @@ -242,7 +250,7 @@ func (r *Resource) OfficePrinterOptions() (*printer.OfficeOptions, error) { WaitTimeout: waitTimeout, Landscape: landscape, } - r.logger.DebugfOp(op, "%v", opts) + r.logger.DebugfOp(op, "printer options: %+v", opts) return opts, nil } @@ -258,7 +266,7 @@ func (r *Resource) MergePrinterOptions() (*printer.MergeOptions, error) { opts := &printer.MergeOptions{ WaitTimeout: waitTimeout, } - r.logger.DebugfOp(op, "%v", opts) + r.logger.DebugfOp(op, "printer options: %+v", opts) return opts, nil } @@ -384,13 +392,12 @@ func (r *Resource) Fpaths(exts ...string) ([]string, error) { const op = "resource.Fpaths" var fpaths []string err := filepath.Walk(r.formFilesDirPath, func(path string, info os.FileInfo, _ error) error { - const walkOp = "resource.filepath.Walk" if info.IsDir() { return nil } fpath, err := r.Fpath(info.Name()) if err != nil { - return &standarderror.Error{Op: walkOp, Err: err} + return &standarderror.Error{Op: op, Err: err} } for _, ext := range exts { if filepath.Ext(fpath) == ext { diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index 120baa50..94492ede 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -9,7 +9,7 @@ import ( "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) -const warmupTime = 10 * time.Second +const chromeWarmupTime = 10 * time.Second type chrome struct { manager *processManager @@ -93,13 +93,13 @@ func (p *chrome) viable() bool { } func (p *chrome) warmup() { - const debugOp = "pm2.chrome.warmup" + const op = "pm2.chrome.warmup" p.manager.logger.DebugfOp( - debugOp, + op, "allowing %v to startup", - warmupTime, + chromeWarmupTime, ) - time.Sleep(warmupTime) + time.Sleep(chromeWarmupTime) } // Compile-time checks to ensure type implements desired interfaces. diff --git a/internal/pkg/pm2/unoconv.go b/internal/pkg/pm2/unoconv.go index 48ec164d..ab1f9cde 100644 --- a/internal/pkg/pm2/unoconv.go +++ b/internal/pkg/pm2/unoconv.go @@ -1,10 +1,14 @@ package pm2 import ( + "time" + "github.com/thecodingmachine/gotenberg/internal/pkg/logger" "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) +const unoconvWarmupTime = 5 * time.Second + type unoconv struct { manager *processManager } @@ -56,7 +60,13 @@ func (p *unoconv) viable() bool { } func (p *unoconv) warmup() { - // let's do nothing. + const op = "pm2.unoconv.warmup" + p.manager.logger.DebugfOp( + op, + "allowing %v to startup", + unoconvWarmupTime, + ) + time.Sleep(unoconvWarmupTime) } // Compile-time checks to ensure type implements desired interfaces. From 186c09f29bd8b32ec2332f130716bd64485d8f20 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 8 Jul 2019 11:16:47 +0200 Subject: [PATCH 015/107] adding op and standarderror in printer package --- internal/pkg/printer/chrome.go | 37 ++++++++++++++++++-------------- internal/pkg/printer/markdown.go | 11 ++++++---- internal/pkg/printer/merge.go | 7 ++++-- internal/pkg/printer/office.go | 18 ++++++++++++---- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/internal/pkg/printer/chrome.go b/internal/pkg/printer/chrome.go index 82f05569..3e1a483d 100644 --- a/internal/pkg/printer/chrome.go +++ b/internal/pkg/printer/chrome.go @@ -12,6 +12,7 @@ import ( "github.com/mafredri/cdp/protocol/page" "github.com/mafredri/cdp/protocol/target" "github.com/mafredri/cdp/rpcc" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" "golang.org/x/sync/errgroup" ) @@ -37,24 +38,26 @@ type ChromeOptions struct { } func (p *chrome) Print(destination string) error { + const op = "printer.chrome.Print" + // FIXME duration not working with float duration := time.Duration(p.opts.WaitTimeout+p.opts.WaitDelay) * time.Second ctx, cancel := context.WithTimeout(context.Background(), duration) defer cancel() devt, err := devtool.New("http://localhost:9222").Version(ctx) if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } // connect to WebSocket URL (page) that speaks the Chrome DevTools Protocol. devtConn, err := rpcc.DialContext(ctx, devt.WebSocketDebuggerURL) if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } defer devtConn.Close() // nolint: errcheck // create a new CDP Client that uses conn. devtClient := cdp.NewClient(devtConn) newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx) if err != nil { - return fmt.Errorf("creating new browser context: %v", err) + return &standarderror.Error{Op: op, Err: err} } // create a new blank target with the new browser context. createTargetArgs := target. @@ -62,13 +65,13 @@ func (p *chrome) Print(destination string) error { SetBrowserContextID(newContextTarget.BrowserContextID) newTarget, err := devtClient.Target.CreateTarget(ctx, createTargetArgs) if err != nil { - return fmt.Errorf("creating new blank target: %v", err) + return &standarderror.Error{Op: op, Err: err} } // connect the client to the new target. newTargetWsURL := fmt.Sprintf("ws://127.0.0.1:9222/devtools/page/%s", newTarget.TargetID) newContextConn, err := rpcc.DialContext(ctx, newTargetWsURL) if err != nil { - return fmt.Errorf("connecting client to blank target: %v", err) + return &standarderror.Error{Op: op, Err: err} } defer newContextConn.Close() // nolint: errcheck // create a new CDP Client that uses newContextConn. @@ -83,10 +86,10 @@ func (p *chrome) Print(destination string) error { func() error { return targetClient.Page.Enable(ctx) }, func() error { return targetClient.Runtime.Enable(ctx) }, ); err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } if err := p.navigate(ctx, targetClient); err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } print, err := targetClient.Page.PrintToPDF( ctx, @@ -104,41 +107,42 @@ func (p *chrome) Print(destination string) error { SetPrintBackground(true), ) if err != nil { - return fmt.Errorf("printing page to PDF: %v", err) + return &standarderror.Error{Op: op, Err: err} } if err := ioutil.WriteFile(destination, print.Data, 0644); err != nil { - return fmt.Errorf("%s: writing file: %v", destination, err) + return &standarderror.Error{Op: op, Err: err} } return nil } func (p *chrome) navigate(ctx context.Context, client *cdp.Client) error { + const op = "printer.chrome.navigate" // make sure Page events are enabled. if err := client.Page.Enable(ctx); err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } // make sure Network events are enabled. if err := client.Network.Enable(ctx, nil); err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } // create all clients for events. domContentEventFired, err := client.Page.DOMContentEventFired(ctx) if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } defer domContentEventFired.Close() // nolint: errcheck loadEventFired, err := client.Page.LoadEventFired(ctx) if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } defer loadEventFired.Close() // nolint: errcheck loadingFinished, err := client.Network.LoadingFinished(ctx) if err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } defer loadingFinished.Close() // nolint: errcheck if _, err := client.Page.Navigate(ctx, page.NewNavigateArgs(p.url)); err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } if err := runBatch( // wait for all events. @@ -146,9 +150,10 @@ func (p *chrome) navigate(ctx context.Context, client *cdp.Client) error { func() error { _, err := loadEventFired.Recv(); return err }, func() error { _, err := loadingFinished.Recv(); return err }, ); err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } // wait for a given amount of time (useful for javascript delay). + // FIXME duration not working with float time.Sleep(time.Duration(p.opts.WaitDelay) * time.Second) return nil } diff --git a/internal/pkg/printer/markdown.go b/internal/pkg/printer/markdown.go index 9c84830c..07ea3b55 100644 --- a/internal/pkg/printer/markdown.go +++ b/internal/pkg/printer/markdown.go @@ -10,27 +10,29 @@ import ( "github.com/labstack/gommon/random" "github.com/microcosm-cc/bluemonday" "github.com/russross/blackfriday/v2" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) // NewMarkdown returns a Markdown printer. func NewMarkdown(fpath string, opts *ChromeOptions) (Printer, error) { + const op = "printer.NewMarkdown" tmpl, err := template. New(filepath.Base(fpath)). Funcs(template.FuncMap{"toHTML": markdownToHTML}). ParseFiles(fpath) if err != nil { - return nil, fmt.Errorf("%s: parsing template: %v", fpath, err) + return nil, &standarderror.Error{Op: op, Err: err} } dirPath := filepath.Dir(fpath) data := &templateData{DirPath: dirPath} var buffer bytes.Buffer if err := tmpl.Execute(&buffer, data); err != nil { - return nil, fmt.Errorf("%s: executing template: %v", fpath, err) + return nil, &standarderror.Error{Op: op, Err: err} } baseFilename := random.String(32) dst := fmt.Sprintf("%s/%s.html", dirPath, baseFilename) if err := ioutil.WriteFile(dst, buffer.Bytes(), 0644); err != nil { - return nil, fmt.Errorf("%s: writing file: %v", dst, err) + return nil, &standarderror.Error{Op: op, Err: err} } URL := fmt.Sprintf("file://%s", dst) return &chrome{ @@ -44,10 +46,11 @@ type templateData struct { } func markdownToHTML(dirPath, filename string) (template.HTML, error) { + const op = "printer.markdownToHTML" fpath := fmt.Sprintf("%s/%s", dirPath, filename) b, err := ioutil.ReadFile(fpath) if err != nil { - return "", fmt.Errorf("%s: reading file: %v", fpath, err) + return "", &standarderror.Error{Op: op, Err: err} } unsafe := blackfriday.Run(b) content := bluemonday.UGCPolicy().SanitizeBytes(unsafe) diff --git a/internal/pkg/printer/merge.go b/internal/pkg/printer/merge.go index d21c2420..6393f5cf 100644 --- a/internal/pkg/printer/merge.go +++ b/internal/pkg/printer/merge.go @@ -2,9 +2,10 @@ package printer import ( "context" - "fmt" "os/exec" "time" + + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) type merge struct { @@ -28,7 +29,9 @@ func NewMerge(fpaths []string, opts *MergeOptions) Printer { } func (p *merge) Print(destination string) error { + const op = "printer.merge.Print" if p.ctx == nil { + // FIXME duration not working with float ctx, cancel := context.WithTimeout(context.Background(), time.Duration(p.opts.WaitTimeout)*time.Second) defer cancel() p.ctx = ctx @@ -39,7 +42,7 @@ func (p *merge) Print(destination string) error { cmd := exec.CommandContext(p.ctx, "pdftk", cmdArgs...) _, err := cmd.Output() if err != nil { - return fmt.Errorf("pdtk: %v", err) + return &standarderror.Error{Op: op, Err: err} } return nil } diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index 8e83824e..214da42b 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -10,6 +10,7 @@ import ( "time" "github.com/labstack/gommon/random" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) type office struct { @@ -33,6 +34,8 @@ func NewOffice(fpaths []string, opts *OfficeOptions) Printer { } func (p *office) Print(destination string) error { + const op = "printer.office.Print" + // FIXME duration not working with float ctx, cancel := context.WithTimeout(context.Background(), time.Duration(p.opts.WaitTimeout)*time.Second) defer cancel() fpaths := make([]string, len(p.fpaths)) @@ -41,24 +44,31 @@ func (p *office) Print(destination string) error { baseFilename := random.String(32) tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) if err := unoconv(ctx, fpath, tmpDest, p.opts); err != nil { - return err + return &standarderror.Error{Op: op, Err: err} } fpaths[i] = tmpDest } if len(fpaths) == 1 { - return os.Rename(fpaths[0], destination) + if err := os.Rename(fpaths[0], destination); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } m := &merge{ ctx: ctx, fpaths: fpaths, } - return m.Print(destination) + if err := m.Print(destination); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } // nolint: gochecknoglobals var mu sync.Mutex func unoconv(ctx context.Context, fpath, destination string, opts *OfficeOptions) error { + const op = "printer.unoconv" mu.Lock() defer mu.Unlock() cmdArgs := []string{ @@ -76,7 +86,7 @@ func unoconv(ctx context.Context, fpath, destination string, opts *OfficeOptions ) _, err := cmd.Output() if err != nil { - return fmt.Errorf("unoconv: %v", err) + return &standarderror.Error{Op: op, Err: err} } return nil } From 9af00d6d583ebfa549051fdbc867d34a4ce32453 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 8 Jul 2019 17:24:17 +0200 Subject: [PATCH 016/107] fixes waitTimeout, waitDelay not working with float --- .../docs/content/03-environment-variables.md | 5 ++- build/docs/content/04-html.md | 5 ++- docs/index.html | 5 ++- internal/app/api/pkg/context/context.go | 1 - internal/pkg/printer/chrome.go | 8 ++-- internal/pkg/printer/merge.go | 5 +-- internal/pkg/printer/office.go | 5 +-- internal/pkg/timeout/doc.go | 3 ++ internal/pkg/timeout/timeout.go | 43 +++++++++++++++++++ internal/pkg/timeout/timeout_test.go | 38 ++++++++++++++++ test/testfunc.go | 10 +++++ 11 files changed, 110 insertions(+), 18 deletions(-) create mode 100644 internal/pkg/timeout/doc.go create mode 100644 internal/pkg/timeout/timeout.go create mode 100644 internal/pkg/timeout/timeout_test.go diff --git a/build/docs/content/03-environment-variables.md b/build/docs/content/03-environment-variables.md index 70653291..a9f75d32 100644 --- a/build/docs/content/03-environment-variables.md +++ b/build/docs/content/03-environment-variables.md @@ -37,7 +37,8 @@ By default, the API will add a log entry when the [healthcheck endpoint](#ping) You may turn off this logging so as to avoid unnecessary entries in your logs with the environment variable `DISABLE_HEALTHCHECK_LOGGING`. -This environment variable operates in the same manner as the `DISABLE_GOOGLE_CHROME` and `DISABLE_UNOCONV` variables operate in that it accepts the strings `"0"` or `"1"` as values, where `1` is enabled. +This environment variable operates in the same manner as the `DISABLE_GOOGLE_CHROME` and `DISABLE_UNOCONV` variables operate in that it accepts the strings `"0"` or `"1"` as values, where `"1"` is enabled. + ## Default listen port By default, the API will listen on port `3000`. For most use cases this is perfectly fine, but at times there may be cases where you need to change this due to port conflicts. @@ -52,4 +53,4 @@ By default, `stdout` and `stderr` messages from the started processes are disabl You may enable some debug logging from starting the process by setting the environment variable `DEBUG_PROCESS_STARTUP`. -This environment variable operates in the same manner as the `DISABLE_GOOGLE_CHROME` and `DISABLE_UNOCONV` variables operate in that it accepts the strings `"0"` or `"1"` as values, where `1` means `true`. \ No newline at end of file +This environment variable operates in the same manner as the `DISABLE_GOOGLE_CHROME` and `DISABLE_UNOCONV` variables operate in that it accepts the strings `"0"` or `"1"` as values, where `1` means `true`. diff --git a/build/docs/content/04-html.md b/build/docs/content/04-html.md index b2661e3c..4fdb6741 100644 --- a/build/docs/content/04-html.md +++ b/build/docs/content/04-html.md @@ -296,7 +296,8 @@ $client->store($request, $dest); ## Wait delay In some cases, you may want to wait a certain amount of time to make sure the -page you're trying to generate is fully rendered. +page you're trying to generate is fully rendered. For instance, if your page relies +a lot on JavaScript for rendering. > The wait delay is a duration in **seconds** (e.g `2.5` for 2.5 seconds). @@ -339,4 +340,4 @@ $request = new HTMLRequest($index); $request->setWaitDelay(5.5); $dest = "result.pdf"; $client->store($request, $dest); -``` \ No newline at end of file +``` diff --git a/docs/index.html b/docs/index.html index 6e1a1677..47e58226 100755 --- a/docs/index.html +++ b/docs/index.html @@ -272,7 +272,7 @@ See the timeout section.

You may turn off this logging so as to avoid unnecessary entries in your logs with the environment variable DISABLE_HEALTHCHECK_LOGGING.

-

This environment variable operates in the same manner as the DISABLE_GOOGLE_CHROME and DISABLE_UNOCONV variables operate in that it accepts the strings "0" or "1" as values, where 1 is enabled.

+

This environment variable operates in the same manner as the DISABLE_GOOGLE_CHROME and DISABLE_UNOCONV variables operate in that it accepts the strings "0" or "1" as values, where "1" is enabled.

Wait delay

In some cases, you may want to wait a certain amount of time to make sure the -page you’re trying to generate is fully rendered.

+page you’re trying to generate is fully rendered. For instance, if your page relies +a lot on JavaScript for rendering.

The wait delay is a duration in seconds (e.g 2.5 for 2.5 seconds).

diff --git a/internal/app/api/pkg/context/context.go b/internal/app/api/pkg/context/context.go index 1ee8ab5b..e3673c35 100644 --- a/internal/app/api/pkg/context/context.go +++ b/internal/app/api/pkg/context/context.go @@ -23,7 +23,6 @@ type Context struct { // New creates a new context. func New(c echo.Context, logger *logger.Logger, config *config.Config) *Context { - // TODO timeout context? return &Context{ c, logger, diff --git a/internal/pkg/printer/chrome.go b/internal/pkg/printer/chrome.go index 3e1a483d..5bf36a9c 100644 --- a/internal/pkg/printer/chrome.go +++ b/internal/pkg/printer/chrome.go @@ -13,6 +13,7 @@ import ( "github.com/mafredri/cdp/protocol/target" "github.com/mafredri/cdp/rpcc" "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/internal/pkg/timeout" "golang.org/x/sync/errgroup" ) @@ -39,9 +40,7 @@ type ChromeOptions struct { func (p *chrome) Print(destination string) error { const op = "printer.chrome.Print" - // FIXME duration not working with float - duration := time.Duration(p.opts.WaitTimeout+p.opts.WaitDelay) * time.Second - ctx, cancel := context.WithTimeout(context.Background(), duration) + ctx, cancel := timeout.Context(p.opts.WaitTimeout + p.opts.WaitDelay) defer cancel() devt, err := devtool.New("http://localhost:9222").Version(ctx) if err != nil { @@ -153,8 +152,7 @@ func (p *chrome) navigate(ctx context.Context, client *cdp.Client) error { return &standarderror.Error{Op: op, Err: err} } // wait for a given amount of time (useful for javascript delay). - // FIXME duration not working with float - time.Sleep(time.Duration(p.opts.WaitDelay) * time.Second) + time.Sleep(timeout.Duration(p.opts.WaitDelay)) return nil } diff --git a/internal/pkg/printer/merge.go b/internal/pkg/printer/merge.go index 6393f5cf..cc096801 100644 --- a/internal/pkg/printer/merge.go +++ b/internal/pkg/printer/merge.go @@ -3,9 +3,9 @@ package printer import ( "context" "os/exec" - "time" "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/internal/pkg/timeout" ) type merge struct { @@ -31,8 +31,7 @@ func NewMerge(fpaths []string, opts *MergeOptions) Printer { func (p *merge) Print(destination string) error { const op = "printer.merge.Print" if p.ctx == nil { - // FIXME duration not working with float - ctx, cancel := context.WithTimeout(context.Background(), time.Duration(p.opts.WaitTimeout)*time.Second) + ctx, cancel := timeout.Context(p.opts.WaitTimeout) defer cancel() p.ctx = ctx } diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index 214da42b..d3eaec61 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -7,10 +7,10 @@ import ( "os/exec" "path/filepath" "sync" - "time" "github.com/labstack/gommon/random" "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/internal/pkg/timeout" ) type office struct { @@ -35,8 +35,7 @@ func NewOffice(fpaths []string, opts *OfficeOptions) Printer { func (p *office) Print(destination string) error { const op = "printer.office.Print" - // FIXME duration not working with float - ctx, cancel := context.WithTimeout(context.Background(), time.Duration(p.opts.WaitTimeout)*time.Second) + ctx, cancel := timeout.Context(p.opts.WaitTimeout) defer cancel() fpaths := make([]string, len(p.fpaths)) dirPath := filepath.Dir(destination) diff --git a/internal/pkg/timeout/doc.go b/internal/pkg/timeout/doc.go new file mode 100644 index 00000000..e8c95004 --- /dev/null +++ b/internal/pkg/timeout/doc.go @@ -0,0 +1,3 @@ +// Package timeout helps managing +// context with timeout. +package timeout diff --git a/internal/pkg/timeout/timeout.go b/internal/pkg/timeout/timeout.go new file mode 100644 index 00000000..7228ece2 --- /dev/null +++ b/internal/pkg/timeout/timeout.go @@ -0,0 +1,43 @@ +package timeout + +import ( + "context" + "strings" + "time" + + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" +) + +// Context creates a context with timeout for +// given second. +func Context(seconds float64) (context.Context, context.CancelFunc) { + return context.WithTimeout(context.Background(), Duration(seconds)) +} + +// Duration creates a duration from seconds. +func Duration(seconds float64) time.Duration { + return time.Duration(1000*seconds) * time.Millisecond +} + +// Err returns a standarderror.Error +// if the context has an error. +func Err(ctx context.Context) error { + const op = "timeout.Err" + err := ctx.Err() + if err == nil { + return nil + } + if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { + return &standarderror.Error{ + Code: standarderror.Timeout, + Message: "context has timed out", + Op: op, + Err: err, + } + } + return &standarderror.Error{ + Message: "context finished with an error", + Op: op, + Err: err, + } +} diff --git a/internal/pkg/timeout/timeout_test.go b/internal/pkg/timeout/timeout_test.go new file mode 100644 index 00000000..23d4c06a --- /dev/null +++ b/internal/pkg/timeout/timeout_test.go @@ -0,0 +1,38 @@ +package timeout + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/test" +) + +func TestDuration(t *testing.T) { + expected := time.Duration(1500) * time.Millisecond + result := Duration(1.5) + assert.Equal(t, expected.String(), result.String()) +} + +func TestErr(t *testing.T) { + // should be OK. + ctx, cancel := Context(5) + defer cancel() + assert.Nil(t, Err(ctx)) + // should timeout. + ctx, cancel = Context(0.5) + defer cancel() + time.Sleep(Duration(1)) + err := Err(ctx) + assert.NotNil(t, err) + standardized := test.RequireStandardError(t, err) + assert.Equal(t, standardized.Code, standarderror.Timeout) + // should failed. + ctx, cancel = Context(5) + cancel() + err = Err(ctx) + assert.NotNil(t, err) + standardized = test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Code(err), standarderror.Internal) +} diff --git a/test/testfunc.go b/test/testfunc.go index acdbafa0..bf1103b2 100644 --- a/test/testfunc.go +++ b/test/testfunc.go @@ -16,6 +16,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" "golang.org/x/sync/errgroup" ) @@ -39,6 +40,15 @@ func AssertConcurrent(t *testing.T, fn func() error, amount int) { assert.NoError(t, err) } +// RequireStandardError validates that given error +// is of an instance of standarderror.Error. +// If so, returns the instance of standarderror.Error. +func RequireStandardError(t *testing.T, err error) *standarderror.Error { + standardized, ok := err.(*standarderror.Error) + require.Equal(t, ok, true) + return standardized +} + // HTMLTestMultipartForm returns the body // for a multipate/form-data request with all // files under "html" folder. From 9c6f23d7ccf7ad0104702394cee66754ccd90e2c Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 8 Jul 2019 17:50:31 +0200 Subject: [PATCH 017/107] typo in timeout tests + adding tests for standarderror --- build/tests/docker-entrypoint.sh | 1 + internal/pkg/standarderror/standarderror.go | 4 +- .../pkg/standarderror/standarderror_test.go | 70 +++++++++++++++++++ internal/pkg/timeout/timeout_test.go | 4 +- test/testfunc.go | 2 +- 5 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 internal/pkg/standarderror/standarderror_test.go diff --git a/build/tests/docker-entrypoint.sh b/build/tests/docker-entrypoint.sh index 91cc7d79..b4b0ea1d 100755 --- a/build/tests/docker-entrypoint.sh +++ b/build/tests/docker-entrypoint.sh @@ -9,6 +9,7 @@ go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestChromeSt go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestUnoconvStart # Running others tests. +go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/app/api # Finally testing processes shutdown. diff --git a/internal/pkg/standarderror/standarderror.go b/internal/pkg/standarderror/standarderror.go index 4391374e..f5ad9ec8 100644 --- a/internal/pkg/standarderror/standarderror.go +++ b/internal/pkg/standarderror/standarderror.go @@ -64,6 +64,8 @@ func Code(err error) string { return Internal } +const defaultMessage = "an internal error has occurred: please contact technical support" + // Message returns the human-readable message of the error, if available. // Otherwise returns a generic error message. func Message(err error) string { @@ -77,7 +79,7 @@ func Message(err error) string { if ok && e.Err != nil { return Message(e.Err) } - return "An internal error has occurred. Please contact technical support." + return defaultMessage } // Op returns the logical operation of the error, if available. diff --git a/internal/pkg/standarderror/standarderror_test.go b/internal/pkg/standarderror/standarderror_test.go new file mode 100644 index 00000000..eecd5631 --- /dev/null +++ b/internal/pkg/standarderror/standarderror_test.go @@ -0,0 +1,70 @@ +package standarderror + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" +) + +func scenario1() error { + rootErr := errors.New("root error") + nestedErr := &Error{ + Code: Invalid, + Op: "bar", + Message: "nested error", + Err: rootErr, + } + err := &Error{ + Op: "foo", + Err: nestedErr, + } + return err +} + +func scenario2() error { + nestedErr := &Error{ + Code: Invalid, + Op: "bar", + Message: "nested error", + } + err := &Error{ + Code: Internal, + Op: "foo", + Err: nestedErr, + } + return err +} + +func TestError(t *testing.T) { + err := scenario1() + assert.Equal(t, "root error", err.Error()) + err = scenario2() + assert.Equal(t, " nested error", err.Error()) +} + +func TestCode(t *testing.T) { + assert.Equal(t, "", Code(nil)) + err := scenario1() + assert.Equal(t, Invalid, Code(err)) + err = scenario2() + assert.Equal(t, Internal, Code(err)) + err = errors.New("some error") + assert.Equal(t, Internal, Code(err)) +} + +func TestMessage(t *testing.T) { + assert.Equal(t, "", Message(nil)) + err := scenario1() + assert.Equal(t, "nested error", Message(err)) + err = errors.New("some error") + assert.Equal(t, defaultMessage, Message(err)) +} + +func TestOp(t *testing.T) { + assert.Equal(t, "", Op(nil)) + err := scenario1() + assert.Equal(t, "foo: bar", Op(err)) + err = errors.New("some error") + assert.Equal(t, "", Op(err)) +} diff --git a/internal/pkg/timeout/timeout_test.go b/internal/pkg/timeout/timeout_test.go index 23d4c06a..9ab855e9 100644 --- a/internal/pkg/timeout/timeout_test.go +++ b/internal/pkg/timeout/timeout_test.go @@ -27,12 +27,12 @@ func TestErr(t *testing.T) { err := Err(ctx) assert.NotNil(t, err) standardized := test.RequireStandardError(t, err) - assert.Equal(t, standardized.Code, standarderror.Timeout) + assert.Equal(t, standarderror.Timeout, standardized.Code) // should failed. ctx, cancel = Context(5) cancel() err = Err(ctx) assert.NotNil(t, err) standardized = test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Code(err), standarderror.Internal) + assert.Equal(t, standarderror.Internal, standarderror.Code(err)) } diff --git a/test/testfunc.go b/test/testfunc.go index bf1103b2..5fb43bb9 100644 --- a/test/testfunc.go +++ b/test/testfunc.go @@ -45,7 +45,7 @@ func AssertConcurrent(t *testing.T, fn func() error, amount int) { // If so, returns the instance of standarderror.Error. func RequireStandardError(t *testing.T, err error) *standarderror.Error { standardized, ok := err.(*standarderror.Error) - require.Equal(t, ok, true) + require.Equal(t, true, ok) return standardized } From 9ab8d036973189faafee91fd66a152aa4f171718 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 8 Jul 2019 18:06:43 +0200 Subject: [PATCH 018/107] adding tests for random pkg --- build/tests/docker-entrypoint.sh | 4 +++- internal/pkg/random/random_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 internal/pkg/random/random_test.go diff --git a/build/tests/docker-entrypoint.sh b/build/tests/docker-entrypoint.sh index b4b0ea1d..476b166f 100755 --- a/build/tests/docker-entrypoint.sh +++ b/build/tests/docker-entrypoint.sh @@ -9,7 +9,9 @@ go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestChromeSt go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestUnoconvStart # Running others tests. -go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg +go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/random +go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/standarderror +go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/timeout go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/app/api # Finally testing processes shutdown. diff --git a/internal/pkg/random/random_test.go b/internal/pkg/random/random_test.go new file mode 100644 index 00000000..b7a37060 --- /dev/null +++ b/internal/pkg/random/random_test.go @@ -0,0 +1,28 @@ +package random + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGet(t *testing.T) { + var rands []string + // use case: for 1 000 concurrent + // requests (which is a big Gotenberg instance), + // none should have the identifier. + for i := 0; i < 1000; i++ { + rands = append(rands, Get()) + } + unique := func() bool { + for i, rand := range rands { + for j, current := range rands { + if i != j && rand == current { + return false + } + } + } + return true + } + assert.Equal(t, true, unique()) +} From acd47b870f10206b27a1cadc3afe0484ae15a4f7 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 8 Jul 2019 18:07:44 +0200 Subject: [PATCH 019/107] fixing typo in godoc in pkg random --- internal/pkg/random/random_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/pkg/random/random_test.go b/internal/pkg/random/random_test.go index b7a37060..aaf94f17 100644 --- a/internal/pkg/random/random_test.go +++ b/internal/pkg/random/random_test.go @@ -10,7 +10,7 @@ func TestGet(t *testing.T) { var rands []string // use case: for 1 000 concurrent // requests (which is a big Gotenberg instance), - // none should have the identifier. + // none should have the same identifier. for i := 0; i < 1000; i++ { rands = append(rands, Get()) } From 1b4eed1a6e87e742d324ceba4093e40d7806a245 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 8 Jul 2019 18:26:17 +0200 Subject: [PATCH 020/107] fixing pm2 tests + adding pkg config tests --- internal/pkg/config/config_test.go | 108 +++++++++++++++++++++++++++++ internal/pkg/pm2/chrome_test.go | 5 +- internal/pkg/pm2/unoconv_test.go | 5 +- test/testfunc.go | 8 +++ 4 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 internal/pkg/config/config_test.go diff --git a/internal/pkg/config/config_test.go b/internal/pkg/config/config_test.go new file mode 100644 index 00000000..83dc4478 --- /dev/null +++ b/internal/pkg/config/config_test.go @@ -0,0 +1,108 @@ +package config + +import ( + "os" + "testing" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/test" +) + +func TestDefaultWaitTimeout(t *testing.T) { + // should be OK. + os.Setenv(defaultWaitTimeoutEnvVar, "1.5") + config, err := FromEnv() + assert.Nil(t, err) + assert.Equal(t, 1.5, config.DefaultWaitTimeout()) + // should failed. + os.Setenv(defaultWaitTimeoutEnvVar, "foo") + _, err = FromEnv() + assert.NotNil(t, err) + standardized := test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) + os.Unsetenv(defaultWaitTimeoutEnvVar) +} + +func TestDefaultListenPort(t *testing.T) { + // should be OK. + os.Setenv(defaultListenPortEnvVar, "4000") + config, err := FromEnv() + assert.Nil(t, err) + assert.Equal(t, "4000", config.DefaultListenPort()) + // should failed. + os.Setenv(defaultListenPortEnvVar, "foo") + _, err = FromEnv() + assert.NotNil(t, err) + standardized := test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) + os.Setenv(defaultListenPortEnvVar, "100000000") + _, err = FromEnv() + assert.NotNil(t, err) + standardized = test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) + os.Unsetenv(defaultListenPortEnvVar) +} + +func TestEnableChromeEndpoints(t *testing.T) { + // should be OK. + os.Setenv(disableGoogleChromeEnvVar, "1") + config, err := FromEnv() + assert.Nil(t, err) + assert.Equal(t, false, config.EnableChromeEndpoints()) + os.Setenv(disableGoogleChromeEnvVar, "0") + config, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, true, config.EnableChromeEndpoints()) + // should failed. + os.Setenv(disableGoogleChromeEnvVar, "true") + _, err = FromEnv() + assert.NotNil(t, err) + standardized := test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) + os.Unsetenv(disableGoogleChromeEnvVar) +} + +func TestEnableUnoconvEndpoints(t *testing.T) { + // should be OK. + os.Setenv(disableUnoconvEnvVar, "1") + config, err := FromEnv() + assert.Nil(t, err) + assert.Equal(t, false, config.EnableUnoconvEndpoints()) + os.Setenv(disableUnoconvEnvVar, "0") + config, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, true, config.EnableUnoconvEndpoints()) + // should failed. + os.Setenv(disableUnoconvEnvVar, "true") + _, err = FromEnv() + assert.NotNil(t, err) + standardized := test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) + os.Unsetenv(disableUnoconvEnvVar) +} + +func TestLogLevel(t *testing.T) { + // should be OK. + os.Setenv(logLevelEnvVar, "DEBUG") + config, err := FromEnv() + assert.Nil(t, err) + assert.Equal(t, logrus.DebugLevel, config.LogLevel()) + os.Setenv(logLevelEnvVar, "INFO") + config, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, logrus.InfoLevel, config.LogLevel()) + os.Setenv(logLevelEnvVar, "ERROR") + config, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, logrus.ErrorLevel, config.LogLevel()) + // should failed. + os.Setenv(logLevelEnvVar, "foo") + config, err = FromEnv() + assert.Equal(t, logrus.InfoLevel, config.LogLevel()) + assert.NotNil(t, err) + standardized := test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) + os.Unsetenv(logLevelEnvVar) +} diff --git a/internal/pkg/pm2/chrome_test.go b/internal/pkg/pm2/chrome_test.go index edb8b5af..2fea8458 100644 --- a/internal/pkg/pm2/chrome_test.go +++ b/internal/pkg/pm2/chrome_test.go @@ -4,16 +4,17 @@ import ( "testing" "github.com/stretchr/testify/require" + "github.com/thecodingmachine/gotenberg/test" ) func TestChromeStart(t *testing.T) { - p := NewChrome(false) + p := NewChrome(test.CreateTestLogger()) err := p.Start() require.Nil(t, err) } func TestChromeShutdown(t *testing.T) { - p := NewChrome(false) + p := NewChrome(test.CreateTestLogger()) err := p.Shutdown() require.Nil(t, err) } diff --git a/internal/pkg/pm2/unoconv_test.go b/internal/pkg/pm2/unoconv_test.go index 6995109e..4c5fb8bf 100644 --- a/internal/pkg/pm2/unoconv_test.go +++ b/internal/pkg/pm2/unoconv_test.go @@ -4,16 +4,17 @@ import ( "testing" "github.com/stretchr/testify/require" + "github.com/thecodingmachine/gotenberg/test" ) func TestUnoconvStart(t *testing.T) { - p := NewUnoconv(false) + p := NewUnoconv(test.CreateTestLogger()) err := p.Start() require.Nil(t, err) } func TestUnoconvShutdown(t *testing.T) { - p := NewUnoconv(false) + p := NewUnoconv(test.CreateTestLogger()) err := p.Shutdown() require.Nil(t, err) } diff --git a/test/testfunc.go b/test/testfunc.go index 5fb43bb9..428d209a 100644 --- a/test/testfunc.go +++ b/test/testfunc.go @@ -14,8 +14,10 @@ import ( "runtime" "testing" + "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/thecodingmachine/gotenberg/internal/pkg/logger" "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" "golang.org/x/sync/errgroup" ) @@ -49,6 +51,12 @@ func RequireStandardError(t *testing.T, err error) *standarderror.Error { return standardized } +// CreateTestLogger create a default logger +// for our tests. +func CreateTestLogger() *logger.Logger { + return logger.New(logrus.DebugLevel, "tests") +} + // HTMLTestMultipartForm returns the body // for a multipate/form-data request with all // files under "html" folder. From 957b9b1cf42ba82f2ddab3dcc4acffb195bc7051 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 8 Jul 2019 18:28:13 +0200 Subject: [PATCH 021/107] adding config to test suite in the Dockerfile entrypoint --- build/tests/docker-entrypoint.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build/tests/docker-entrypoint.sh b/build/tests/docker-entrypoint.sh index 476b166f..21a86c41 100755 --- a/build/tests/docker-entrypoint.sh +++ b/build/tests/docker-entrypoint.sh @@ -9,6 +9,7 @@ go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestChromeSt go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestUnoconvStart # Running others tests. +go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/config go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/random go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/standarderror go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/timeout From c7ecdcf6256805610f69555cfa99c7f5860e3970 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 9 Jul 2019 19:39:14 +0200 Subject: [PATCH 022/107] handling context timeout/cancelled in printer package --- build/tests/docker-entrypoint.sh | 1 + internal/app/api/pkg/context/context.go | 4 ++- internal/pkg/printer/chrome.go | 16 +++++------ internal/pkg/printer/merge.go | 2 +- internal/pkg/printer/office.go | 2 +- internal/pkg/printer/printer.go | 32 ++++++++++++++++++++++ internal/pkg/printer/printer_test.go | 35 +++++++++++++++++++++++++ internal/pkg/timeout/timeout.go | 26 ------------------ internal/pkg/timeout/timeout_test.go | 24 ----------------- 9 files changed, 81 insertions(+), 61 deletions(-) create mode 100644 internal/pkg/printer/printer_test.go diff --git a/build/tests/docker-entrypoint.sh b/build/tests/docker-entrypoint.sh index 21a86c41..49aa729b 100755 --- a/build/tests/docker-entrypoint.sh +++ b/build/tests/docker-entrypoint.sh @@ -13,6 +13,7 @@ go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/int go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/random go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/standarderror go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/timeout +go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/printer go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/app/api # Finally testing processes shutdown. diff --git a/internal/app/api/pkg/context/context.go b/internal/app/api/pkg/context/context.go index e3673c35..99e70532 100644 --- a/internal/app/api/pkg/context/context.go +++ b/internal/app/api/pkg/context/context.go @@ -1,6 +1,7 @@ package context import ( + "fmt" "net/http" "strconv" "time" @@ -35,9 +36,10 @@ func New(c echo.Context, logger *logger.Logger, config *config.Config) *Context // MustCastFromEchoContext cast an echo.Context to our custom // context. If something goes wrong, panic. func MustCastFromEchoContext(c echo.Context) *Context { + const op = "MustCastFromEchoContext" ctx, ok := c.(*Context) if !ok { - panic("unable to cast an echo.Context to a custom context") + panic(fmt.Sprintf("%s: unable to cast an echo.Context to a custom context", op)) } return ctx } diff --git a/internal/pkg/printer/chrome.go b/internal/pkg/printer/chrome.go index 5bf36a9c..fe1d181a 100644 --- a/internal/pkg/printer/chrome.go +++ b/internal/pkg/printer/chrome.go @@ -44,19 +44,19 @@ func (p *chrome) Print(destination string) error { defer cancel() devt, err := devtool.New("http://localhost:9222").Version(ctx) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) } // connect to WebSocket URL (page) that speaks the Chrome DevTools Protocol. devtConn, err := rpcc.DialContext(ctx, devt.WebSocketDebuggerURL) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) } defer devtConn.Close() // nolint: errcheck // create a new CDP Client that uses conn. devtClient := cdp.NewClient(devtConn) newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) } // create a new blank target with the new browser context. createTargetArgs := target. @@ -64,13 +64,13 @@ func (p *chrome) Print(destination string) error { SetBrowserContextID(newContextTarget.BrowserContextID) newTarget, err := devtClient.Target.CreateTarget(ctx, createTargetArgs) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) } // connect the client to the new target. newTargetWsURL := fmt.Sprintf("ws://127.0.0.1:9222/devtools/page/%s", newTarget.TargetID) newContextConn, err := rpcc.DialContext(ctx, newTargetWsURL) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) } defer newContextConn.Close() // nolint: errcheck // create a new CDP Client that uses newContextConn. @@ -85,10 +85,10 @@ func (p *chrome) Print(destination string) error { func() error { return targetClient.Page.Enable(ctx) }, func() error { return targetClient.Runtime.Enable(ctx) }, ); err != nil { - return &standarderror.Error{Op: op, Err: err} + return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) } if err := p.navigate(ctx, targetClient); err != nil { - return &standarderror.Error{Op: op, Err: err} + return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) } print, err := targetClient.Page.PrintToPDF( ctx, @@ -106,7 +106,7 @@ func (p *chrome) Print(destination string) error { SetPrintBackground(true), ) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) } if err := ioutil.WriteFile(destination, print.Data, 0644); err != nil { return &standarderror.Error{Op: op, Err: err} diff --git a/internal/pkg/printer/merge.go b/internal/pkg/printer/merge.go index cc096801..746a5ee1 100644 --- a/internal/pkg/printer/merge.go +++ b/internal/pkg/printer/merge.go @@ -41,7 +41,7 @@ func (p *merge) Print(destination string) error { cmd := exec.CommandContext(p.ctx, "pdftk", cmdArgs...) _, err := cmd.Output() if err != nil { - return &standarderror.Error{Op: op, Err: err} + return handleErrContext(p.ctx, &standarderror.Error{Op: op, Err: err}) } return nil } diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index d3eaec61..26db09e9 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -43,7 +43,7 @@ func (p *office) Print(destination string) error { baseFilename := random.String(32) tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) if err := unoconv(ctx, fpath, tmpDest, p.opts); err != nil { - return &standarderror.Error{Op: op, Err: err} + return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) } fpaths[i] = tmpDest } diff --git a/internal/pkg/printer/printer.go b/internal/pkg/printer/printer.go index e1e72497..5fff84c7 100644 --- a/internal/pkg/printer/printer.go +++ b/internal/pkg/printer/printer.go @@ -1,7 +1,39 @@ package printer +import ( + "context" + "fmt" + "strings" + + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" +) + // Printer is a type that can create a PDF file from a source. // The source is defined in the underlying implementation. type Printer interface { Print(destination string) error } + +func handleErrContext(ctx context.Context, previousErr error) error { + const op = "printer.handleErrContext" + if previousErr == nil { + panic(fmt.Sprintf("%s: previous error should not be nil", op)) + } + err := ctx.Err() + if err == nil { + return previousErr + } + if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { + return &standarderror.Error{ + Code: standarderror.Timeout, + Message: "context has timed out", + Op: op, + Err: previousErr, + } + } + return &standarderror.Error{ + Message: "context finished with an error", + Op: op, + Err: previousErr, + } +} diff --git a/internal/pkg/printer/printer_test.go b/internal/pkg/printer/printer_test.go new file mode 100644 index 00000000..d844ac72 --- /dev/null +++ b/internal/pkg/printer/printer_test.go @@ -0,0 +1,35 @@ +package printer + +import ( + "errors" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/internal/pkg/timeout" + "github.com/thecodingmachine/gotenberg/test" +) + +func TestHandlerErr(t *testing.T) { + previousErr := errors.New("previous error") + // should be OK. + ctx, cancel := timeout.Context(5) + defer cancel() + assert.NotNil(t, handleErrContext(ctx, previousErr)) + // should timeout. + ctx, cancel = timeout.Context(0.5) + defer cancel() + time.Sleep(timeout.Duration(1)) + err := handleErrContext(ctx, previousErr) + assert.NotNil(t, err) + standardized := test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Timeout, standardized.Code) + // should failed. + ctx, cancel = timeout.Context(5) + cancel() + err = handleErrContext(ctx, previousErr) + assert.NotNil(t, err) + standardized = test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Internal, standarderror.Code(err)) +} diff --git a/internal/pkg/timeout/timeout.go b/internal/pkg/timeout/timeout.go index 7228ece2..f29a03d0 100644 --- a/internal/pkg/timeout/timeout.go +++ b/internal/pkg/timeout/timeout.go @@ -2,10 +2,7 @@ package timeout import ( "context" - "strings" "time" - - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) // Context creates a context with timeout for @@ -18,26 +15,3 @@ func Context(seconds float64) (context.Context, context.CancelFunc) { func Duration(seconds float64) time.Duration { return time.Duration(1000*seconds) * time.Millisecond } - -// Err returns a standarderror.Error -// if the context has an error. -func Err(ctx context.Context) error { - const op = "timeout.Err" - err := ctx.Err() - if err == nil { - return nil - } - if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { - return &standarderror.Error{ - Code: standarderror.Timeout, - Message: "context has timed out", - Op: op, - Err: err, - } - } - return &standarderror.Error{ - Message: "context finished with an error", - Op: op, - Err: err, - } -} diff --git a/internal/pkg/timeout/timeout_test.go b/internal/pkg/timeout/timeout_test.go index 9ab855e9..43f21e5c 100644 --- a/internal/pkg/timeout/timeout_test.go +++ b/internal/pkg/timeout/timeout_test.go @@ -5,8 +5,6 @@ import ( "time" "github.com/stretchr/testify/assert" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" - "github.com/thecodingmachine/gotenberg/test" ) func TestDuration(t *testing.T) { @@ -14,25 +12,3 @@ func TestDuration(t *testing.T) { result := Duration(1.5) assert.Equal(t, expected.String(), result.String()) } - -func TestErr(t *testing.T) { - // should be OK. - ctx, cancel := Context(5) - defer cancel() - assert.Nil(t, Err(ctx)) - // should timeout. - ctx, cancel = Context(0.5) - defer cancel() - time.Sleep(Duration(1)) - err := Err(ctx) - assert.NotNil(t, err) - standardized := test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Timeout, standardized.Code) - // should failed. - ctx, cancel = Context(5) - cancel() - err = Err(ctx) - assert.NotNil(t, err) - standardized = test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Internal, standarderror.Code(err)) -} From 0c1e4e6888b9086b2e787063e5938113f297d9b1 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 9 Jul 2019 22:22:22 +0200 Subject: [PATCH 023/107] WIP: tests of api pkg --- internal/app/api/pkg/context/context.go | 2 +- internal/app/api/pkg/middleware/context.go | 24 +++++++++++++++++++-- internal/app/api/pkg/middleware/error.go | 5 +++++ internal/pkg/config/config.go | 4 ++-- internal/pkg/config/config_test.go | 25 +++++++++++++++++----- internal/pkg/timeout/doc.go | 2 +- internal/pkg/timeout/timeout_test.go | 6 ++++++ test/testfunc.go | 10 +++++++++ 8 files changed, 67 insertions(+), 11 deletions(-) diff --git a/internal/app/api/pkg/context/context.go b/internal/app/api/pkg/context/context.go index 99e70532..2b32c949 100644 --- a/internal/app/api/pkg/context/context.go +++ b/internal/app/api/pkg/context/context.go @@ -36,7 +36,7 @@ func New(c echo.Context, logger *logger.Logger, config *config.Config) *Context // MustCastFromEchoContext cast an echo.Context to our custom // context. If something goes wrong, panic. func MustCastFromEchoContext(c echo.Context) *Context { - const op = "MustCastFromEchoContext" + const op = "context.MustCastFromEchoContext" ctx, ok := c.(*Context) if !ok { panic(fmt.Sprintf("%s: unable to cast an echo.Context to a custom context", op)) diff --git a/internal/app/api/pkg/middleware/context.go b/internal/app/api/pkg/middleware/context.go index c711683b..d4da5100 100644 --- a/internal/app/api/pkg/middleware/context.go +++ b/internal/app/api/pkg/middleware/context.go @@ -1,6 +1,9 @@ package middleware import ( + "fmt" + "os" + "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/handler" @@ -9,13 +12,30 @@ import ( "github.com/thecodingmachine/gotenberg/internal/pkg/random" ) +const ( + // TestingTraceEnvVar is an environment + // variable used in some tests. + TestingTraceEnvVar = "TESTING_TRACE" + // TestsTracePrefix helps + // creating all resources inside a prefix. + // Only used in some tests + // to check if the resources + // have been removed. + TestsTracePrefix = "tmp" +) + // Context helps extending the default echo.Context with // our custom context. func Context(config *config.Config) echo.MiddlewareFunc { return func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { - // generate a unique identifier for the request. - trace := random.Get() + var trace string + if os.Getenv(TestingTraceEnvVar) == "1" { + trace = fmt.Sprintf("%s/%s", TestsTracePrefix, random.Get()) + } else { + // generate a unique identifier for the request. + trace = random.Get() + } // create the logger for this request using // the previous identifier as trace. logger := logger.New(config.LogLevel(), trace) diff --git a/internal/app/api/pkg/middleware/error.go b/internal/app/api/pkg/middleware/error.go index 876459db..f5254e02 100644 --- a/internal/app/api/pkg/middleware/error.go +++ b/internal/app/api/pkg/middleware/error.go @@ -18,6 +18,11 @@ func Error() echo.MiddlewareFunc { // so far so good! return nil } + // if it's an error from echo + // like 404 not found and so on. + if echoHTTPErr, ok := err.(*echo.HTTPError); ok { + return echoHTTPErr + } // we log the initial error before returning // the HTTP error. errOp := standarderror.Op(err) diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 59246ede..6379a18e 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -52,12 +52,12 @@ func FromEnv() (*Config, error) { if err != nil { return c, &standarderror.Error{Op: op, Err: err} } - disableChromeEndpoints, err := boolFromEnv(disableGoogleChromeEnvVar, c.EnableChromeEndpoints()) + disableChromeEndpoints, err := boolFromEnv(disableGoogleChromeEnvVar, !c.EnableChromeEndpoints()) c.enableChromeEndpoints = !disableChromeEndpoints if err != nil { return c, &standarderror.Error{Op: op, Err: err} } - disableUnoconvEndpoints, err := boolFromEnv(disableUnoconvEnvVar, c.EnableUnoconvEndpoints()) + disableUnoconvEndpoints, err := boolFromEnv(disableUnoconvEnvVar, !c.EnableUnoconvEndpoints()) c.enableUnoconvEndpoints = !disableUnoconvEndpoints if err != nil { return c, &standarderror.Error{Op: op, Err: err} diff --git a/internal/pkg/config/config_test.go b/internal/pkg/config/config_test.go index 83dc4478..72efa520 100644 --- a/internal/pkg/config/config_test.go +++ b/internal/pkg/config/config_test.go @@ -12,9 +12,12 @@ import ( func TestDefaultWaitTimeout(t *testing.T) { // should be OK. - os.Setenv(defaultWaitTimeoutEnvVar, "1.5") config, err := FromEnv() assert.Nil(t, err) + assert.Equal(t, 10.0, config.DefaultWaitTimeout()) + os.Setenv(defaultWaitTimeoutEnvVar, "1.5") + config, err = FromEnv() + assert.Nil(t, err) assert.Equal(t, 1.5, config.DefaultWaitTimeout()) // should failed. os.Setenv(defaultWaitTimeoutEnvVar, "foo") @@ -27,9 +30,12 @@ func TestDefaultWaitTimeout(t *testing.T) { func TestDefaultListenPort(t *testing.T) { // should be OK. - os.Setenv(defaultListenPortEnvVar, "4000") config, err := FromEnv() assert.Nil(t, err) + assert.Equal(t, "3000", config.DefaultListenPort()) + os.Setenv(defaultListenPortEnvVar, "4000") + config, err = FromEnv() + assert.Nil(t, err) assert.Equal(t, "4000", config.DefaultListenPort()) // should failed. os.Setenv(defaultListenPortEnvVar, "foo") @@ -47,9 +53,12 @@ func TestDefaultListenPort(t *testing.T) { func TestEnableChromeEndpoints(t *testing.T) { // should be OK. - os.Setenv(disableGoogleChromeEnvVar, "1") config, err := FromEnv() assert.Nil(t, err) + assert.Equal(t, true, config.EnableChromeEndpoints()) + os.Setenv(disableGoogleChromeEnvVar, "1") + config, err = FromEnv() + assert.Nil(t, err) assert.Equal(t, false, config.EnableChromeEndpoints()) os.Setenv(disableGoogleChromeEnvVar, "0") config, err = FromEnv() @@ -66,9 +75,12 @@ func TestEnableChromeEndpoints(t *testing.T) { func TestEnableUnoconvEndpoints(t *testing.T) { // should be OK. - os.Setenv(disableUnoconvEnvVar, "1") config, err := FromEnv() assert.Nil(t, err) + assert.Equal(t, true, config.EnableUnoconvEndpoints()) + os.Setenv(disableUnoconvEnvVar, "1") + config, err = FromEnv() + assert.Nil(t, err) assert.Equal(t, false, config.EnableUnoconvEndpoints()) os.Setenv(disableUnoconvEnvVar, "0") config, err = FromEnv() @@ -85,9 +97,12 @@ func TestEnableUnoconvEndpoints(t *testing.T) { func TestLogLevel(t *testing.T) { // should be OK. - os.Setenv(logLevelEnvVar, "DEBUG") config, err := FromEnv() assert.Nil(t, err) + assert.Equal(t, logrus.InfoLevel, config.LogLevel()) + os.Setenv(logLevelEnvVar, "DEBUG") + config, err = FromEnv() + assert.Nil(t, err) assert.Equal(t, logrus.DebugLevel, config.LogLevel()) os.Setenv(logLevelEnvVar, "INFO") config, err = FromEnv() diff --git a/internal/pkg/timeout/doc.go b/internal/pkg/timeout/doc.go index e8c95004..771db613 100644 --- a/internal/pkg/timeout/doc.go +++ b/internal/pkg/timeout/doc.go @@ -1,3 +1,3 @@ -// Package timeout helps managing +// Package timeout helps creating // context with timeout. package timeout diff --git a/internal/pkg/timeout/timeout_test.go b/internal/pkg/timeout/timeout_test.go index 43f21e5c..7fa27881 100644 --- a/internal/pkg/timeout/timeout_test.go +++ b/internal/pkg/timeout/timeout_test.go @@ -7,6 +7,12 @@ import ( "github.com/stretchr/testify/assert" ) +func TestContext(t *testing.T) { + ctx, cancel := Context(1.5) + assert.NotNil(t, ctx) + assert.NotNil(t, cancel) +} + func TestDuration(t *testing.T) { expected := time.Duration(1500) * time.Millisecond result := Duration(1.5) diff --git a/test/testfunc.go b/test/testfunc.go index 428d209a..c21ba9d5 100644 --- a/test/testfunc.go +++ b/test/testfunc.go @@ -30,6 +30,16 @@ func AssertStatusCode(t *testing.T, expectedStatusCode int, srv http.Handler, re assert.Equal(t, expectedStatusCode, rec.Code) } +// AssertDirectoryEmpty checks if given directory +// is empty. +func AssertDirectoryEmpty(t *testing.T, directory string) { + f, err := os.Open(directory) + assert.Nil(t, err) + defer f.Close() // nolint: errcheck + _, err = f.Readdir(1) + assert.Equal(t, io.EOF, err) +} + // AssertConcurrent runs all functions simultaneously // and wait until execution has completed // or an error is encountered. From f6b357691ce09eb8ecea58ef1ef569ceb575de76 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Wed, 10 Jul 2019 11:46:58 +0200 Subject: [PATCH 024/107] minor refactoring of const + better timeout handling in pinter package + api package tests --- build/tests/docker-entrypoint.sh | 1 - internal/app/api/api_test.go | 388 ++++++++++++++++++++ internal/app/api/pkg/context/context.go | 6 +- internal/app/api/pkg/handler/handler.go | 2 +- internal/app/api/pkg/handler/html.go | 2 +- internal/app/api/pkg/handler/markdown.go | 2 +- internal/app/api/pkg/handler/merge.go | 2 +- internal/app/api/pkg/handler/office.go | 2 +- internal/app/api/pkg/handler/url.go | 2 +- internal/app/api/pkg/middleware/cleanup.go | 2 +- internal/app/api/pkg/middleware/context.go | 4 +- internal/app/api/pkg/resource/resource.go | 28 +- internal/pkg/config/config.go | 20 +- internal/pkg/pm2/chrome.go | 10 +- internal/pkg/pm2/pm2.go | 8 +- internal/pkg/pm2/unoconv.go | 8 +- internal/pkg/printer/chrome.go | 144 ++++---- internal/pkg/printer/markdown.go | 4 +- internal/pkg/printer/merge.go | 22 +- internal/pkg/printer/office.go | 24 +- internal/pkg/printer/printer.go | 32 -- internal/pkg/printer/printer_test.go | 35 -- internal/pkg/standarderror/standarderror.go | 2 +- internal/pkg/timeout/doc.go | 2 +- internal/pkg/timeout/timeout.go | 30 ++ internal/pkg/timeout/timeout_test.go | 32 +- test/testfunc.go | 3 + 27 files changed, 604 insertions(+), 213 deletions(-) create mode 100644 internal/app/api/api_test.go delete mode 100644 internal/pkg/printer/printer_test.go diff --git a/build/tests/docker-entrypoint.sh b/build/tests/docker-entrypoint.sh index 49aa729b..21a86c41 100755 --- a/build/tests/docker-entrypoint.sh +++ b/build/tests/docker-entrypoint.sh @@ -13,7 +13,6 @@ go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/int go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/random go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/standarderror go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/timeout -go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/printer go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/app/api # Finally testing processes shutdown. diff --git a/internal/app/api/api_test.go b/internal/app/api/api_test.go new file mode 100644 index 00000000..7a4f5dce --- /dev/null +++ b/internal/app/api/api_test.go @@ -0,0 +1,388 @@ +package api + +import ( + "errors" + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/labstack/echo/v4" + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/handler" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/middleware" + "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" + "github.com/thecodingmachine/gotenberg/internal/pkg/config" + "github.com/thecodingmachine/gotenberg/test" +) + +func TestPing(t *testing.T) { + endpoint := handler.PingEndpoint + config, err := config.FromEnv() + assert.Nil(t, err) + srv := New(config) + // should be OK. + req := httptest.NewRequest(http.MethodGet, endpoint, nil) + test.AssertStatusCode(t, http.StatusOK, srv, req) +} + +func TestMerge(t *testing.T) { + os.Setenv(middleware.TestingTraceEnvVar, "1") + endpoint := handler.MergeEndpoint + config, err := config.FromEnv() + assert.Nil(t, err) + srv := New(config) + // should be OK. + body, contentType := test.PDFTestMultipartForm(t, nil) + req := httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusOK, srv, req) + // bad request. + body, contentType = test.PDFTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + // timeout. + body, contentType = test.PDFTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "0"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) + // should have no more resources. + test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) + err = os.RemoveAll(middleware.TestsTracePrefix) + assert.Nil(t, err) + os.Unsetenv(middleware.TestingTraceEnvVar) +} + +func TestHTML(t *testing.T) { + os.Setenv(middleware.TestingTraceEnvVar, "1") + endpoint := fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.HTMLEndpoint) + config, err := config.FromEnv() + assert.Nil(t, err) + srv := New(config) + // should be OK. + body, contentType := test.HTMLTestMultipartForm(t, nil) + req := httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusOK, srv, req) + // bad request. + body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.WaitDelayFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.PaperWidthFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.PaperHeightFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.MarginTopFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.MarginBottomFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.MarginLeftFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.MarginRightFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.LandscapeFormField: "not a bool"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + // timeout. + body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "0"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) + // should have no more resources. + test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) + err = os.RemoveAll(middleware.TestsTracePrefix) + assert.Nil(t, err) + os.Unsetenv(middleware.TestingTraceEnvVar) +} + +func TestMarkdown(t *testing.T) { + os.Setenv(middleware.TestingTraceEnvVar, "1") + endpoint := fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.MarkdownEndpoint) + config, err := config.FromEnv() + assert.Nil(t, err) + srv := New(config) + // should be OK. + body, contentType := test.MarkdownTestMultipartForm(t, nil) + req := httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusOK, srv, req) + // bad request. + body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.WaitDelayFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.PaperWidthFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.PaperHeightFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.MarginTopFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.MarginBottomFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.MarginLeftFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.MarginRightFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.LandscapeFormField: "not a bool"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + // timeout. + body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "0"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) + // should have no more resources. + test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) + err = os.RemoveAll(middleware.TestsTracePrefix) + assert.Nil(t, err) + os.Unsetenv(middleware.TestingTraceEnvVar) +} + +func TestURL(t *testing.T) { + os.Setenv(middleware.TestingTraceEnvVar, "1") + endpoint := fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.URLEndpoint) + config, err := config.FromEnv() + assert.Nil(t, err) + srv := New(config) + // should be OK. + body, contentType := test.URLTestMultipartForm(t, nil) + req := httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusOK, srv, req) + // bad request. + body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.WaitDelayFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.PaperWidthFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.PaperHeightFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.MarginTopFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.MarginBottomFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.MarginLeftFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.MarginRightFormField: "not a float"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.LandscapeFormField: "not a bool"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusBadRequest, srv, req) + // timeout. + body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "0"}) + req = httptest.NewRequest(http.MethodPost, endpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) + // should have no more resources. + test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) + err = os.RemoveAll(middleware.TestsTracePrefix) + assert.Nil(t, err) + os.Unsetenv(middleware.TestingTraceEnvVar) +} + +func TestConcurrent(t *testing.T) { + const concurrentRequests int = 4 + os.Setenv(middleware.TestingTraceEnvVar, "1") + config, err := config.FromEnv() + assert.Nil(t, err) + srv := New(config) + // Merge. + test.AssertConcurrent( + t, + func() error { + body, contentType := test.PDFTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "120"}) + req := httptest.NewRequest(http.MethodPost, handler.MergeEndpoint, body) + req.Header.Set(echo.HeaderContentType, contentType) + rec := httptest.NewRecorder() + srv.ServeHTTP(rec, req) + if rec.Code != http.StatusOK { + return fmt.Errorf("wrong status code: want '%d' got '%d'", http.StatusOK, rec.Code) + } + return nil + }, + concurrentRequests, + ) + // HTML. + test.AssertConcurrent( + t, + func() error { + body, contentType := test.HTMLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "120"}) + req := httptest.NewRequest(http.MethodPost, fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.HTMLEndpoint), body) + req.Header.Set(echo.HeaderContentType, contentType) + rec := httptest.NewRecorder() + srv.ServeHTTP(rec, req) + if rec.Code != http.StatusOK { + return fmt.Errorf("wrong status code: want '%d' got '%d'", http.StatusOK, rec.Code) + } + return nil + }, + concurrentRequests, + ) + // Markdown. + test.AssertConcurrent( + t, + func() error { + body, contentType := test.MarkdownTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "120"}) + req := httptest.NewRequest(http.MethodPost, fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.MarkdownEndpoint), body) + req.Header.Set(echo.HeaderContentType, contentType) + rec := httptest.NewRecorder() + srv.ServeHTTP(rec, req) + if rec.Code != http.StatusOK { + return fmt.Errorf("wrong status code: want '%d' got '%d'", http.StatusOK, rec.Code) + } + return nil + }, + concurrentRequests, + ) + // URL. + test.AssertConcurrent( + t, + func() error { + body, contentType := test.URLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "120"}) + req := httptest.NewRequest(http.MethodPost, fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.URLEndpoint), body) + req.Header.Set(echo.HeaderContentType, contentType) + rec := httptest.NewRecorder() + srv.ServeHTTP(rec, req) + if rec.Code != http.StatusOK { + return fmt.Errorf("wrong status code: want '%d' got '%d'", http.StatusOK, rec.Code) + } + return nil + }, + concurrentRequests, + ) + // Office. + test.AssertConcurrent( + t, + func() error { + body, contentType := test.OfficeTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "120"}) + req := httptest.NewRequest(http.MethodPost, fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.OfficeEndpoint), body) + req.Header.Set(echo.HeaderContentType, contentType) + rec := httptest.NewRecorder() + srv.ServeHTTP(rec, req) + if rec.Code != http.StatusOK { + return fmt.Errorf("wrong status code: want '%d' got '%d'", http.StatusOK, rec.Code) + } + return nil + }, + concurrentRequests, + ) + // should have no more resources. + test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) + err = os.RemoveAll(middleware.TestsTracePrefix) + assert.Nil(t, err) + os.Unsetenv(middleware.TestingTraceEnvVar) +} + +func TestWebhook(t *testing.T) { + status := make(chan error, 2) + rcv := echo.New() + rcv.POST("/foo", func(c echo.Context) error { + if c.Request().Header.Get("Content-type") != "application/pdf" { + status <- fmt.Errorf("wrong Content-type: got '%s' want '%s'", c.Request().Header.Get("Content-type"), "application/pdf") + return nil + } + body, err := ioutil.ReadAll(c.Request().Body) + if err != nil { + status <- err + return nil + } + if body == nil || len(body) == 0 { + status <- errors.New("empty body") + return nil + } + status <- nil + return nil + }) + go func() { + rcv.Start(":3001") + }() + os.Setenv(middleware.TestingTraceEnvVar, "1") + config, err := config.FromEnv() + assert.Nil(t, err) + srv := New(config) + body, contentType := test.PDFTestMultipartForm(t, map[string]string{resource.WebhookURLFormField: "http://localhost:3001/foo"}) + req := httptest.NewRequest(http.MethodPost, "/merge", body) + req.Header.Set(echo.HeaderContentType, contentType) + test.AssertStatusCode(t, http.StatusOK, srv, req) + err = <-status + assert.NoError(t, err) + // should have no more resources. + test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) + err = os.RemoveAll(middleware.TestsTracePrefix) + assert.Nil(t, err) + os.Unsetenv(middleware.TestingTraceEnvVar) +} + +func TestResultFilename(t *testing.T) { + os.Setenv(middleware.TestingTraceEnvVar, "1") + config, err := config.FromEnv() + assert.Nil(t, err) + srv := New(config) + body, contentType := test.PDFTestMultipartForm(t, map[string]string{resource.ResultFilenameFormField: "foo.pdf"}) + req := httptest.NewRequest(http.MethodPost, "/merge", body) + req.Header.Set(echo.HeaderContentType, contentType) + rec := httptest.NewRecorder() + srv.ServeHTTP(rec, req) + assert.Equal(t, "attachment; filename=\"foo.pdf\"", rec.Header().Get("Content-Disposition")) + // should have no more resources. + test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) + err = os.RemoveAll(middleware.TestsTracePrefix) + assert.Nil(t, err) + os.Unsetenv(middleware.TestingTraceEnvVar) +} diff --git a/internal/app/api/pkg/context/context.go b/internal/app/api/pkg/context/context.go index 2b32c949..f8437f95 100644 --- a/internal/app/api/pkg/context/context.go +++ b/internal/app/api/pkg/context/context.go @@ -36,7 +36,7 @@ func New(c echo.Context, logger *logger.Logger, config *config.Config) *Context // MustCastFromEchoContext cast an echo.Context to our custom // context. If something goes wrong, panic. func MustCastFromEchoContext(c echo.Context) *Context { - const op = "context.MustCastFromEchoContext" + const op string = "context.MustCastFromEchoContext" ctx, ok := c.(*Context) if !ok { panic(fmt.Sprintf("%s: unable to cast an echo.Context to a custom context", op)) @@ -60,7 +60,7 @@ func (ctx *Context) Resource() *resource.Resource { // WithResource adds a resource to the context. func (ctx *Context) WithResource(resourceDirPath string) error { - const op = "context.WithResource" + const op string = "context.WithResource" r, err := resource.New(ctx, ctx.logger, ctx.config, resourceDirPath) ctx.resource = r if err != nil { @@ -75,7 +75,7 @@ func (ctx *Context) WithResource(resourceDirPath string) error { // LogRequestResult logs the result of a request. // This method should only be used by a middleware! func (ctx *Context) LogRequestResult(err error, isDebug bool) error { - const op = "context.LogRequestResult" + const op string = "context.LogRequestResult" req := ctx.Request() resp := ctx.Response() stopTime := time.Now() diff --git a/internal/app/api/pkg/handler/handler.go b/internal/app/api/pkg/handler/handler.go index b511818c..92d70f45 100644 --- a/internal/app/api/pkg/handler/handler.go +++ b/internal/app/api/pkg/handler/handler.go @@ -35,7 +35,7 @@ const ( ) func convert(ctx *context.Context, p printer.Printer) error { - const op = "handler.convert" + const op string = "handler.convert" r := ctx.Resource() logger := ctx.StandardLogger() baseFilename := random.Get() diff --git a/internal/app/api/pkg/handler/html.go b/internal/app/api/pkg/handler/html.go index eb1581bb..c64f70c7 100644 --- a/internal/app/api/pkg/handler/html.go +++ b/internal/app/api/pkg/handler/html.go @@ -10,7 +10,7 @@ import ( // HTML is the endpoint for converting // HTML to PDF. func HTML(c echo.Context) error { - const op = "handler.HTML" + const op string = "handler.HTML" ctx := context.MustCastFromEchoContext(c) ctx.StandardLogger().DebugfOp(op, "html request") r := ctx.Resource() diff --git a/internal/app/api/pkg/handler/markdown.go b/internal/app/api/pkg/handler/markdown.go index a7f59379..6283d4c3 100644 --- a/internal/app/api/pkg/handler/markdown.go +++ b/internal/app/api/pkg/handler/markdown.go @@ -10,7 +10,7 @@ import ( // Markdown is the endpoint for converting // Markdown to PDF. func Markdown(c echo.Context) error { - const op = "handler.Markdown" + const op string = "handler.Markdown" ctx := context.MustCastFromEchoContext(c) ctx.StandardLogger().DebugfOp(op, "markdown request") r := ctx.Resource() diff --git a/internal/app/api/pkg/handler/merge.go b/internal/app/api/pkg/handler/merge.go index 381e7da2..e3422673 100644 --- a/internal/app/api/pkg/handler/merge.go +++ b/internal/app/api/pkg/handler/merge.go @@ -10,7 +10,7 @@ import ( // Merge is the endpoint for // merging PDF files. func Merge(c echo.Context) error { - const op = "handler.Merge" + const op string = "handler.Merge" ctx := context.MustCastFromEchoContext(c) ctx.StandardLogger().DebugfOp(op, "merge request") r := ctx.Resource() diff --git a/internal/app/api/pkg/handler/office.go b/internal/app/api/pkg/handler/office.go index 60ccca1c..2532e21e 100644 --- a/internal/app/api/pkg/handler/office.go +++ b/internal/app/api/pkg/handler/office.go @@ -10,7 +10,7 @@ import ( // Office is the endpoint for converting // Office files to PDF. func Office(c echo.Context) error { - const op = "handler.Office" + const op string = "handler.Office" ctx := context.MustCastFromEchoContext(c) ctx.StandardLogger().DebugfOp(op, "office request") r := ctx.Resource() diff --git a/internal/app/api/pkg/handler/url.go b/internal/app/api/pkg/handler/url.go index f7383a3c..f4264f00 100644 --- a/internal/app/api/pkg/handler/url.go +++ b/internal/app/api/pkg/handler/url.go @@ -11,7 +11,7 @@ import ( // URL is the endpoint for converting // a URL to PDF. func URL(c echo.Context) error { - const op = "handler.URL" + const op string = "handler.URL" ctx := context.MustCastFromEchoContext(c) ctx.StandardLogger().DebugfOp(op, "url request") r := ctx.Resource() diff --git a/internal/app/api/pkg/middleware/cleanup.go b/internal/app/api/pkg/middleware/cleanup.go index ee21c9fb..6f6c57f7 100644 --- a/internal/app/api/pkg/middleware/cleanup.go +++ b/internal/app/api/pkg/middleware/cleanup.go @@ -11,7 +11,7 @@ import ( func Cleanup() echo.MiddlewareFunc { return func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { - const op = "middleware.Cleanup" + const op string = "middleware.Cleanup" err := next(c) ctx := context.MustCastFromEchoContext(c) r := ctx.Resource() diff --git a/internal/app/api/pkg/middleware/context.go b/internal/app/api/pkg/middleware/context.go index d4da5100..d917ba7b 100644 --- a/internal/app/api/pkg/middleware/context.go +++ b/internal/app/api/pkg/middleware/context.go @@ -15,13 +15,13 @@ import ( const ( // TestingTraceEnvVar is an environment // variable used in some tests. - TestingTraceEnvVar = "TESTING_TRACE" + TestingTraceEnvVar string = "TESTING_TRACE" // TestsTracePrefix helps // creating all resources inside a prefix. // Only used in some tests // to check if the resources // have been removed. - TestsTracePrefix = "tmp" + TestsTracePrefix string = "tmp" ) // Context helps extending the default echo.Context with diff --git a/internal/app/api/pkg/resource/resource.go b/internal/app/api/pkg/resource/resource.go index 69eb487a..c8eba0d9 100644 --- a/internal/app/api/pkg/resource/resource.go +++ b/internal/app/api/pkg/resource/resource.go @@ -65,7 +65,7 @@ type Resource struct { // New creates a new resource. func New(c echo.Context, logger *logger.Logger, config *config.Config, dirPath string) (*Resource, error) { - const op = "resource.New" + const op string = "resource.New" r := &Resource{ logger: logger, config: config, @@ -83,7 +83,7 @@ func New(c echo.Context, logger *logger.Logger, config *config.Config, dirPath s } func formValues(c echo.Context, logger *logger.Logger) map[string]string { - const op = "resource.formValues" + const op string = "resource.formValues" v := make(map[string]string) fetch := func(formField string) string { value := c.FormValue(formField) @@ -110,7 +110,7 @@ func formValues(c echo.Context, logger *logger.Logger) map[string]string { } func formFiles(c echo.Context, logger *logger.Logger, dirPath string) error { - const op = "resource.formFiles" + const op string = "resource.formFiles" form, err := c.MultipartForm() if err != nil { return &standarderror.Error{Op: op, Err: err} @@ -153,7 +153,7 @@ func (r *Resource) DirPath() string { // Close deletes the working directory of the // resource if it exists. func (r *Resource) Close() error { - const op = "resource.Close" + const op string = "resource.Close" if _, err := os.Stat(r.formFilesDirPath); os.IsNotExist(err) { r.logger.DebugfOp(op, "directory '%s' does not exist, nothing to remove", r.formFilesDirPath) return nil @@ -171,7 +171,7 @@ const defaultHeaderFooterHTML string = "" // thanks to the form values and form files from the request // plus the default values from the configuration. func (r *Resource) ChromePrinterOptions() (*printer.ChromeOptions, error) { - const op = "resource.ChromePrinterOptions" + const op string = "resource.ChromePrinterOptions" waitTimeout, err := r.float64(WaitTimeoutFormField, r.config.DefaultWaitTimeout()) if err != nil { return nil, &standarderror.Error{Op: op, Err: err} @@ -237,7 +237,7 @@ func (r *Resource) ChromePrinterOptions() (*printer.ChromeOptions, error) { // thanks to the form values from the request // plus the default values from the configuration. func (r *Resource) OfficePrinterOptions() (*printer.OfficeOptions, error) { - const op = "resource.OfficePrinterOptions" + const op string = "resource.OfficePrinterOptions" waitTimeout, err := r.float64(WaitTimeoutFormField, r.config.DefaultWaitTimeout()) if err != nil { return nil, &standarderror.Error{Op: op, Err: err} @@ -258,7 +258,7 @@ func (r *Resource) OfficePrinterOptions() (*printer.OfficeOptions, error) { // thanks to the form values from the request // plus the default values from the configuration. func (r *Resource) MergePrinterOptions() (*printer.MergeOptions, error) { - const op = "resource.MergePrinterOptions" + const op string = "resource.MergePrinterOptions" waitTimeout, err := r.float64(WaitTimeoutFormField, r.config.DefaultWaitTimeout()) if err != nil { return nil, &standarderror.Error{Op: op, Err: err} @@ -289,7 +289,7 @@ func (r *Resource) hasFile(filename string) bool { // Get returns the form field value. func (r *Resource) Get(formField string) (string, error) { - const op = "resource.Get" + const op string = "resource.Get" v, err := r.value(formField) if err != nil { return "", &standarderror.Error{Op: op, Err: err} @@ -298,7 +298,7 @@ func (r *Resource) Get(formField string) (string, error) { } func (r *Resource) value(formField string) (string, error) { - const op = "resource.value" + const op string = "resource.value" v, ok := r.formValues[formField] if !ok { return "", &standarderror.Error{ @@ -311,7 +311,7 @@ func (r *Resource) value(formField string) (string, error) { } func (r *Resource) float64(formField string, defaultValue float64) (float64, error) { - const op = "resource.float64" + const op string = "resource.float64" if !r.Has(formField) { return defaultValue, nil } @@ -331,7 +331,7 @@ func (r *Resource) float64(formField string, defaultValue float64) (float64, err } func (r *Resource) bool(formField string, defaultValue bool) (bool, error) { - const op = "resource.bool" + const op string = "resource.bool" if !r.Has(formField) { return defaultValue, nil } @@ -353,7 +353,7 @@ func (r *Resource) bool(formField string, defaultValue bool) (bool, error) { // Fpath returns the path of the given filename. // This filename should be the name of a form file. func (r *Resource) Fpath(filename string) (string, error) { - const op = "resource.Fpath" + const op string = "resource.Fpath" fpath := fmt.Sprintf("%s/%s", r.formFilesDirPath, filename) _, err := os.Stat(fpath) if os.IsNotExist(err) { @@ -371,7 +371,7 @@ func (r *Resource) Fpath(filename string) (string, error) { } func (r *Resource) content(filename string, defaultValue string) (string, error) { - const op = "resource.content" + const op string = "resource.content" if !r.hasFile(filename) { return defaultValue, nil } @@ -389,7 +389,7 @@ func (r *Resource) content(filename string, defaultValue string) (string, error) // Fpaths returns the list of files of the resource // according to given file extensions. func (r *Resource) Fpaths(exts ...string) ([]string, error) { - const op = "resource.Fpaths" + const op string = "resource.Fpaths" var fpaths []string err := filepath.Walk(r.formFilesDirPath, func(path string, info os.FileInfo, _ error) error { if info.IsDir() { diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 6379a18e..41be1df9 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -10,11 +10,11 @@ import ( ) const ( - defaultWaitTimeoutEnvVar = "DEFAULT_WAIT_TIMEOUT" - defaultListenPortEnvVar = "DEFAULT_LISTEN_PORT" - disableGoogleChromeEnvVar = "DISABLE_GOOGLE_CHROME" - disableUnoconvEnvVar = "DISABLE_UNOCONV" - logLevelEnvVar = "LOG_LEVEL" + defaultWaitTimeoutEnvVar string = "DEFAULT_WAIT_TIMEOUT" + defaultListenPortEnvVar string = "DEFAULT_LISTEN_PORT" + disableGoogleChromeEnvVar string = "DISABLE_GOOGLE_CHROME" + disableUnoconvEnvVar string = "DISABLE_UNOCONV" + logLevelEnvVar string = "LOG_LEVEL" ) // Config contains the application @@ -40,7 +40,7 @@ func defaultConfig() *Config { // FromEnv fetches configuration // from environment variables. func FromEnv() (*Config, error) { - const op = "config.FromEnv" + const op string = "config.FromEnv" c := defaultConfig() defaultWaitTimeout, err := defaultWaitTimeoutFromEnv(defaultWaitTimeoutEnvVar, c.DefaultWaitTimeout()) c.defaultWaitTimeout = defaultWaitTimeout @@ -103,7 +103,7 @@ func (c *Config) LogLevel() logrus.Level { } func defaultWaitTimeoutFromEnv(envVar string, defaultValue float64) (float64, error) { - const op = "config.defaultWaitTimeoutFromEnv" + const op string = "config.defaultWaitTimeoutFromEnv" if v, ok := os.LookupEnv(envVar); ok { waitTimeout, err := strconv.ParseFloat(v, 64) if err != nil { @@ -119,7 +119,7 @@ func defaultWaitTimeoutFromEnv(envVar string, defaultValue float64) (float64, er } func defaultListenPortFromEnv(envVar string, defaultValue string) (string, error) { - const op = "config.defaultListenPortFromEnv" + const op string = "config.defaultListenPortFromEnv" if v, ok := os.LookupEnv(envVar); ok { portAsUint, err := strconv.ParseUint(v, 10, 64) if err != nil { @@ -142,7 +142,7 @@ func defaultListenPortFromEnv(envVar string, defaultValue string) (string, error } func boolFromEnv(envVar string, defaultValue bool) (bool, error) { - const op = "config.boolFromEnv" + const op string = "config.boolFromEnv" if v, ok := os.LookupEnv(envVar); ok { if v != "1" && v != "0" { return defaultValue, &standarderror.Error{ @@ -157,7 +157,7 @@ func boolFromEnv(envVar string, defaultValue bool) (bool, error) { } func logLevelFromEnv(envVar string, defaultValue logrus.Level) (logrus.Level, error) { - const op = "config.logLevelFromEnv" + const op string = "config.logLevelFromEnv" if v, ok := os.LookupEnv(envVar); ok { switch v { case "DEBUG": diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index 94492ede..52a639c9 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -9,7 +9,7 @@ import ( "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) -const chromeWarmupTime = 10 * time.Second +const chromeWarmupTime time.Duration = 10 * time.Second type chrome struct { manager *processManager @@ -28,7 +28,7 @@ func (p *chrome) Fullname() string { } func (p *chrome) Start() error { - const op = "pm2.chrome.Start" + const op string = "pm2.chrome.Start" if err := p.manager.start(p); err != nil { return &standarderror.Error{Op: op, Err: err} } @@ -36,7 +36,7 @@ func (p *chrome) Start() error { } func (p *chrome) Shutdown() error { - const op = "pm2.chrome.Shutdown" + const op string = "pm2.chrome.Shutdown" if err := p.manager.shutdown(p); err != nil { return &standarderror.Error{Op: op, Err: err} } @@ -67,7 +67,7 @@ func (p *chrome) name() string { } func (p *chrome) viable() bool { - const op = "pm2.chrome.viable" + const op string = "pm2.chrome.viable" // check if Google Chrome is correctly running. ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -93,7 +93,7 @@ func (p *chrome) viable() bool { } func (p *chrome) warmup() { - const op = "pm2.chrome.warmup" + const op string = "pm2.chrome.warmup" p.manager.logger.DebugfOp( op, "allowing %v to startup", diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go index 065ff5eb..7f1113f0 100644 --- a/internal/pkg/pm2/pm2.go +++ b/internal/pkg/pm2/pm2.go @@ -12,7 +12,7 @@ import ( ) const ( - stoppedState = iota + stoppedState int32 = iota runningState errorState ) @@ -35,7 +35,7 @@ type processManager struct { } func (m *processManager) start(p Process) error { - const op = "pm2.start" + const op string = "pm2.start" if err := m.pm2(p, "start"); err != nil { return &standarderror.Error{Op: op, Err: err} } @@ -63,7 +63,7 @@ func (m *processManager) start(p Process) error { } func (m *processManager) shutdown(p Process) error { - const op = "pm2.shutdown" + const op string = "pm2.shutdown" if m.heuristicState != runningState { return nil } @@ -76,7 +76,7 @@ func (m *processManager) shutdown(p Process) error { } func (m *processManager) pm2(p Process, cmdName string) error { - const op = "pm2.pm2" + const op string = "pm2.pm2" cmdArgs := []string{ cmdName, p.name(), diff --git a/internal/pkg/pm2/unoconv.go b/internal/pkg/pm2/unoconv.go index ab1f9cde..6c67b3f6 100644 --- a/internal/pkg/pm2/unoconv.go +++ b/internal/pkg/pm2/unoconv.go @@ -7,7 +7,7 @@ import ( "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) -const unoconvWarmupTime = 5 * time.Second +const unoconvWarmupTime time.Duration = 5 * time.Second type unoconv struct { manager *processManager @@ -26,7 +26,7 @@ func (p *unoconv) Fullname() string { } func (p *unoconv) Start() error { - const op = "pm2.unoconv.Start" + const op string = "pm2.unoconv.Start" if err := p.manager.start(p); err != nil { return &standarderror.Error{Op: op, Err: err} } @@ -34,7 +34,7 @@ func (p *unoconv) Start() error { } func (p *unoconv) Shutdown() error { - const op = "pm2.unoconv.Shutdown" + const op string = "pm2.unoconv.Shutdown" if err := p.manager.shutdown(p); err != nil { return &standarderror.Error{Op: op, Err: err} } @@ -60,7 +60,7 @@ func (p *unoconv) viable() bool { } func (p *unoconv) warmup() { - const op = "pm2.unoconv.warmup" + const op string = "pm2.unoconv.warmup" p.manager.logger.DebugfOp( op, "allowing %v to startup", diff --git a/internal/pkg/printer/chrome.go b/internal/pkg/printer/chrome.go index fe1d181a..968030dd 100644 --- a/internal/pkg/printer/chrome.go +++ b/internal/pkg/printer/chrome.go @@ -39,83 +39,89 @@ type ChromeOptions struct { } func (p *chrome) Print(destination string) error { - const op = "printer.chrome.Print" + const op string = "printer.chrome.Print" ctx, cancel := timeout.Context(p.opts.WaitTimeout + p.opts.WaitDelay) defer cancel() - devt, err := devtool.New("http://localhost:9222").Version(ctx) - if err != nil { - return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) + resolver := func() error { + devt, err := devtool.New("http://localhost:9222").Version(ctx) + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + // connect to WebSocket URL (page) that speaks the Chrome DevTools Protocol. + devtConn, err := rpcc.DialContext(ctx, devt.WebSocketDebuggerURL) + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + defer devtConn.Close() // nolint: errcheck + // create a new CDP Client that uses conn. + devtClient := cdp.NewClient(devtConn) + newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx) + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + // create a new blank target with the new browser context. + createTargetArgs := target. + NewCreateTargetArgs("about:blank"). + SetBrowserContextID(newContextTarget.BrowserContextID) + newTarget, err := devtClient.Target.CreateTarget(ctx, createTargetArgs) + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + // connect the client to the new target. + newTargetWsURL := fmt.Sprintf("ws://127.0.0.1:9222/devtools/page/%s", newTarget.TargetID) + newContextConn, err := rpcc.DialContext(ctx, newTargetWsURL) + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + defer newContextConn.Close() // nolint: errcheck + // create a new CDP Client that uses newContextConn. + targetClient := cdp.NewClient(newContextConn) + closeTargetArgs := target.NewCloseTargetArgs(newTarget.TargetID) + // close the target when done. + defer targetClient.Target.CloseTarget(ctx, closeTargetArgs) // nolint: errcheck + if err := runBatch( + // enable all the domain events that we're interested in. + func() error { return targetClient.DOM.Enable(ctx) }, + func() error { return targetClient.Network.Enable(ctx, network.NewEnableArgs()) }, + func() error { return targetClient.Page.Enable(ctx) }, + func() error { return targetClient.Runtime.Enable(ctx) }, + ); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + if err := p.navigate(ctx, targetClient); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + print, err := targetClient.Page.PrintToPDF( + ctx, + page.NewPrintToPDFArgs(). + SetPaperWidth(p.opts.PaperWidth). + SetPaperHeight(p.opts.PaperHeight). + SetMarginTop(p.opts.MarginTop). + SetMarginBottom(p.opts.MarginBottom). + SetMarginLeft(p.opts.MarginLeft). + SetMarginRight(p.opts.MarginRight). + SetLandscape(p.opts.Landscape). + SetDisplayHeaderFooter(true). + SetHeaderTemplate(p.opts.HeaderHTML). + SetFooterTemplate(p.opts.FooterHTML). + SetPrintBackground(true), + ) + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + if err := ioutil.WriteFile(destination, print.Data, 0644); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil } - // connect to WebSocket URL (page) that speaks the Chrome DevTools Protocol. - devtConn, err := rpcc.DialContext(ctx, devt.WebSocketDebuggerURL) - if err != nil { - return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) - } - defer devtConn.Close() // nolint: errcheck - // create a new CDP Client that uses conn. - devtClient := cdp.NewClient(devtConn) - newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx) - if err != nil { - return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) - } - // create a new blank target with the new browser context. - createTargetArgs := target. - NewCreateTargetArgs("about:blank"). - SetBrowserContextID(newContextTarget.BrowserContextID) - newTarget, err := devtClient.Target.CreateTarget(ctx, createTargetArgs) - if err != nil { - return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) - } - // connect the client to the new target. - newTargetWsURL := fmt.Sprintf("ws://127.0.0.1:9222/devtools/page/%s", newTarget.TargetID) - newContextConn, err := rpcc.DialContext(ctx, newTargetWsURL) - if err != nil { - return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) - } - defer newContextConn.Close() // nolint: errcheck - // create a new CDP Client that uses newContextConn. - targetClient := cdp.NewClient(newContextConn) - closeTargetArgs := target.NewCloseTargetArgs(newTarget.TargetID) - // close the target when done. - defer targetClient.Target.CloseTarget(ctx, closeTargetArgs) // nolint: errcheck - if err := runBatch( - // enable all the domain events that we're interested in. - func() error { return targetClient.DOM.Enable(ctx) }, - func() error { return targetClient.Network.Enable(ctx, network.NewEnableArgs()) }, - func() error { return targetClient.Page.Enable(ctx) }, - func() error { return targetClient.Runtime.Enable(ctx) }, - ); err != nil { - return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) - } - if err := p.navigate(ctx, targetClient); err != nil { - return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) - } - print, err := targetClient.Page.PrintToPDF( - ctx, - page.NewPrintToPDFArgs(). - SetPaperWidth(p.opts.PaperWidth). - SetPaperHeight(p.opts.PaperHeight). - SetMarginTop(p.opts.MarginTop). - SetMarginBottom(p.opts.MarginBottom). - SetMarginLeft(p.opts.MarginLeft). - SetMarginRight(p.opts.MarginRight). - SetLandscape(p.opts.Landscape). - SetDisplayHeaderFooter(true). - SetHeaderTemplate(p.opts.HeaderHTML). - SetFooterTemplate(p.opts.FooterHTML). - SetPrintBackground(true), - ) - if err != nil { - return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) - } - if err := ioutil.WriteFile(destination, print.Data, 0644); err != nil { - return &standarderror.Error{Op: op, Err: err} + if err := resolver(); err != nil { + return timeout.Err(ctx, err) } return nil } func (p *chrome) navigate(ctx context.Context, client *cdp.Client) error { - const op = "printer.chrome.navigate" + const op string = "printer.chrome.navigate" // make sure Page events are enabled. if err := client.Page.Enable(ctx); err != nil { return &standarderror.Error{Op: op, Err: err} diff --git a/internal/pkg/printer/markdown.go b/internal/pkg/printer/markdown.go index 07ea3b55..199ebeea 100644 --- a/internal/pkg/printer/markdown.go +++ b/internal/pkg/printer/markdown.go @@ -15,7 +15,7 @@ import ( // NewMarkdown returns a Markdown printer. func NewMarkdown(fpath string, opts *ChromeOptions) (Printer, error) { - const op = "printer.NewMarkdown" + const op string = "printer.NewMarkdown" tmpl, err := template. New(filepath.Base(fpath)). Funcs(template.FuncMap{"toHTML": markdownToHTML}). @@ -46,7 +46,7 @@ type templateData struct { } func markdownToHTML(dirPath, filename string) (template.HTML, error) { - const op = "printer.markdownToHTML" + const op string = "printer.markdownToHTML" fpath := fmt.Sprintf("%s/%s", dirPath, filename) b, err := ioutil.ReadFile(fpath) if err != nil { diff --git a/internal/pkg/printer/merge.go b/internal/pkg/printer/merge.go index 746a5ee1..4bf5e2e5 100644 --- a/internal/pkg/printer/merge.go +++ b/internal/pkg/printer/merge.go @@ -29,19 +29,25 @@ func NewMerge(fpaths []string, opts *MergeOptions) Printer { } func (p *merge) Print(destination string) error { - const op = "printer.merge.Print" + const op string = "printer.merge.Print" if p.ctx == nil { ctx, cancel := timeout.Context(p.opts.WaitTimeout) defer cancel() p.ctx = ctx } - var cmdArgs []string - cmdArgs = append(cmdArgs, p.fpaths...) - cmdArgs = append(cmdArgs, "cat", "output", destination) - cmd := exec.CommandContext(p.ctx, "pdftk", cmdArgs...) - _, err := cmd.Output() - if err != nil { - return handleErrContext(p.ctx, &standarderror.Error{Op: op, Err: err}) + resolver := func() error { + var cmdArgs []string + cmdArgs = append(cmdArgs, p.fpaths...) + cmdArgs = append(cmdArgs, "cat", "output", destination) + cmd := exec.CommandContext(p.ctx, "pdftk", cmdArgs...) + _, err := cmd.Output() + if err != nil { + return &standarderror.Error{Op: op, Err: err} + } + return nil + } + if err := resolver(); err != nil { + return timeout.Err(p.ctx, err) } return nil } diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index 26db09e9..d7a9520f 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -34,18 +34,24 @@ func NewOffice(fpaths []string, opts *OfficeOptions) Printer { } func (p *office) Print(destination string) error { - const op = "printer.office.Print" + const op string = "printer.office.Print" ctx, cancel := timeout.Context(p.opts.WaitTimeout) defer cancel() fpaths := make([]string, len(p.fpaths)) - dirPath := filepath.Dir(destination) - for i, fpath := range p.fpaths { - baseFilename := random.String(32) - tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) - if err := unoconv(ctx, fpath, tmpDest, p.opts); err != nil { - return handleErrContext(ctx, &standarderror.Error{Op: op, Err: err}) + resolver := func() error { + dirPath := filepath.Dir(destination) + for i, fpath := range p.fpaths { + baseFilename := random.String(32) + tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) + if err := unoconv(ctx, fpath, tmpDest, p.opts); err != nil { + return &standarderror.Error{Op: op, Err: err} + } + fpaths[i] = tmpDest } - fpaths[i] = tmpDest + return nil + } + if err := resolver(); err != nil { + return timeout.Err(ctx, err) } if len(fpaths) == 1 { if err := os.Rename(fpaths[0], destination); err != nil { @@ -67,7 +73,7 @@ func (p *office) Print(destination string) error { var mu sync.Mutex func unoconv(ctx context.Context, fpath, destination string, opts *OfficeOptions) error { - const op = "printer.unoconv" + const op string = "printer.unoconv" mu.Lock() defer mu.Unlock() cmdArgs := []string{ diff --git a/internal/pkg/printer/printer.go b/internal/pkg/printer/printer.go index 5fff84c7..e1e72497 100644 --- a/internal/pkg/printer/printer.go +++ b/internal/pkg/printer/printer.go @@ -1,39 +1,7 @@ package printer -import ( - "context" - "fmt" - "strings" - - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - // Printer is a type that can create a PDF file from a source. // The source is defined in the underlying implementation. type Printer interface { Print(destination string) error } - -func handleErrContext(ctx context.Context, previousErr error) error { - const op = "printer.handleErrContext" - if previousErr == nil { - panic(fmt.Sprintf("%s: previous error should not be nil", op)) - } - err := ctx.Err() - if err == nil { - return previousErr - } - if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { - return &standarderror.Error{ - Code: standarderror.Timeout, - Message: "context has timed out", - Op: op, - Err: previousErr, - } - } - return &standarderror.Error{ - Message: "context finished with an error", - Op: op, - Err: previousErr, - } -} diff --git a/internal/pkg/printer/printer_test.go b/internal/pkg/printer/printer_test.go deleted file mode 100644 index d844ac72..00000000 --- a/internal/pkg/printer/printer_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package printer - -import ( - "errors" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" - "github.com/thecodingmachine/gotenberg/internal/pkg/timeout" - "github.com/thecodingmachine/gotenberg/test" -) - -func TestHandlerErr(t *testing.T) { - previousErr := errors.New("previous error") - // should be OK. - ctx, cancel := timeout.Context(5) - defer cancel() - assert.NotNil(t, handleErrContext(ctx, previousErr)) - // should timeout. - ctx, cancel = timeout.Context(0.5) - defer cancel() - time.Sleep(timeout.Duration(1)) - err := handleErrContext(ctx, previousErr) - assert.NotNil(t, err) - standardized := test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Timeout, standardized.Code) - // should failed. - ctx, cancel = timeout.Context(5) - cancel() - err = handleErrContext(ctx, previousErr) - assert.NotNil(t, err) - standardized = test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Internal, standarderror.Code(err)) -} diff --git a/internal/pkg/standarderror/standarderror.go b/internal/pkg/standarderror/standarderror.go index f5ad9ec8..d39cc2f0 100644 --- a/internal/pkg/standarderror/standarderror.go +++ b/internal/pkg/standarderror/standarderror.go @@ -64,7 +64,7 @@ func Code(err error) string { return Internal } -const defaultMessage = "an internal error has occurred: please contact technical support" +const defaultMessage string = "an internal error has occurred: please contact technical support" // Message returns the human-readable message of the error, if available. // Otherwise returns a generic error message. diff --git a/internal/pkg/timeout/doc.go b/internal/pkg/timeout/doc.go index 771db613..e8c95004 100644 --- a/internal/pkg/timeout/doc.go +++ b/internal/pkg/timeout/doc.go @@ -1,3 +1,3 @@ -// Package timeout helps creating +// Package timeout helps managing // context with timeout. package timeout diff --git a/internal/pkg/timeout/timeout.go b/internal/pkg/timeout/timeout.go index f29a03d0..37a61325 100644 --- a/internal/pkg/timeout/timeout.go +++ b/internal/pkg/timeout/timeout.go @@ -2,7 +2,11 @@ package timeout import ( "context" + "fmt" + "strings" "time" + + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" ) // Context creates a context with timeout for @@ -15,3 +19,29 @@ func Context(seconds float64) (context.Context, context.CancelFunc) { func Duration(seconds float64) time.Duration { return time.Duration(1000*seconds) * time.Millisecond } + +// Err checks if there is an error in the given context +// and wraps the previous error inside a standarderror.Error. +func Err(ctx context.Context, previousErr error) error { + const op string = "timeout.Err" + if previousErr == nil { + panic(fmt.Sprintf("%s: previous error should not be nil", op)) + } + err := ctx.Err() + if err == nil { + return previousErr + } + if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { + return &standarderror.Error{ + Code: standarderror.Timeout, + Message: "context has timed out", + Op: op, + Err: previousErr, + } + } + return &standarderror.Error{ + Message: "context finished with an error", + Op: op, + Err: previousErr, + } +} diff --git a/internal/pkg/timeout/timeout_test.go b/internal/pkg/timeout/timeout_test.go index 7fa27881..3ff7f724 100644 --- a/internal/pkg/timeout/timeout_test.go +++ b/internal/pkg/timeout/timeout_test.go @@ -1,20 +1,40 @@ package timeout import ( + "errors" "testing" "time" "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/test" ) -func TestContext(t *testing.T) { - ctx, cancel := Context(1.5) - assert.NotNil(t, ctx) - assert.NotNil(t, cancel) -} - func TestDuration(t *testing.T) { expected := time.Duration(1500) * time.Millisecond result := Duration(1.5) assert.Equal(t, expected.String(), result.String()) } + +func TestErr(t *testing.T) { + previousErr := errors.New("previous error") + // should be OK. + ctx, cancel := Context(5) + defer cancel() + assert.NotNil(t, Err(ctx, previousErr)) + // should timeout. + ctx, cancel = Context(0.5) + defer cancel() + time.Sleep(Duration(1)) + err := Err(ctx, previousErr) + assert.NotNil(t, err) + standardized := test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Timeout, standardized.Code) + // should failed. + ctx, cancel = Context(5) + cancel() + err = Err(ctx, previousErr) + assert.NotNil(t, err) + standardized = test.RequireStandardError(t, err) + assert.Equal(t, standarderror.Internal, standarderror.Code(err)) +} diff --git a/test/testfunc.go b/test/testfunc.go index c21ba9d5..ba597b25 100644 --- a/test/testfunc.go +++ b/test/testfunc.go @@ -37,6 +37,9 @@ func AssertDirectoryEmpty(t *testing.T, directory string) { assert.Nil(t, err) defer f.Close() // nolint: errcheck _, err = f.Readdir(1) + if err == nil { + return + } assert.Equal(t, io.EOF, err) } From 7bfbda44907af5f60f7690c3f27d920b52e9560a Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 23 Jul 2019 13:57:18 +0200 Subject: [PATCH 025/107] huge refactoring --- .dockerignore | 2 - .travis.yml | 4 +- Makefile | 49 +- build/base/Dockerfile | 6 +- build/docs/Dockerfile | 6 +- build/lint/Dockerfile | 17 +- build/package/Dockerfile | 11 +- build/tests/Dockerfile | 50 +-- build/tests/docker-entrypoint.sh | 32 +- build/workspace/Dockerfile | 52 +++ cmd/gotenberg/main.go | 41 +- internal/app/api/api.go | 34 -- internal/app/api/api_test.go | 388 ---------------- internal/app/api/doc.go | 2 - internal/app/api/pkg/context/context.go | 134 ------ internal/app/api/pkg/context/doc.go | 3 - internal/app/api/pkg/handler/doc.go | 3 - internal/app/api/pkg/handler/handler.go | 142 ------ internal/app/api/pkg/handler/html.go | 30 -- internal/app/api/pkg/handler/markdown.go | 33 -- internal/app/api/pkg/handler/merge.go | 30 -- internal/app/api/pkg/handler/office.go | 43 -- internal/app/api/pkg/handler/ping.go | 10 - internal/app/api/pkg/handler/url.go | 31 -- internal/app/api/pkg/middleware/cleanup.go | 38 -- internal/app/api/pkg/middleware/context.go | 60 --- internal/app/api/pkg/middleware/doc.go | 3 - internal/app/api/pkg/middleware/error.go | 48 -- internal/app/api/pkg/middleware/logger.go | 21 - internal/app/api/pkg/resource/doc.go | 5 - internal/app/api/pkg/resource/resource.go | 421 ------------------ internal/app/xhttp/doc.go | 3 + internal/app/xhttp/handler.go | 298 +++++++++++++ internal/app/xhttp/middleware.go | 128 ++++++ internal/app/xhttp/option.go | 93 ++++ internal/app/xhttp/pkg/context/context.go | 210 +++++++++ internal/app/xhttp/pkg/context/doc.go | 7 + internal/app/xhttp/pkg/resource/arg.go | 253 +++++++++++ internal/app/xhttp/pkg/resource/doc.go | 8 + internal/app/xhttp/pkg/resource/file.go | 91 ++++ internal/app/xhttp/pkg/resource/resource.go | 227 ++++++++++ internal/app/xhttp/xhttp.go | 33 ++ internal/pkg/conf/conf.go | 206 +++++++++ internal/pkg/conf/conf_test.go | 334 ++++++++++++++ internal/pkg/conf/doc.go | 3 + internal/pkg/config/config.go | 178 -------- internal/pkg/config/config_test.go | 123 ----- internal/pkg/config/doc.go | 3 - internal/pkg/logger/doc.go | 3 - internal/pkg/logger/logger.go | 63 --- internal/pkg/pm2/chrome.go | 111 ++--- internal/pkg/pm2/chrome_test.go | 20 - internal/pkg/pm2/doc.go | 2 +- internal/pkg/pm2/pm2.go | 170 +++---- internal/pkg/pm2/unoconv.go | 88 ++-- internal/pkg/pm2/unoconv_test.go | 20 - internal/pkg/printer/chrome.go | 129 +++--- internal/pkg/printer/doc.go | 6 +- internal/pkg/printer/html.go | 14 +- internal/pkg/printer/markdown.go | 61 +-- internal/pkg/printer/merge.go | 60 ++- internal/pkg/printer/office.go | 120 ++--- internal/pkg/printer/printer.go | 9 + internal/pkg/printer/url.go | 16 +- internal/pkg/random/doc.go | 3 - internal/pkg/standarderror/doc.go | 7 - internal/pkg/standarderror/standarderror.go | 108 ----- .../pkg/standarderror/standarderror_test.go | 70 --- internal/pkg/timeout/doc.go | 3 - internal/pkg/timeout/timeout.go | 47 -- internal/pkg/timeout/timeout_test.go | 40 -- internal/pkg/xassert/doc.go | 8 + internal/pkg/xassert/float64.go | 88 ++++ internal/pkg/xassert/float64_test.go | 32 ++ internal/pkg/xassert/int64.go | 88 ++++ internal/pkg/xassert/int64_test.go | 32 ++ internal/pkg/xassert/string.go | 60 +++ internal/pkg/xassert/string_test.go | 20 + internal/pkg/xassert/xassert.go | 185 ++++++++ internal/pkg/xassert/xassert_test.go | 289 ++++++++++++ internal/pkg/xcontext/doc.go | 3 + internal/pkg/xcontext/xcontext.go | 56 +++ internal/pkg/xcontext/xcontext_test.go | 43 ++ internal/pkg/xerror/doc.go | 7 + internal/pkg/xerror/xerror.go | 152 +++++++ internal/pkg/xerror/xerror_test.go | 97 ++++ internal/pkg/xexec/doc.go | 8 + internal/pkg/xexec/xexec.go | 99 ++++ internal/pkg/xexec/xexec_test.go | 39 ++ internal/pkg/xlog/doc.go | 17 + internal/pkg/xlog/xlog.go | 141 ++++++ internal/pkg/xrand/doc.go | 3 + .../pkg/{random/random.go => xrand/xrand.go} | 2 +- .../random_test.go => xrand/xrand_test.go} | 2 +- internal/pkg/xtime/doc.go | 6 + internal/pkg/xtime/xtime.go | 10 + internal/pkg/xtime/xtime_test.go | 14 + scripts/publish.sh | 2 - test/cmd/pm2/pm2.go | 18 + test/doc.go | 3 + test/internalpkg/xerrortest/doc.go | 6 + test/internalpkg/xerrortest/xerrortest.go | 18 + test/internalpkg/xlogtest/doc.go | 6 + test/internalpkg/xlogtest/xlogtest.go | 23 + test/testfunc.go | 24 +- 105 files changed, 4051 insertions(+), 2667 deletions(-) delete mode 100644 .dockerignore create mode 100644 build/workspace/Dockerfile delete mode 100644 internal/app/api/api.go delete mode 100644 internal/app/api/api_test.go delete mode 100644 internal/app/api/doc.go delete mode 100644 internal/app/api/pkg/context/context.go delete mode 100644 internal/app/api/pkg/context/doc.go delete mode 100644 internal/app/api/pkg/handler/doc.go delete mode 100644 internal/app/api/pkg/handler/handler.go delete mode 100644 internal/app/api/pkg/handler/html.go delete mode 100644 internal/app/api/pkg/handler/markdown.go delete mode 100644 internal/app/api/pkg/handler/merge.go delete mode 100644 internal/app/api/pkg/handler/office.go delete mode 100644 internal/app/api/pkg/handler/ping.go delete mode 100644 internal/app/api/pkg/handler/url.go delete mode 100644 internal/app/api/pkg/middleware/cleanup.go delete mode 100644 internal/app/api/pkg/middleware/context.go delete mode 100644 internal/app/api/pkg/middleware/doc.go delete mode 100644 internal/app/api/pkg/middleware/error.go delete mode 100644 internal/app/api/pkg/middleware/logger.go delete mode 100644 internal/app/api/pkg/resource/doc.go delete mode 100644 internal/app/api/pkg/resource/resource.go create mode 100644 internal/app/xhttp/doc.go create mode 100644 internal/app/xhttp/handler.go create mode 100644 internal/app/xhttp/middleware.go create mode 100644 internal/app/xhttp/option.go create mode 100644 internal/app/xhttp/pkg/context/context.go create mode 100644 internal/app/xhttp/pkg/context/doc.go create mode 100644 internal/app/xhttp/pkg/resource/arg.go create mode 100644 internal/app/xhttp/pkg/resource/doc.go create mode 100644 internal/app/xhttp/pkg/resource/file.go create mode 100644 internal/app/xhttp/pkg/resource/resource.go create mode 100644 internal/app/xhttp/xhttp.go create mode 100644 internal/pkg/conf/conf.go create mode 100644 internal/pkg/conf/conf_test.go create mode 100644 internal/pkg/conf/doc.go delete mode 100644 internal/pkg/config/config.go delete mode 100644 internal/pkg/config/config_test.go delete mode 100644 internal/pkg/config/doc.go delete mode 100644 internal/pkg/logger/doc.go delete mode 100644 internal/pkg/logger/logger.go delete mode 100644 internal/pkg/pm2/chrome_test.go delete mode 100644 internal/pkg/pm2/unoconv_test.go delete mode 100644 internal/pkg/random/doc.go delete mode 100644 internal/pkg/standarderror/doc.go delete mode 100644 internal/pkg/standarderror/standarderror.go delete mode 100644 internal/pkg/standarderror/standarderror_test.go delete mode 100644 internal/pkg/timeout/doc.go delete mode 100644 internal/pkg/timeout/timeout.go delete mode 100644 internal/pkg/timeout/timeout_test.go create mode 100644 internal/pkg/xassert/doc.go create mode 100644 internal/pkg/xassert/float64.go create mode 100644 internal/pkg/xassert/float64_test.go create mode 100644 internal/pkg/xassert/int64.go create mode 100644 internal/pkg/xassert/int64_test.go create mode 100644 internal/pkg/xassert/string.go create mode 100644 internal/pkg/xassert/string_test.go create mode 100644 internal/pkg/xassert/xassert.go create mode 100644 internal/pkg/xassert/xassert_test.go create mode 100644 internal/pkg/xcontext/doc.go create mode 100644 internal/pkg/xcontext/xcontext.go create mode 100644 internal/pkg/xcontext/xcontext_test.go create mode 100644 internal/pkg/xerror/doc.go create mode 100644 internal/pkg/xerror/xerror.go create mode 100644 internal/pkg/xerror/xerror_test.go create mode 100644 internal/pkg/xexec/doc.go create mode 100644 internal/pkg/xexec/xexec.go create mode 100644 internal/pkg/xexec/xexec_test.go create mode 100644 internal/pkg/xlog/doc.go create mode 100644 internal/pkg/xlog/xlog.go create mode 100644 internal/pkg/xrand/doc.go rename internal/pkg/{random/random.go => xrand/xrand.go} (89%) rename internal/pkg/{random/random_test.go => xrand/xrand_test.go} (97%) create mode 100644 internal/pkg/xtime/doc.go create mode 100644 internal/pkg/xtime/xtime.go create mode 100644 internal/pkg/xtime/xtime_test.go create mode 100644 test/cmd/pm2/pm2.go create mode 100644 test/doc.go create mode 100644 test/internalpkg/xerrortest/doc.go create mode 100644 test/internalpkg/xerrortest/xerrortest.go create mode 100644 test/internalpkg/xlogtest/doc.go create mode 100644 test/internalpkg/xlogtest/xlogtest.go diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index a3a0fce8..00000000 --- a/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -scripts -test \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 8003da9f..c832bdc7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,9 +17,7 @@ stages: jobs: include: - stage: tests - script: make lint - - stage: tests - script: make tests + script: make lint tests - stage: publish if: tag IS present script: make publish VERSION=$TRAVIS_TAG DOCKER_USER=$DOCKER_USER DOCKER_PASSWORD=$DOCKER_PASS \ No newline at end of file diff --git a/Makefile b/Makefile index 0651d971..3a72b36e 100644 --- a/Makefile +++ b/Makefile @@ -1,18 +1,27 @@ -GOLANG_VERSION=1.12 +GOLANG_VERSION=1.12.7 VERSION=snapshot DOCKER_USER= DOCKER_PASSWORD= DOCKER_REPOSITORY=thecodingmachine -DEFAULT_WAIT_TIMEOUT=10 +GOLANGCI_LINT_VERSION=1.17.1 +MAXIMUM_WAIT_TIMEOUT=30.0 +MAXIMUM_WAIT_DELAY=10.0 +MAXIMUM_WEBHOOK_URL_TIMEOUT=30.0 +DEFAULT_WAIT_TIMEOUT=10.0 +DEFAULT_WEBHOOK_URL_TIMEOUT=10.0 DEFAULT_LISTEN_PORT=3000 DISABLE_GOOGLE_CHROME=0 DISABLE_UNOCONV=0 LOG_LEVEL=INFO -# generate documentation. -doc: - docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:docs -f build/docs/Dockerfile . - docker run --rm -it -v "$(PWD):/docs" $(DOCKER_REPOSITORY)/gotenberg:docs +# build the base Docker image. +base: + docker build -t $(DOCKER_REPOSITORY)/gotenberg:base -f build/base/Dockerfile . + +# build the workspace Docker image. +workspace: + make base + docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:workspace -f build/workspace/Dockerfile . # gofmt and goimports all go files. fmt: @@ -21,24 +30,32 @@ fmt: # run all linters. lint: - docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:lint -f build/lint/Dockerfile . - docker run --rm -it -v "$(PWD):/lint" $(DOCKER_REPOSITORY)/gotenberg:lint + make workspace + docker build --build-arg GOLANGCI_LINT_VERSION=$(GOLANGCI_LINT_VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:lint -f build/lint/Dockerfile . + docker run --rm -it $(DOCKER_REPOSITORY)/gotenberg:lint # run all tests. tests: - docker build -t $(DOCKER_REPOSITORY)/gotenberg:base -f build/base/Dockerfile . - docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:tests -f build/tests/Dockerfile . - docker run --rm -it -v "$(PWD):/tests" $(DOCKER_REPOSITORY)/gotenberg:tests + make workspace + docker build -t $(DOCKER_REPOSITORY)/gotenberg:tests -f build/tests/Dockerfile . + docker run --rm -it $(DOCKER_REPOSITORY)/gotenberg:tests -# build Docker image. +# generate documentation. +doc: + make workspace + docker build -t $(DOCKER_REPOSITORY)/gotenberg:docs -f build/docs/Dockerfile . + docker run --rm -it -v "$(PWD):/gotenberg/docs" $(DOCKER_REPOSITORY)/gotenberg:docs + +# build Gotenberg Docker image. image: - docker build -t $(DOCKER_REPOSITORY)/gotenberg:base -f build/base/Dockerfile . - docker build --build-arg GOLANG_VERSION=$(GOLANG_VERSION) --build-arg VERSION=$(VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) -f build/package/Dockerfile . + make workspace + docker build --build-arg VERSION=$(VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) -f build/package/Dockerfile . # start the API using previously built Docker image. gotenberg: - docker run -it --rm -e DEFAULT_WAIT_TIMEOUT=$(DEFAULT_WAIT_TIMEOUT) -e DEFAULT_LISTEN_PORT=$(DEFAULT_LISTEN_PORT) -e DISABLE_GOOGLE_CHROME=$(DISABLE_GOOGLE_CHROME) -e DISABLE_UNOCONV=$(DISABLE_UNOCONV) -e LOG_LEVEL=$(LOG_LEVEL) -p "3000:$(DEFAULT_LISTEN_PORT)" $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) + docker run -it --rm -e MAXIMUM_WAIT_TIMEOUT=$(MAXIMUM_WAIT_TIMEOUT) -e MAXIMUM_WAIT_DELAY=$(MAXIMUM_WAIT_DELAY) -e MAXIMUM_WEBHOOK_URL_TIMEOUT=$(MAXIMUM_WEBHOOK_URL_TIMEOUT) -e DEFAULT_WEBHOOK_URL_TIMEOUT=$(DEFAULT_WEBHOOK_URL_TIMEOUT) -e MAXIMUM_WEBHOOK_URL_TIMEOUT=$(MAXIMUM_WEBHOOK_URL_TIMEOUT) -e DEFAULT_LISTEN_PORT=$(DEFAULT_LISTEN_PORT) -e DISABLE_GOOGLE_CHROME=$(DISABLE_GOOGLE_CHROME) -e DISABLE_UNOCONV=$(DISABLE_UNOCONV) -e LOG_LEVEL=$(LOG_LEVEL) -p "3000:$(DEFAULT_LISTEN_PORT)" $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) # publish Gotenberg images according to version. publish: - ./scripts/publish.sh $(GOLANG_VERSION) $(VERSION) $(DOCKER_USER) $(DOCKER_PASSWORD) \ No newline at end of file + make workspace + ./scripts/publish.sh $(VERSION) $(DOCKER_USER) $(DOCKER_PASSWORD) \ No newline at end of file diff --git a/build/base/Dockerfile b/build/base/Dockerfile index d6cbbb64..078ac731 100644 --- a/build/base/Dockerfile +++ b/build/base/Dockerfile @@ -16,7 +16,7 @@ RUN echo "deb http://httpredir.debian.org/debian/ stretch main contrib non-free" # |-------------------------------------------------------------------------- # | # | Installs PM2 for launching programs in background and with failure -# | recovering. In our case: Chrome (headless) and Office (headless). +# | recovering. In our case: Google Chrome (headless) and unoconv. # | RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - &&\ @@ -101,6 +101,8 @@ COPY build/base/fonts.conf /etc/fonts/conf.d/100-gotenberg.conf # | RUN groupadd --gid 1001 gotenberg \ - && useradd --uid 1001 --gid gotenberg --shell /bin/bash --no-create-home gotenberg \ + && useradd --uid 1001 --gid gotenberg --shell /bin/bash --home /gotenberg --no-create-home gotenberg \ && mkdir /gotenberg \ && chown gotenberg: /gotenberg + +ENV PM2_HOME=/gotenberg/.pm2 \ No newline at end of file diff --git a/build/docs/Dockerfile b/build/docs/Dockerfile index 27ca474e..6c6a2df8 100644 --- a/build/docs/Dockerfile +++ b/build/docs/Dockerfile @@ -1,6 +1,4 @@ -ARG GOLANG_VERSION - -FROM golang:${GOLANG_VERSION}-stretch +FROM thecodingmachine/gotenberg:workspace # |-------------------------------------------------------------------------- # | static @@ -19,6 +17,6 @@ RUN go get github.com/apex/static/cmd/static-docs # | Last instructions of this build. # | -WORKDIR /docs +WORKDIR /gotenberg/docs CMD [ "static-docs", "--in", "build/docs/content", "--out", "docs", "--theme", "gotenberg", "--title", "Gotenberg", "--subtitle", "A Docker-powered stateless API for converting HTML, Markdown and Office documents to PDF." ] \ No newline at end of file diff --git a/build/lint/Dockerfile b/build/lint/Dockerfile index 87fc8096..82b67453 100644 --- a/build/lint/Dockerfile +++ b/build/lint/Dockerfile @@ -1,6 +1,4 @@ -ARG GOLANG_VERSION - -FROM golang:${GOLANG_VERSION}-stretch +FROM thecodingmachine/gotenberg:workspace # |-------------------------------------------------------------------------- # | GolangCI-Lint @@ -10,7 +8,7 @@ FROM golang:${GOLANG_VERSION}-stretch # | than gometalinter. # | -ENV GOLANGCI_LINT_VERSION 1.16.0 +ARG GOLANGCI_LINT_VERSION RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b /usr/local/bin v${GOLANGCI_LINT_VERSION} &&\ golangci-lint --version @@ -23,13 +21,14 @@ RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.s # | # Define our working directory outside of $GOPATH (we're using go modules). -WORKDIR /lint +USER gotenberg +WORKDIR /gotenberg/lint -# Copy our module dependencies definitions. -COPY go.mod . -COPY go.sum . +# Copy our code source. +COPY --chown=gotenberg:gotenberg . . # Install module dependencies. -RUN go mod download +RUN go mod download &&\ + go mod verify CMD ["golangci-lint", "run" ,"--tests=false", "--enable-all", "--disable=dupl" ] \ No newline at end of file diff --git a/build/package/Dockerfile b/build/package/Dockerfile index 532a55a2..164eca29 100644 --- a/build/package/Dockerfile +++ b/build/package/Dockerfile @@ -1,5 +1,3 @@ -ARG GOLANG_VERSION - # |-------------------------------------------------------------------------- # | Binary # |-------------------------------------------------------------------------- @@ -7,7 +5,7 @@ ARG GOLANG_VERSION # | Buils Gotenberg binary. # | -FROM golang:${GOLANG_VERSION}-stretch AS golang +FROM thecodingmachine/gotenberg:workspace AS workspace ARG VERSION @@ -16,7 +14,7 @@ ENV GOOS=linux \ CGO_ENABLED=0 # Define our workding outside of $GOPATH (we're using go modules). -WORKDIR /gotenberg +WORKDIR /gotenberg/package # Copy our source code. COPY internal ./internal @@ -25,7 +23,7 @@ COPY go.sum go.sum COPY go.mod go.mod # Build our binary. -RUN go build -o /gotenberg/gotenberg -ldflags "-X main.version=${VERSION}" cmd/gotenberg/main.go +RUN go build -o gotenberg -ldflags "-X main.version=${VERSION}" cmd/gotenberg/main.go # |-------------------------------------------------------------------------- # | Final touch @@ -38,9 +36,8 @@ FROM thecodingmachine/gotenberg:base LABEL authors="Julien Neuhart " -COPY --from=golang /gotenberg/gotenberg /usr/local/bin/ +COPY --from=workspace /gotenberg/package/gotenberg /usr/local/bin/ -ENV PM2_HOME=/gotenberg/.pm2 USER gotenberg WORKDIR /gotenberg diff --git a/build/tests/Dockerfile b/build/tests/Dockerfile index 7aaa9586..55599671 100644 --- a/build/tests/Dockerfile +++ b/build/tests/Dockerfile @@ -1,48 +1,14 @@ -ARG GOLANG_VERSION +FROM thecodingmachine/gotenberg:workspace -FROM golang:${GOLANG_VERSION}-stretch AS golang +# Define our workding outside of $GOPATH (we're using go modules). +USER gotenberg +WORKDIR /gotenberg/tests -FROM thecodingmachine/gotenberg:base - -# |-------------------------------------------------------------------------- -# | Common libraries -# |-------------------------------------------------------------------------- -# | -# | Libraries used in the build process of this image. -# | - -RUN apt-get install -y git gcc - -# |-------------------------------------------------------------------------- -# | Golang -# |-------------------------------------------------------------------------- -# | -# | Installs Golang. -# | - -COPY --from=golang /usr/local/go /usr/local/go - -RUN export PATH="/usr/local/go/bin:$PATH" &&\ - go version - -ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH - -# |-------------------------------------------------------------------------- -# | Final touch -# |-------------------------------------------------------------------------- -# | -# | Last instructions of this build. -# | - -# Define our working directory outside of $GOPATH (we're using go modules). -WORKDIR /tests - -# Copy our module dependencies definitions. -COPY go.mod . -COPY go.sum . +# Copy our code source. +COPY --chown=gotenberg:gotenberg . . # Install module dependencies. -RUN go mod download +RUN go mod download &&\ + go mod verify ENTRYPOINT [ "build/tests/docker-entrypoint.sh" ] \ No newline at end of file diff --git a/build/tests/docker-entrypoint.sh b/build/tests/docker-entrypoint.sh index 21a86c41..de0361d9 100755 --- a/build/tests/docker-entrypoint.sh +++ b/build/tests/docker-entrypoint.sh @@ -2,19 +2,33 @@ set -xe +# Make sure the user running the +# tests is the Gotenberg user. +CURRENT_USER=$(whoami) +if [ "$CURRENT_USER" != "gotenberg" ]; then + exit 1 +fi + +# Start the PM2 processes +# (Google Chrome headless & unoconv listener). +go run github.com/thecodingmachine/gotenberg/test/cmd/pm2 + +# Run our tests. +go test -race -cover ./... + # Testing PM2 processes launch separatly for avoiding # spending to much time on each tests depending on # them. -go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestChromeStart -go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestUnoconvStart +#go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestChromeStart +#go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestUnoconvStart # Running others tests. -go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/config -go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/random -go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/standarderror -go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/timeout -go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/app/api +#go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/config +#go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/random +#go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/standarderror +#go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/pkg/timeout +#go test -race -cover -covermode=atomic github.com/thecodingmachine/gotenberg/internal/app/api # Finally testing processes shutdown. -go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestChromeShutdown -go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestUnoconvShutdown \ No newline at end of file +#go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestChromeShutdown +#go test github.com/thecodingmachine/gotenberg/internal/pkg/pm2 -run TestUnoconvShutdown \ No newline at end of file diff --git a/build/workspace/Dockerfile b/build/workspace/Dockerfile new file mode 100644 index 00000000..2ae20d7e --- /dev/null +++ b/build/workspace/Dockerfile @@ -0,0 +1,52 @@ +FROM thecodingmachine/gotenberg:base + +ARG GOLANG_VERSION + +# |-------------------------------------------------------------------------- +# | Common libraries +# |-------------------------------------------------------------------------- +# | +# | Libraries used in the build process of this image. +# | + +RUN apt-get update && apt-get install -y --no-install-recommends \ + git \ + g++ \ + gcc \ + libc6-dev \ + make \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +# |-------------------------------------------------------------------------- +# | Golang +# |-------------------------------------------------------------------------- +# | +# | Installs Golang. +# | + +RUN wget https://dl.google.com/go/go${GOLANG_VERSION}.linux-amd64.tar.gz &&\ + tar -xvf go${GOLANG_VERSION}.linux-amd64.tar.gz &&\ + mv go /usr/local + +ENV GOPATH /gotenberg/go +ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH + +RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" &&\ + chmod -R 777 "$GOPATH" + +# |-------------------------------------------------------------------------- +# | Final touch +# |-------------------------------------------------------------------------- +# | +# | Last instructions of this build. +# | + +# Make sure the Gotenber user is able to +# call the Go binary. +USER gotenberg + +RUN go version &&\ + go env + +USER root \ No newline at end of file diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 92131b52..328ad8a9 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -1,17 +1,16 @@ package main import ( - "context" "fmt" "net/http" "os" "os/signal" - "time" - "github.com/thecodingmachine/gotenberg/internal/app/api" - "github.com/thecodingmachine/gotenberg/internal/pkg/config" - "github.com/thecodingmachine/gotenberg/internal/pkg/logger" + "github.com/thecodingmachine/gotenberg/internal/app/xhttp" + "github.com/thecodingmachine/gotenberg/internal/pkg/conf" "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" + "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) // version will be set on build time. @@ -20,8 +19,8 @@ var version = "snapshot" func main() { const op = "main" - config, err := config.FromEnv() - systemLogger := logger.New(config.LogLevel(), "system") + config, err := conf.FromEnv() + systemLogger := xlog.New(config.LogLevel(), "system") if err != nil { systemLogger.FatalOp(op, err) } @@ -29,24 +28,24 @@ func main() { systemLogger.DebugfOp(op, "configuration: %+v", config) // start PM2 processes. var processes []pm2.Process - if config.EnableChromeEndpoints() { - processes = append(processes, pm2.NewChrome(systemLogger)) + if !config.DisableGoogleChrome() { + processes = append(processes, pm2.NewChromeProcess(systemLogger)) } - if config.EnableUnoconvEndpoints() { - processes = append(processes, pm2.NewUnoconv(systemLogger)) + if !config.DisableUnoconv() { + processes = append(processes, pm2.NewUnoconvProcess(systemLogger)) } for _, p := range processes { - systemLogger.InfofOp(op, "starting %s with PM2...", p.Fullname()) + systemLogger.InfofOp(op, "starting '%s' with PM2...", p.Fullname()) if err := p.Start(); err != nil { systemLogger.FatalOp(op, err) } } - // run our API in a goroutine so that it doesn't block. // create our API. - srv := api.New(config) + srv := xhttp.New(config, processes...) + // run our API in a goroutine so that it doesn't block. go func() { - systemLogger.InfofOp(op, "http server started on port %s", config.DefaultListenPort()) - if err := srv.Start(fmt.Sprintf(":%s", config.DefaultListenPort())); err != nil { + systemLogger.InfofOp(op, "http server started on port '%d'", config.DefaultListenPort()) + if err := srv.Start(fmt.Sprintf(":%d", config.DefaultListenPort())); err != nil { if err != http.ErrServerClosed { systemLogger.FatalOp(op, err) } @@ -59,21 +58,21 @@ func main() { // block until we receive our signal. <-quit // create a deadline to wait for. - ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + ctx, cancel := xcontext.WithTimeout(systemLogger, 120) defer cancel() // doesn't block if no connections, but will otherwise wait // until the timeout deadline. - systemLogger.InfofOp(op, "shutting down http server...") + systemLogger.InfoOp(op, "shutting down http server...") if err := srv.Shutdown(ctx); err != nil { systemLogger.FatalOp(op, err) } // shutdown PM2 processes. for _, p := range processes { - systemLogger.InfofOp(op, "shutting down %s with PM2...", p.Fullname()) - if err := p.Shutdown(); err != nil { + systemLogger.InfofOp(op, "shutting down '%s' with PM2...", p.Fullname()) + if err := p.Stop(); err != nil { systemLogger.FatalOp(op, err) } } - systemLogger.InfofOp(op, "bye!") + systemLogger.InfoOp(op, "bye!") os.Exit(0) } diff --git a/internal/app/api/api.go b/internal/app/api/api.go deleted file mode 100644 index 3a711782..00000000 --- a/internal/app/api/api.go +++ /dev/null @@ -1,34 +0,0 @@ -package api - -import ( - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/handler" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/middleware" - "github.com/thecodingmachine/gotenberg/internal/pkg/config" -) - -// New returns an API. -func New(config *config.Config) *echo.Echo { - api := echo.New() - api.HideBanner = true - api.HidePort = true - api.Use(middleware.Context(config)) - api.Use(middleware.Logger()) - api.Use(middleware.Cleanup()) - api.Use(middleware.Error()) - api.GET(handler.PingEndpoint, handler.Ping) - api.POST(handler.MergeEndpoint, handler.Merge) - if !config.EnableChromeEndpoints() && !config.EnableUnoconvEndpoints() { - return api - } - g := api.Group(handler.ConvertGroupEndpoint) - if config.EnableChromeEndpoints() { - g.POST(handler.HTMLEndpoint, handler.HTML) - g.POST(handler.URLEndpoint, handler.URL) - g.POST(handler.MarkdownEndpoint, handler.Markdown) - } - if config.EnableUnoconvEndpoints() { - g.POST(handler.OfficeEndpoint, handler.Office) - } - return api -} diff --git a/internal/app/api/api_test.go b/internal/app/api/api_test.go deleted file mode 100644 index 7a4f5dce..00000000 --- a/internal/app/api/api_test.go +++ /dev/null @@ -1,388 +0,0 @@ -package api - -import ( - "errors" - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "testing" - - "github.com/labstack/echo/v4" - "github.com/stretchr/testify/assert" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/handler" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/middleware" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" - "github.com/thecodingmachine/gotenberg/internal/pkg/config" - "github.com/thecodingmachine/gotenberg/test" -) - -func TestPing(t *testing.T) { - endpoint := handler.PingEndpoint - config, err := config.FromEnv() - assert.Nil(t, err) - srv := New(config) - // should be OK. - req := httptest.NewRequest(http.MethodGet, endpoint, nil) - test.AssertStatusCode(t, http.StatusOK, srv, req) -} - -func TestMerge(t *testing.T) { - os.Setenv(middleware.TestingTraceEnvVar, "1") - endpoint := handler.MergeEndpoint - config, err := config.FromEnv() - assert.Nil(t, err) - srv := New(config) - // should be OK. - body, contentType := test.PDFTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // bad request. - body, contentType = test.PDFTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - // timeout. - body, contentType = test.PDFTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "0"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) - // should have no more resources. - test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) - err = os.RemoveAll(middleware.TestsTracePrefix) - assert.Nil(t, err) - os.Unsetenv(middleware.TestingTraceEnvVar) -} - -func TestHTML(t *testing.T) { - os.Setenv(middleware.TestingTraceEnvVar, "1") - endpoint := fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.HTMLEndpoint) - config, err := config.FromEnv() - assert.Nil(t, err) - srv := New(config) - // should be OK. - body, contentType := test.HTMLTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // bad request. - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.WaitDelayFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.PaperWidthFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.PaperHeightFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.MarginTopFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.MarginBottomFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.MarginLeftFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.MarginRightFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.LandscapeFormField: "not a bool"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - // timeout. - body, contentType = test.HTMLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "0"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) - // should have no more resources. - test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) - err = os.RemoveAll(middleware.TestsTracePrefix) - assert.Nil(t, err) - os.Unsetenv(middleware.TestingTraceEnvVar) -} - -func TestMarkdown(t *testing.T) { - os.Setenv(middleware.TestingTraceEnvVar, "1") - endpoint := fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.MarkdownEndpoint) - config, err := config.FromEnv() - assert.Nil(t, err) - srv := New(config) - // should be OK. - body, contentType := test.MarkdownTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // bad request. - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.WaitDelayFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.PaperWidthFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.PaperHeightFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.MarginTopFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.MarginBottomFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.MarginLeftFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.MarginRightFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.LandscapeFormField: "not a bool"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - // timeout. - body, contentType = test.MarkdownTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "0"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) - // should have no more resources. - test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) - err = os.RemoveAll(middleware.TestsTracePrefix) - assert.Nil(t, err) - os.Unsetenv(middleware.TestingTraceEnvVar) -} - -func TestURL(t *testing.T) { - os.Setenv(middleware.TestingTraceEnvVar, "1") - endpoint := fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.URLEndpoint) - config, err := config.FromEnv() - assert.Nil(t, err) - srv := New(config) - // should be OK. - body, contentType := test.URLTestMultipartForm(t, nil) - req := httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - // bad request. - body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.WaitDelayFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.PaperWidthFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.PaperHeightFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.MarginTopFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.MarginBottomFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.MarginLeftFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.MarginRightFormField: "not a float"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.LandscapeFormField: "not a bool"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusBadRequest, srv, req) - // timeout. - body, contentType = test.URLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "0"}) - req = httptest.NewRequest(http.MethodPost, endpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusRequestTimeout, srv, req) - // should have no more resources. - test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) - err = os.RemoveAll(middleware.TestsTracePrefix) - assert.Nil(t, err) - os.Unsetenv(middleware.TestingTraceEnvVar) -} - -func TestConcurrent(t *testing.T) { - const concurrentRequests int = 4 - os.Setenv(middleware.TestingTraceEnvVar, "1") - config, err := config.FromEnv() - assert.Nil(t, err) - srv := New(config) - // Merge. - test.AssertConcurrent( - t, - func() error { - body, contentType := test.PDFTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "120"}) - req := httptest.NewRequest(http.MethodPost, handler.MergeEndpoint, body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - return fmt.Errorf("wrong status code: want '%d' got '%d'", http.StatusOK, rec.Code) - } - return nil - }, - concurrentRequests, - ) - // HTML. - test.AssertConcurrent( - t, - func() error { - body, contentType := test.HTMLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "120"}) - req := httptest.NewRequest(http.MethodPost, fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.HTMLEndpoint), body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - return fmt.Errorf("wrong status code: want '%d' got '%d'", http.StatusOK, rec.Code) - } - return nil - }, - concurrentRequests, - ) - // Markdown. - test.AssertConcurrent( - t, - func() error { - body, contentType := test.MarkdownTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "120"}) - req := httptest.NewRequest(http.MethodPost, fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.MarkdownEndpoint), body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - return fmt.Errorf("wrong status code: want '%d' got '%d'", http.StatusOK, rec.Code) - } - return nil - }, - concurrentRequests, - ) - // URL. - test.AssertConcurrent( - t, - func() error { - body, contentType := test.URLTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "120"}) - req := httptest.NewRequest(http.MethodPost, fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.URLEndpoint), body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - return fmt.Errorf("wrong status code: want '%d' got '%d'", http.StatusOK, rec.Code) - } - return nil - }, - concurrentRequests, - ) - // Office. - test.AssertConcurrent( - t, - func() error { - body, contentType := test.OfficeTestMultipartForm(t, map[string]string{resource.WaitTimeoutFormField: "120"}) - req := httptest.NewRequest(http.MethodPost, fmt.Sprintf("%s%s", handler.ConvertGroupEndpoint, handler.OfficeEndpoint), body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - if rec.Code != http.StatusOK { - return fmt.Errorf("wrong status code: want '%d' got '%d'", http.StatusOK, rec.Code) - } - return nil - }, - concurrentRequests, - ) - // should have no more resources. - test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) - err = os.RemoveAll(middleware.TestsTracePrefix) - assert.Nil(t, err) - os.Unsetenv(middleware.TestingTraceEnvVar) -} - -func TestWebhook(t *testing.T) { - status := make(chan error, 2) - rcv := echo.New() - rcv.POST("/foo", func(c echo.Context) error { - if c.Request().Header.Get("Content-type") != "application/pdf" { - status <- fmt.Errorf("wrong Content-type: got '%s' want '%s'", c.Request().Header.Get("Content-type"), "application/pdf") - return nil - } - body, err := ioutil.ReadAll(c.Request().Body) - if err != nil { - status <- err - return nil - } - if body == nil || len(body) == 0 { - status <- errors.New("empty body") - return nil - } - status <- nil - return nil - }) - go func() { - rcv.Start(":3001") - }() - os.Setenv(middleware.TestingTraceEnvVar, "1") - config, err := config.FromEnv() - assert.Nil(t, err) - srv := New(config) - body, contentType := test.PDFTestMultipartForm(t, map[string]string{resource.WebhookURLFormField: "http://localhost:3001/foo"}) - req := httptest.NewRequest(http.MethodPost, "/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - test.AssertStatusCode(t, http.StatusOK, srv, req) - err = <-status - assert.NoError(t, err) - // should have no more resources. - test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) - err = os.RemoveAll(middleware.TestsTracePrefix) - assert.Nil(t, err) - os.Unsetenv(middleware.TestingTraceEnvVar) -} - -func TestResultFilename(t *testing.T) { - os.Setenv(middleware.TestingTraceEnvVar, "1") - config, err := config.FromEnv() - assert.Nil(t, err) - srv := New(config) - body, contentType := test.PDFTestMultipartForm(t, map[string]string{resource.ResultFilenameFormField: "foo.pdf"}) - req := httptest.NewRequest(http.MethodPost, "/merge", body) - req.Header.Set(echo.HeaderContentType, contentType) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - assert.Equal(t, "attachment; filename=\"foo.pdf\"", rec.Header().Get("Content-Disposition")) - // should have no more resources. - test.AssertDirectoryEmpty(t, middleware.TestsTracePrefix) - err = os.RemoveAll(middleware.TestsTracePrefix) - assert.Nil(t, err) - os.Unsetenv(middleware.TestingTraceEnvVar) -} diff --git a/internal/app/api/doc.go b/internal/app/api/doc.go deleted file mode 100644 index 7c19cefb..00000000 --- a/internal/app/api/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package api helps managing the HTTP server behind Gotenberg. -package api diff --git a/internal/app/api/pkg/context/context.go b/internal/app/api/pkg/context/context.go deleted file mode 100644 index f8437f95..00000000 --- a/internal/app/api/pkg/context/context.go +++ /dev/null @@ -1,134 +0,0 @@ -package context - -import ( - "fmt" - "net/http" - "strconv" - "time" - - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" - "github.com/thecodingmachine/gotenberg/internal/pkg/config" - "github.com/thecodingmachine/gotenberg/internal/pkg/logger" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -// Context extends the default echo.Context. -type Context struct { - echo.Context - logger *logger.Logger - config *config.Config - resource *resource.Resource - startTime time.Time -} - -// New creates a new context. -func New(c echo.Context, logger *logger.Logger, config *config.Config) *Context { - return &Context{ - c, - logger, - config, - nil, - time.Now(), - } -} - -// MustCastFromEchoContext cast an echo.Context to our custom -// context. If something goes wrong, panic. -func MustCastFromEchoContext(c echo.Context) *Context { - const op string = "context.MustCastFromEchoContext" - ctx, ok := c.(*Context) - if !ok { - panic(fmt.Sprintf("%s: unable to cast an echo.Context to a custom context", op)) - } - return ctx -} - -// StandardLogger returns the custom logger. -// This method should be used instead of the -// default Logger() method coming from -// the echo.Context! -func (ctx *Context) StandardLogger() *logger.Logger { - return ctx.logger -} - -// Resource returns the associated resource -// to the context. -func (ctx *Context) Resource() *resource.Resource { - return ctx.resource -} - -// WithResource adds a resource to the context. -func (ctx *Context) WithResource(resourceDirPath string) error { - const op string = "context.WithResource" - r, err := resource.New(ctx, ctx.logger, ctx.config, resourceDirPath) - ctx.resource = r - if err != nil { - return &standarderror.Error{ - Op: op, - Err: err, - } - } - return nil -} - -// LogRequestResult logs the result of a request. -// This method should only be used by a middleware! -func (ctx *Context) LogRequestResult(err error, isDebug bool) error { - const op string = "context.LogRequestResult" - req := ctx.Request() - resp := ctx.Response() - stopTime := time.Now() - fields := map[string]interface{}{ - "remote_ip": ctx.RealIP(), - "host": req.Host, - "uri": req.RequestURI, - "method": req.Method, - "path": path(req), - "referer": req.Referer(), - "user_agent": req.UserAgent(), - "status": resp.Status, - "latency": lantency(ctx.startTime, stopTime), - "latency_human": latencyHuman(ctx.startTime, stopTime), - "bytes_in": bytesIn(req), - "bytes_out": bytesOut(resp), - } - if err != nil { - ctx.logger.WithFields(fields).ErrorfOp(op, "request failed") - return err - } - if isDebug { - ctx.logger.WithFields(fields).DebugfOp(op, "request handled") - return nil - } - ctx.logger.WithFields(fields).InfofOp(op, "request handled") - return nil -} - -func path(r *http.Request) string { - path := r.URL.Path - if path == "" { - path = "/" - } - return path -} - -func lantency(startTime time.Time, stopTime time.Time) string { - return strconv.FormatInt(int64(stopTime.Sub(startTime)), 10) -} - -func latencyHuman(startTime time.Time, stopTime time.Time) string { - return stopTime.Sub(startTime).String() -} - -func bytesIn(r *http.Request) string { - bytesIn := r.Header.Get(echo.HeaderContentLength) - if bytesIn == "" { - bytesIn = "0" - } - return bytesIn -} - -func bytesOut(r *echo.Response) string { - return strconv.FormatInt(r.Size, 10) -} diff --git a/internal/app/api/pkg/context/doc.go b/internal/app/api/pkg/context/doc.go deleted file mode 100644 index 4c8b2439..00000000 --- a/internal/app/api/pkg/context/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package context helps extending -// the default echo.Context. -package context diff --git a/internal/app/api/pkg/handler/doc.go b/internal/app/api/pkg/handler/doc.go deleted file mode 100644 index c7fdafe7..00000000 --- a/internal/app/api/pkg/handler/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package handler contains all -// the endpoint methods of the API. -package handler diff --git a/internal/app/api/pkg/handler/handler.go b/internal/app/api/pkg/handler/handler.go deleted file mode 100644 index 92d70f45..00000000 --- a/internal/app/api/pkg/handler/handler.go +++ /dev/null @@ -1,142 +0,0 @@ -package handler - -import ( - "fmt" - "net/http" - "os" - - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" - "github.com/thecodingmachine/gotenberg/internal/pkg/random" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -const ( - // PingEndpoint is the route for healthcheck. - PingEndpoint = "/ping" - // MergeEndpoint is the route for merging PDF files. - MergeEndpoint = "/merge" - // ConvertGroupEndpoint is the route of the group - // in charge of converting files to PDF. - ConvertGroupEndpoint = "/convert" - // HTMLEndpoint is the route for converting - // HTML to PDF. - HTMLEndpoint = "/html" - // URLEndpoint is the route for converting - // a URL to PDF. - URLEndpoint = "/url" - // MarkdownEndpoint is the route for converting - // Markdown to PDF. - MarkdownEndpoint = "/markdown" - // OfficeEndpoint is the route for converting - // Office files to PDF. - OfficeEndpoint = "/office" -) - -func convert(ctx *context.Context, p printer.Printer) error { - const op string = "handler.convert" - r := ctx.Resource() - logger := ctx.StandardLogger() - baseFilename := random.Get() - filename := fmt.Sprintf("%s.pdf", baseFilename) - fpath := fmt.Sprintf("%s/%s", r.DirPath(), filename) - // if no webhook URL given, run conversion - // and directly return the resulting PDF file - // or an error. - if !r.Has(resource.WebhookURLFormField) { - logger.DebugfOp(op, "no '%s' found, converting synchronously", resource.WebhookURLFormField) - if err := convertSync(filename, fpath, ctx, p); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - return nil - } - // as a webhook URL has been given, we - // run the following lines in a goroutine so that - // it doesn't block. - logger.DebugfOp(op, "'%s' found, converting asynchronously", resource.WebhookURLFormField) - return convertAsync(filename, fpath, ctx, p) -} - -func convertSync(filename, fpath string, ctx *context.Context, p printer.Printer) error { - const op = "handler.convertSync" - r := ctx.Resource() - logger := ctx.StandardLogger() - if err := p.Print(fpath); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - if !r.Has(resource.ResultFilenameFormField) { - logger.DebugfOp( - op, - "no '%s' found, using generated filename '%s'", - resource.ResultFilenameFormField, - filename, - ) - if err := ctx.Attachment(fpath, filename); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - return nil - } - logger.DebugfOp( - op, - "'%s' found, so not using generated filename", - resource.ResultFilenameFormField, - ) - filename, err := r.Get(resource.ResultFilenameFormField) - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - if err := ctx.Attachment(fpath, filename); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - return nil -} - -func convertAsync(filename, fpath string, ctx *context.Context, p printer.Printer) error { - const op = "handler.convertAsync" - r := ctx.Resource() - logger := ctx.StandardLogger() - go func() { - defer r.Close() // nolint: errcheck - if err := p.Print(fpath); err != nil { - logger.ErrorOp( - op, - &standarderror.Error{Op: op, Err: err}, - ) - return - } - f, err := os.Open(fpath) - if err != nil { - logger.ErrorOp( - op, - &standarderror.Error{Op: op, Err: err}, - ) - return - } - defer f.Close() // nolint: errcheck - webhookURL, err := r.Get(resource.WebhookURLFormField) - if err != nil { - logger.ErrorOp( - op, - &standarderror.Error{Op: op, Err: err}, - ) - return - } - logger.DebugfOp( - op, - "sending result file '%s' to '%s'", - filename, - webhookURL, - ) - resp, err := http.Post(webhookURL, "application/pdf", f) /* #nosec */ - if err != nil { - logger.ErrorOp( - op, - &standarderror.Error{Op: op, Err: err}, - ) - return - } - defer resp.Body.Close() // nolint: errcheck - }() - return nil -} diff --git a/internal/app/api/pkg/handler/html.go b/internal/app/api/pkg/handler/html.go deleted file mode 100644 index c64f70c7..00000000 --- a/internal/app/api/pkg/handler/html.go +++ /dev/null @@ -1,30 +0,0 @@ -package handler - -import ( - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -// HTML is the endpoint for converting -// HTML to PDF. -func HTML(c echo.Context) error { - const op string = "handler.HTML" - ctx := context.MustCastFromEchoContext(c) - ctx.StandardLogger().DebugfOp(op, "html request") - r := ctx.Resource() - opts, err := r.ChromePrinterOptions() - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - fpath, err := r.Fpath("index.html") - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - p := printer.NewHTML(fpath, opts) - if err := convert(ctx, p); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - return nil -} diff --git a/internal/app/api/pkg/handler/markdown.go b/internal/app/api/pkg/handler/markdown.go deleted file mode 100644 index 6283d4c3..00000000 --- a/internal/app/api/pkg/handler/markdown.go +++ /dev/null @@ -1,33 +0,0 @@ -package handler - -import ( - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -// Markdown is the endpoint for converting -// Markdown to PDF. -func Markdown(c echo.Context) error { - const op string = "handler.Markdown" - ctx := context.MustCastFromEchoContext(c) - ctx.StandardLogger().DebugfOp(op, "markdown request") - r := ctx.Resource() - opts, err := r.ChromePrinterOptions() - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - fpath, err := r.Fpath("index.html") - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - p, err := printer.NewMarkdown(fpath, opts) - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - if err := convert(ctx, p); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - return nil -} diff --git a/internal/app/api/pkg/handler/merge.go b/internal/app/api/pkg/handler/merge.go deleted file mode 100644 index e3422673..00000000 --- a/internal/app/api/pkg/handler/merge.go +++ /dev/null @@ -1,30 +0,0 @@ -package handler - -import ( - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -// Merge is the endpoint for -// merging PDF files. -func Merge(c echo.Context) error { - const op string = "handler.Merge" - ctx := context.MustCastFromEchoContext(c) - ctx.StandardLogger().DebugfOp(op, "merge request") - r := ctx.Resource() - opts, err := r.MergePrinterOptions() - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - fpaths, err := r.Fpaths(".pdf") - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - p := printer.NewMerge(fpaths, opts) - if err := convert(ctx, p); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - return nil -} diff --git a/internal/app/api/pkg/handler/office.go b/internal/app/api/pkg/handler/office.go deleted file mode 100644 index 2532e21e..00000000 --- a/internal/app/api/pkg/handler/office.go +++ /dev/null @@ -1,43 +0,0 @@ -package handler - -import ( - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -// Office is the endpoint for converting -// Office files to PDF. -func Office(c echo.Context) error { - const op string = "handler.Office" - ctx := context.MustCastFromEchoContext(c) - ctx.StandardLogger().DebugfOp(op, "office request") - r := ctx.Resource() - opts, err := r.OfficePrinterOptions() - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - fpaths, err := r.Fpaths( - ".txt", - ".rtf", - ".fodt", - ".doc", - ".docx", - ".odt", - ".xls", - ".xlsx", - ".ods", - ".ppt", - ".pptx", - ".odp", - ) - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - p := printer.NewOffice(fpaths, opts) - if err := convert(ctx, p); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - return nil -} diff --git a/internal/app/api/pkg/handler/ping.go b/internal/app/api/pkg/handler/ping.go deleted file mode 100644 index c2fa275d..00000000 --- a/internal/app/api/pkg/handler/ping.go +++ /dev/null @@ -1,10 +0,0 @@ -package handler - -import ( - "github.com/labstack/echo/v4" -) - -// Ping is the endpoint for healthcheck. -func Ping(c echo.Context) error { - return nil -} diff --git a/internal/app/api/pkg/handler/url.go b/internal/app/api/pkg/handler/url.go deleted file mode 100644 index f4264f00..00000000 --- a/internal/app/api/pkg/handler/url.go +++ /dev/null @@ -1,31 +0,0 @@ -package handler - -import ( - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -// URL is the endpoint for converting -// a URL to PDF. -func URL(c echo.Context) error { - const op string = "handler.URL" - ctx := context.MustCastFromEchoContext(c) - ctx.StandardLogger().DebugfOp(op, "url request") - r := ctx.Resource() - opts, err := r.ChromePrinterOptions() - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - remoteURL, err := r.Get(resource.RemoteURLFormField) - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - p := printer.NewURL(remoteURL, opts) - if err := convert(ctx, p); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - return nil -} diff --git a/internal/app/api/pkg/middleware/cleanup.go b/internal/app/api/pkg/middleware/cleanup.go deleted file mode 100644 index 6f6c57f7..00000000 --- a/internal/app/api/pkg/middleware/cleanup.go +++ /dev/null @@ -1,38 +0,0 @@ -package middleware - -import ( - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/resource" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -// Cleanup helps removing a resource at the end of a request. -func Cleanup() echo.MiddlewareFunc { - return func(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { - const op string = "middleware.Cleanup" - err := next(c) - ctx := context.MustCastFromEchoContext(c) - r := ctx.Resource() - if r == nil { - return err - } - // if a webhook URL has been given, - // do not remove the resource here because - // we don't know if the result file has been - // generated or sent. - if r.Has(resource.WebhookURLFormField) { - return err - } - // a resource is associated with our custom context. - if resourceErr := r.Close(); resourceErr != nil { - ctx.StandardLogger().ErrorOp(op, &standarderror.Error{ - Op: op, - Err: resourceErr, - }) - } - return err - } - } -} diff --git a/internal/app/api/pkg/middleware/context.go b/internal/app/api/pkg/middleware/context.go deleted file mode 100644 index d917ba7b..00000000 --- a/internal/app/api/pkg/middleware/context.go +++ /dev/null @@ -1,60 +0,0 @@ -package middleware - -import ( - "fmt" - "os" - - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/handler" - "github.com/thecodingmachine/gotenberg/internal/pkg/config" - "github.com/thecodingmachine/gotenberg/internal/pkg/logger" - "github.com/thecodingmachine/gotenberg/internal/pkg/random" -) - -const ( - // TestingTraceEnvVar is an environment - // variable used in some tests. - TestingTraceEnvVar string = "TESTING_TRACE" - // TestsTracePrefix helps - // creating all resources inside a prefix. - // Only used in some tests - // to check if the resources - // have been removed. - TestsTracePrefix string = "tmp" -) - -// Context helps extending the default echo.Context with -// our custom context. -func Context(config *config.Config) echo.MiddlewareFunc { - return func(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { - var trace string - if os.Getenv(TestingTraceEnvVar) == "1" { - trace = fmt.Sprintf("%s/%s", TestsTracePrefix, random.Get()) - } else { - // generate a unique identifier for the request. - trace = random.Get() - } - // create the logger for this request using - // the previous identifier as trace. - logger := logger.New(config.LogLevel(), trace) - // extend the current echo context with our custom - // context. - ctx := context.New(c, logger, config) - // if its an healthcheck request, there - // is no resource associated to it. - if ctx.Path() == handler.PingEndpoint { - return next(ctx) - } - // if the endpoint is not for healthcheck, associate a - // resource to our custom context. - if err := ctx.WithResource(trace); err != nil { - // required to have a correct status code. - ctx.Error(err) - return ctx.LogRequestResult(err, false) - } - return next(ctx) - } - } -} diff --git a/internal/app/api/pkg/middleware/doc.go b/internal/app/api/pkg/middleware/doc.go deleted file mode 100644 index 91719d08..00000000 --- a/internal/app/api/pkg/middleware/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package middleware contains the -// middleware of the API. -package middleware diff --git a/internal/app/api/pkg/middleware/error.go b/internal/app/api/pkg/middleware/error.go deleted file mode 100644 index f5254e02..00000000 --- a/internal/app/api/pkg/middleware/error.go +++ /dev/null @@ -1,48 +0,0 @@ -package middleware - -import ( - "net/http" - - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -// Error helps handling errors (if any). -func Error() echo.MiddlewareFunc { - return func(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { - ctx := context.MustCastFromEchoContext(c) - err := next(ctx) - if err == nil { - // so far so good! - return nil - } - // if it's an error from echo - // like 404 not found and so on. - if echoHTTPErr, ok := err.(*echo.HTTPError); ok { - return echoHTTPErr - } - // we log the initial error before returning - // the HTTP error. - errOp := standarderror.Op(err) - logger := ctx.StandardLogger() - logger.ErrorOp(errOp, err) - // handle our custom HTTP error. - var httpErr error - errCode := standarderror.Code(err) - errMessage := standarderror.Message(err) - switch errCode { - case standarderror.Invalid: - httpErr = echo.NewHTTPError(http.StatusBadRequest, errMessage) - case standarderror.Timeout: - httpErr = echo.NewHTTPError(http.StatusRequestTimeout, errMessage) - default: - httpErr = echo.NewHTTPError(http.StatusInternalServerError, errMessage) - } - // required to have a correct status code. - ctx.Error(httpErr) - return httpErr - } - } -} diff --git a/internal/app/api/pkg/middleware/logger.go b/internal/app/api/pkg/middleware/logger.go deleted file mode 100644 index 5fb2579e..00000000 --- a/internal/app/api/pkg/middleware/logger.go +++ /dev/null @@ -1,21 +0,0 @@ -package middleware - -import ( - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/context" - "github.com/thecodingmachine/gotenberg/internal/app/api/pkg/handler" -) - -// Logger helps logging the result of a request. -func Logger() echo.MiddlewareFunc { - return func(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { - ctx := context.MustCastFromEchoContext(c) - err := next(ctx) - // we do not want to log healthcheck requests if - // log level is not set to DEBUG. - isDebug := ctx.Path() == handler.PingEndpoint - return ctx.LogRequestResult(err, isDebug) - } - } -} diff --git a/internal/app/api/pkg/resource/doc.go b/internal/app/api/pkg/resource/doc.go deleted file mode 100644 index 56c149b0..00000000 --- a/internal/app/api/pkg/resource/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Package resource helps creating a folder -// containing all uploaded files and the resulting -// PDF file. It also helps centralizing all -// the form values. -package resource diff --git a/internal/app/api/pkg/resource/resource.go b/internal/app/api/pkg/resource/resource.go deleted file mode 100644 index c8eba0d9..00000000 --- a/internal/app/api/pkg/resource/resource.go +++ /dev/null @@ -1,421 +0,0 @@ -package resource - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strconv" - - "github.com/labstack/echo/v4" - "github.com/thecodingmachine/gotenberg/internal/pkg/config" - "github.com/thecodingmachine/gotenberg/internal/pkg/logger" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -const ( - // ResultFilenameFormField contains the name - // of a form field. - ResultFilenameFormField string = "resultFilename" - // WaitTimeoutFormField contains the name - // of a form field. - WaitTimeoutFormField string = "waitTimeout" - // WebhookURLFormField contains the name - // of a form field. - WebhookURLFormField string = "webhookURL" - // RemoteURLFormField contains the name - // of a form field. - RemoteURLFormField string = "remoteURL" - // WaitDelayFormField contains the name - // of a form field. - WaitDelayFormField string = "waitDelay" - // PaperWidthFormField contains the name - // of a form field. - PaperWidthFormField string = "paperWidth" - // PaperHeightFormField contains the name - // of a form field. - PaperHeightFormField string = "paperHeight" - // MarginTopFormField contains the name - // of a form field. - MarginTopFormField string = "marginTop" - // MarginBottomFormField contains the name - // of a form field. - MarginBottomFormField string = "marginBottom" - // MarginLeftFormField contains the name - // of a form field. - MarginLeftFormField string = "marginLeft" - // MarginRightFormField contains the name - // of a form field. - MarginRightFormField string = "marginRight" - // LandscapeFormField contains the name - // of a form field. - LandscapeFormField string = "landscape" -) - -// Resource helps retrieving form values -// and form files from a request. -type Resource struct { - logger *logger.Logger - config *config.Config - formValues map[string]string - formFilesDirPath string -} - -// New creates a new resource. -func New(c echo.Context, logger *logger.Logger, config *config.Config, dirPath string) (*Resource, error) { - const op string = "resource.New" - r := &Resource{ - logger: logger, - config: config, - formValues: formValues(c, logger), - formFilesDirPath: dirPath, - } - if err := os.MkdirAll(dirPath, 0755); err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - r.logger.DebugfOp(op, "directory '%s' created", dirPath) - if err := formFiles(c, logger, dirPath); err != nil { - return r, &standarderror.Error{Op: op, Err: err} - } - return r, nil -} - -func formValues(c echo.Context, logger *logger.Logger) map[string]string { - const op string = "resource.formValues" - v := make(map[string]string) - fetch := func(formField string) string { - value := c.FormValue(formField) - if value == "" { - logger.DebugfOp(op, "'%s' is empty", formField) - return value - } - logger.DebugfOp(op, "'%s' retrieved, got '%s'", formField, value) - return value - } - v[ResultFilenameFormField] = fetch(ResultFilenameFormField) - v[WaitTimeoutFormField] = fetch(WaitTimeoutFormField) - v[WebhookURLFormField] = fetch(WebhookURLFormField) - v[RemoteURLFormField] = fetch(RemoteURLFormField) - v[WaitDelayFormField] = fetch(WaitDelayFormField) - v[PaperWidthFormField] = fetch(PaperWidthFormField) - v[PaperHeightFormField] = fetch(PaperHeightFormField) - v[MarginTopFormField] = fetch(MarginTopFormField) - v[MarginBottomFormField] = fetch(MarginBottomFormField) - v[MarginLeftFormField] = fetch(MarginLeftFormField) - v[MarginRightFormField] = fetch(MarginRightFormField) - v[LandscapeFormField] = fetch(LandscapeFormField) - return v -} - -func formFiles(c echo.Context, logger *logger.Logger, dirPath string) error { - const op string = "resource.formFiles" - form, err := c.MultipartForm() - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - for _, files := range form.File { - for _, fh := range files { - in, err := fh.Open() - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - defer in.Close() // nolint: errcheck - fpath := fmt.Sprintf("%s/%s", dirPath, fh.Filename) - out, err := os.Create(fpath) - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - defer out.Close() // nolint: errcheck - if err := out.Chmod(0644); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - if _, err := io.Copy(out, in); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - if _, err := out.Seek(0, 0); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - logger.DebugfOp(op, "'%s' created", fh.Filename) - } - } - return nil -} - -// DirPath returns the directory -// path where are stored the form -// files and the resulting PDF file. -func (r *Resource) DirPath() string { - return r.formFilesDirPath -} - -// Close deletes the working directory of the -// resource if it exists. -func (r *Resource) Close() error { - const op string = "resource.Close" - if _, err := os.Stat(r.formFilesDirPath); os.IsNotExist(err) { - r.logger.DebugfOp(op, "directory '%s' does not exist, nothing to remove", r.formFilesDirPath) - return nil - } - if err := os.RemoveAll(r.formFilesDirPath); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - r.logger.DebugfOp(op, "directory '%s' removed", r.formFilesDirPath) - return nil -} - -const defaultHeaderFooterHTML string = "" - -// ChromePrinterOptions returns the Chrome printer options -// thanks to the form values and form files from the request -// plus the default values from the configuration. -func (r *Resource) ChromePrinterOptions() (*printer.ChromeOptions, error) { - const op string = "resource.ChromePrinterOptions" - waitTimeout, err := r.float64(WaitTimeoutFormField, r.config.DefaultWaitTimeout()) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - waitDelay, err := r.float64(WaitDelayFormField, 0.0) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - headerHTML, err := r.content("header.html", defaultHeaderFooterHTML) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - footerHTML, err := r.content("footer.html", defaultHeaderFooterHTML) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - paperWidth, err := r.float64(PaperWidthFormField, 8.27) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - paperHeight, err := r.float64(PaperHeightFormField, 11.7) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - marginTop, err := r.float64(MarginTopFormField, 1) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - marginBottom, err := r.float64(MarginBottomFormField, 1) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - marginLeft, err := r.float64(MarginLeftFormField, 1) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - marginRight, err := r.float64(MarginRightFormField, 1) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - landscape, err := r.bool(LandscapeFormField, false) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - opts := &printer.ChromeOptions{ - WaitTimeout: waitTimeout, - WaitDelay: waitDelay, - HeaderHTML: headerHTML, - FooterHTML: footerHTML, - PaperWidth: paperWidth, - PaperHeight: paperHeight, - MarginTop: marginTop, - MarginBottom: marginBottom, - MarginLeft: marginLeft, - MarginRight: marginRight, - Landscape: landscape, - } - r.logger.DebugfOp(op, "printer options: %+v", opts) - return opts, nil -} - -// OfficePrinterOptions returns the Office printer options -// thanks to the form values from the request -// plus the default values from the configuration. -func (r *Resource) OfficePrinterOptions() (*printer.OfficeOptions, error) { - const op string = "resource.OfficePrinterOptions" - waitTimeout, err := r.float64(WaitTimeoutFormField, r.config.DefaultWaitTimeout()) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - landscape, err := r.bool(LandscapeFormField, false) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - opts := &printer.OfficeOptions{ - WaitTimeout: waitTimeout, - Landscape: landscape, - } - r.logger.DebugfOp(op, "printer options: %+v", opts) - return opts, nil -} - -// MergePrinterOptions returns the merge printer options -// thanks to the form values from the request -// plus the default values from the configuration. -func (r *Resource) MergePrinterOptions() (*printer.MergeOptions, error) { - const op string = "resource.MergePrinterOptions" - waitTimeout, err := r.float64(WaitTimeoutFormField, r.config.DefaultWaitTimeout()) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - opts := &printer.MergeOptions{ - WaitTimeout: waitTimeout, - } - r.logger.DebugfOp(op, "printer options: %+v", opts) - return opts, nil -} - -// Has returns true if the resource -// contains the given form field and -// its value is not empty. -func (r *Resource) Has(formField string) bool { - v, ok := r.formValues[formField] - if ok { - ok = v != "" - } - return ok -} - -func (r *Resource) hasFile(filename string) bool { - fpath := fmt.Sprintf("%s/%s", r.formFilesDirPath, filename) - _, err := os.Stat(fpath) - return !os.IsNotExist(err) -} - -// Get returns the form field value. -func (r *Resource) Get(formField string) (string, error) { - const op string = "resource.Get" - v, err := r.value(formField) - if err != nil { - return "", &standarderror.Error{Op: op, Err: err} - } - return v, nil -} - -func (r *Resource) value(formField string) (string, error) { - const op string = "resource.value" - v, ok := r.formValues[formField] - if !ok { - return "", &standarderror.Error{ - Code: standarderror.Invalid, - Message: fmt.Sprintf("'%s' does not exist", formField), - Op: op, - } - } - return v, nil -} - -func (r *Resource) float64(formField string, defaultValue float64) (float64, error) { - const op string = "resource.float64" - if !r.Has(formField) { - return defaultValue, nil - } - v, err := r.value(formField) - if err != nil { - return 0.0, &standarderror.Error{Op: op, Err: err} - } - f, err := strconv.ParseFloat(v, 64) - if err != nil { - return 0.0, &standarderror.Error{ - Code: standarderror.Invalid, - Message: fmt.Sprintf("'%s' is not a float, got '%s'", formField, v), - Op: op, - } - } - return f, nil -} - -func (r *Resource) bool(formField string, defaultValue bool) (bool, error) { - const op string = "resource.bool" - if !r.Has(formField) { - return defaultValue, nil - } - v, err := r.value(formField) - if err != nil { - return false, &standarderror.Error{Op: op, Err: err} - } - b, err := strconv.ParseBool(v) - if err != nil { - return false, &standarderror.Error{ - Code: standarderror.Invalid, - Message: fmt.Sprintf("'%s' is not a boolean, got '%s'", formField, v), - Op: op, - } - } - return b, nil -} - -// Fpath returns the path of the given filename. -// This filename should be the name of a form file. -func (r *Resource) Fpath(filename string) (string, error) { - const op string = "resource.Fpath" - fpath := fmt.Sprintf("%s/%s", r.formFilesDirPath, filename) - _, err := os.Stat(fpath) - if os.IsNotExist(err) { - return "", &standarderror.Error{ - Code: standarderror.Invalid, - Message: fmt.Sprintf("file '%s' does not exist", filename), - Op: op, - } - } - absPath, err := filepath.Abs(fpath) - if err != nil { - return "", &standarderror.Error{Op: op, Err: err} - } - return absPath, nil -} - -func (r *Resource) content(filename string, defaultValue string) (string, error) { - const op string = "resource.content" - if !r.hasFile(filename) { - return defaultValue, nil - } - fpath, err := r.Fpath(filename) - if err != nil { - return "", &standarderror.Error{Op: op, Err: err} - } - b, err := ioutil.ReadFile(fpath) - if err != nil { - return "", &standarderror.Error{Op: op, Err: err} - } - return string(b), nil -} - -// Fpaths returns the list of files of the resource -// according to given file extensions. -func (r *Resource) Fpaths(exts ...string) ([]string, error) { - const op string = "resource.Fpaths" - var fpaths []string - err := filepath.Walk(r.formFilesDirPath, func(path string, info os.FileInfo, _ error) error { - if info.IsDir() { - return nil - } - fpath, err := r.Fpath(info.Name()) - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - for _, ext := range exts { - if filepath.Ext(fpath) == ext { - fpaths = append(fpaths, fpath) - return nil - } - } - return nil - }) - if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - if len(fpaths) == 0 { - return nil, &standarderror.Error{ - Code: standarderror.Invalid, - Message: fmt.Sprintf("no file found for extentions %v", exts), - Op: op, - } - } - return fpaths, nil -} diff --git a/internal/app/xhttp/doc.go b/internal/app/xhttp/doc.go new file mode 100644 index 00000000..62383c98 --- /dev/null +++ b/internal/app/xhttp/doc.go @@ -0,0 +1,3 @@ +// Package xhttp defines our own implementation +// of echo.Echo. +package xhttp diff --git a/internal/app/xhttp/handler.go b/internal/app/xhttp/handler.go new file mode 100644 index 00000000..52152fcc --- /dev/null +++ b/internal/app/xhttp/handler.go @@ -0,0 +1,298 @@ +package xhttp + +import ( + "fmt" + "net/http" + "os" + + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" +) + +const ( + pingEndpoint string = "/ping" + mergeEndpoint string = "/merge" + convertGroupEndpoint string = "/convert" + htmlEndpoint string = "/html" + urlEndpoint string = "/url" + markdownEndpoint string = "/markdown" + officeEndpoint string = "/office" +) + +// pingHandler is the handler for healthcheck. +func pingHandler(c echo.Context) error { + const op string = "xhttp.pingHandler" + ctx := context.MustCastFromEchoContext(c) + ctx.XLogger().DebugOp(op, "handling ping request...") + if err := ctx.ProcessesHealthcheck(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// mergeHandler is the handler for merging +// PDF files. +func mergeHandler(c echo.Context) error { + const op string = "xhttp.mergeHandler" + resolver := func() error { + ctx := context.MustCastFromEchoContext(c) + logger := ctx.XLogger() + logger.DebugOp(op, "handling merge request...") + r := ctx.MustResource() + opts, err := mergePrinterOptions(r, ctx.Config()) + if err != nil { + return xerror.New(op, err) + } + fpaths, err := r.Fpaths(".pdf") + if err != nil { + return err + } + p := printer.NewMergePrinter(logger, fpaths, opts) + return convert(ctx, p) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// htmlHandler is the handler for converting +// HTML to PDF. +func htmlHandler(c echo.Context) error { + const op string = "xhttp.htmlHandler" + resolver := func() error { + ctx := context.MustCastFromEchoContext(c) + logger := ctx.XLogger() + logger.DebugOp(op, "handling HTML request...") + r := ctx.MustResource() + opts, err := chromePrinterOptions(r, ctx.Config()) + if err != nil { + return err + } + fpath, err := r.Fpath("index.html") + if err != nil { + return err + } + p := printer.NewHTMLPrinter(logger, fpath, opts) + return convert(ctx, p) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// urlHandler is the handler for converting +// a URL to PDF. +func urlHandler(c echo.Context) error { + const op string = "xhttp.urlHandler" + resolver := func() error { + ctx := context.MustCastFromEchoContext(c) + logger := ctx.XLogger() + logger.DebugOp(op, "handling URL request...") + r := ctx.MustResource() + opts, err := chromePrinterOptions(r, ctx.Config()) + if err != nil { + return err + } + if !r.HasArg(resource.RemoteURLArgKey) { + return xerror.Invalid( + op, + fmt.Sprintf("'%s' not found or empty", resource.RemoteURLArgKey), + nil, + ) + } + remoteURL, err := r.StringArg(resource.RemoteURLArgKey, "") + if err != nil { + return err + } + p := printer.NewURLPrinter(logger, remoteURL, opts) + return convert(ctx, p) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// markdownHandler is the handler for converting +// Markdown to PDF. +func markdownHandler(c echo.Context) error { + const op string = "xhttp.markdownHandler" + resolver := func() error { + ctx := context.MustCastFromEchoContext(c) + logger := ctx.XLogger() + logger.DebugOp(op, "handling Markdown request...") + r := ctx.MustResource() + opts, err := chromePrinterOptions(r, ctx.Config()) + if err != nil { + return err + } + fpath, err := r.Fpath("index.html") + if err != nil { + return err + } + p, err := printer.NewMarkdownPrinter(logger, fpath, opts) + if err != nil { + return err + } + return convert(ctx, p) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// officeHandler is the handler for converting +// Office documents to PDF. +func officeHandler(c echo.Context) error { + const op string = "xhttp.officeHandler" + resolver := func() error { + ctx := context.MustCastFromEchoContext(c) + logger := ctx.XLogger() + logger.DebugOp(op, "handling Office request...") + r := ctx.MustResource() + opts, err := officePrinterOptions(r, ctx.Config()) + if err != nil { + return err + } + fpaths, err := r.Fpaths( + ".txt", + ".rtf", + ".fodt", + ".doc", + ".docx", + ".odt", + ".xls", + ".xlsx", + ".ods", + ".ppt", + ".pptx", + ".odp", + ) + if err != nil { + return err + } + p := printer.NewOfficePrinter(logger, fpaths, opts) + return convert(ctx, p) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func convert(ctx context.Context, p printer.Printer) error { + const op string = "xhttp.convert" + resolver := func() error { + logger := ctx.XLogger() + r := ctx.MustResource() + baseFilename := xrand.Get() + filename := fmt.Sprintf("%s.pdf", baseFilename) + fpath := fmt.Sprintf("%s/%s", r.DirPath(), filename) + // if no webhook URL given, run conversion + // and directly return the resulting PDF file + // or an error. + if !r.HasArg(resource.WebhookURLArgKey) { + logger.DebugfOp(op, "no '%s' found, converting synchronously", resource.WebhookURLArgKey) + return convertSync(ctx, p, filename, fpath) + } + // as a webhook URL has been given, we + // run the following lines in a goroutine so that + // it doesn't block. + logger.DebugfOp(op, "'%s' found, converting asynchronously", resource.WebhookURLArgKey) + return convertAsync(ctx, p, filename, fpath) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func convertSync(ctx context.Context, p printer.Printer, filename, fpath string) error { + const op = "xhttp.convertSync" + resolver := func() error { + logger := ctx.XLogger() + r := ctx.MustResource() + + if err := p.Print(fpath); err != nil { + return err + } + if !r.HasArg(resource.ResultFilenameArgKey) { + logger.DebugfOp( + op, + "no '%s' found, using generated filename '%s'", + resource.RemoteURLArgKey, + filename, + ) + if err := ctx.Attachment(fpath, filename); err != nil { + return err + } + return nil + } + logger.DebugfOp( + op, + "'%s' found, so not using generated filename", + resource.ResultFilenameArgKey, + ) + filename, err := r.StringArg(resource.ResultFilenameArgKey, filename) + if err != nil { + return err + } + if err := ctx.Attachment(fpath, filename); err != nil { + return err + } + return nil + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func convertAsync(ctx context.Context, p printer.Printer, filename, fpath string) error { + const op = "xhttp.convertAsync" + logger := ctx.XLogger() + r := ctx.MustResource() + go func() { + defer r.Close() // nolint: errcheck + if err := p.Print(fpath); err != nil { + xerr := xerror.New(op, err) + logger.ErrorOp(xerror.Op(xerr), xerr) + return + } + f, err := os.Open(fpath) + if err != nil { + xerr := xerror.New(op, err) + logger.ErrorOp(xerror.Op(xerr), xerr) + return + } + defer f.Close() // nolint: errcheck + webhookURL, err := r.StringArg(resource.WebhookURLArgKey, "") + if err != nil { + xerr := xerror.New(op, err) + logger.ErrorOp(xerror.Op(xerr), xerr) + return + } + logger.DebugfOp( + op, + "sending result file '%s' to '%s'", + filename, + webhookURL, + ) + // TODO timeout + resp, err := http.Post(webhookURL, "application/pdf", f) /* #nosec */ + if err != nil { + xerr := xerror.New(op, err) + logger.ErrorOp(xerror.Op(xerr), xerr) + return + } + defer resp.Body.Close() // nolint: errcheck + }() + return nil +} diff --git a/internal/app/xhttp/middleware.go b/internal/app/xhttp/middleware.go new file mode 100644 index 00000000..3d0dd6be --- /dev/null +++ b/internal/app/xhttp/middleware.go @@ -0,0 +1,128 @@ +package xhttp + +import ( + "net/http" + + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/context" + "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" + "github.com/thecodingmachine/gotenberg/internal/pkg/conf" + "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" +) + +// contextMiddleware extends the default echo.Context with +// our custom context.Context. +func contextMiddleware(config conf.Config, processes ...pm2.Process) echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + // generate a unique identifier for the request. + trace := xrand.Get() + // create the logger for this request using + // the previous identifier as trace. + logger := xlog.New(config.LogLevel(), trace) + // extend the current echo context with our custom + // context. + ctx := context.New(c, logger, config, processes...) + // if its an healthcheck request, there + // is no need to create a Resource. + if ctx.Path() == pingEndpoint { + return next(ctx) + } + // if the endpoint is not for healthcheck, create a + // Resource. + if err := ctx.WithResource(trace); err != nil { + // required to have a correct status code. + ctx.Error(err) + return ctx.LogRequestResult(err, false) + } + return next(ctx) + } + } +} + +// loggerMiddleware logs the result of a request. +func loggerMiddleware() echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + ctx := context.MustCastFromEchoContext(c) + err := next(ctx) + // we do not want to log healthcheck requests if + // log level is not set to DEBUG. + isDebug := ctx.Path() == pingEndpoint + return ctx.LogRequestResult(err, isDebug) + } + } +} + +// cleanupMiddleware removes a resource.Resource +// at the end of a request. +func cleanupMiddleware() echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + const op string = "xhttp.cleanupMiddleware" + err := next(c) + ctx := context.MustCastFromEchoContext(c) + if !ctx.HasResource() { + // nothing to remove. + return err + } + r := ctx.MustResource() + // if a webhook URL has been given, + // do not remove the resource.Resource here because + // we don't know if the result file has been + // generated or sent. + if r.HasArg(resource.WebhookURLArgKey) { + return err + } + // a resource.Resource is associated with our custom context. + if resourceErr := r.Close(); resourceErr != nil { + xerr := xerror.New(op, resourceErr) + ctx.XLogger().ErrorOp(xerror.Op(xerr), xerr) + } + return err + } + } +} + +// errorMiddleware handles errors (if any). +func errorMiddleware() echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + ctx := context.MustCastFromEchoContext(c) + err := next(ctx) + if err == nil { + // so far so good! + return nil + } + // if it's an error from echo + // like 404 not found and so on. + if echoHTTPErr, ok := err.(*echo.HTTPError); ok { + return echoHTTPErr + } + // we log the initial error before returning + // the HTTP error. + errOp := xerror.Op(err) + logger := ctx.XLogger() + logger.ErrorOp(errOp, err) + // handle our custom HTTP error. + var httpErr error + errCode := xerror.Code(err) + errMessage := xerror.Message(err) + switch errCode { + case xerror.InvalidCode: + httpErr = echo.NewHTTPError(http.StatusBadRequest, errMessage) + case xerror.TimeoutCode: + // TODO status + httpErr = echo.NewHTTPError(http.StatusBadGateway, errMessage) + default: + httpErr = echo.NewHTTPError(http.StatusInternalServerError, errMessage) + } + // required to have a correct status code. + ctx.Error(httpErr) + return httpErr + } + } +} diff --git a/internal/app/xhttp/option.go b/internal/app/xhttp/option.go new file mode 100644 index 00000000..da9bf2f4 --- /dev/null +++ b/internal/app/xhttp/option.go @@ -0,0 +1,93 @@ +package xhttp + +import ( + "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" + "github.com/thecodingmachine/gotenberg/internal/pkg/conf" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" +) + +func mergePrinterOptions(r resource.Resource, config conf.Config) (printer.MergePrinterOptions, error) { + const op string = "xhttp.mergePrinterOptions" + waitTimeout, err := resource.WaitTimeoutArg(r, config) + if err != nil { + return printer.MergePrinterOptions{}, xerror.New(op, err) + } + return printer.MergePrinterOptions{ + WaitTimeout: waitTimeout, + }, nil +} + +func chromePrinterOptions(r resource.Resource, config conf.Config) (printer.ChromePrinterOptions, error) { + const op string = "xhttp.chromePrinterOptions" + resolver := func() (printer.ChromePrinterOptions, error) { + waitTimeout, err := resource.WaitTimeoutArg(r, config) + if err != nil { + return printer.ChromePrinterOptions{}, err + } + waitDelay, err := resource.WaitDelayArg(r, config) + if err != nil { + return printer.ChromePrinterOptions{}, err + } + headerHTML, footerHTML, + err := resource.HeaderFooterContents(r) + if err != nil { + return printer.ChromePrinterOptions{}, err + } + paperWidth, paperHeight, + err := resource.PaperSizeArgs(r) + if err != nil { + return printer.ChromePrinterOptions{}, err + } + marginTop, marginBottom, marginLeft, marginRight, + err := resource.MarginArgs(r) + if err != nil { + return printer.ChromePrinterOptions{}, err + } + landscape, err := r.BoolArg(resource.LandscapeArgKey, false) + if err != nil { + return printer.ChromePrinterOptions{}, err + } + return printer.ChromePrinterOptions{ + WaitTimeout: waitTimeout, + WaitDelay: waitDelay, + HeaderHTML: headerHTML, + FooterHTML: footerHTML, + PaperWidth: paperWidth, + PaperHeight: paperHeight, + MarginTop: marginTop, + MarginBottom: marginBottom, + MarginLeft: marginLeft, + MarginRight: marginRight, + Landscape: landscape, + }, nil + } + opts, err := resolver() + if err != nil { + return opts, xerror.New(op, err) + } + return opts, nil +} + +func officePrinterOptions(r resource.Resource, config conf.Config) (printer.OfficePrinterOptions, error) { + const op string = "xhttp.officePrinterOptions" + resolver := func() (printer.OfficePrinterOptions, error) { + waitTimeout, err := resource.WaitTimeoutArg(r, config) + if err != nil { + return printer.OfficePrinterOptions{}, err + } + landscape, err := r.BoolArg(resource.LandscapeArgKey, false) + if err != nil { + return printer.OfficePrinterOptions{}, err + } + return printer.OfficePrinterOptions{ + WaitTimeout: waitTimeout, + Landscape: landscape, + }, nil + } + opts, err := resolver() + if err != nil { + return opts, xerror.New(op, err) + } + return opts, nil +} diff --git a/internal/app/xhttp/pkg/context/context.go b/internal/app/xhttp/pkg/context/context.go new file mode 100644 index 00000000..cf49d205 --- /dev/null +++ b/internal/app/xhttp/pkg/context/context.go @@ -0,0 +1,210 @@ +package context + +import ( + "fmt" + "net/http" + "strconv" + "time" + + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" + "github.com/thecodingmachine/gotenberg/internal/pkg/conf" + "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +// Context extends the default echo.Context. +type Context struct { + echo.Context + logger xlog.Logger + config conf.Config + processes []pm2.Process + resource resource.Resource + startTime time.Time +} + +// New creates a new Context. +func New(c echo.Context, logger xlog.Logger, config conf.Config, processess ...pm2.Process) Context { + return Context{ + c, + logger, + config, + processess, + resource.Resource{}, + time.Now(), + } +} + +/* +MustCastFromEchoContext cast an echo.Context +to our custom Context. + +It panics if casting goes wrong. +*/ +func MustCastFromEchoContext(c echo.Context) Context { + const op string = "context.MustCastFromEchoContext" + ctx, ok := c.(Context) + if !ok { + panic(fmt.Sprintf("%s: unable to cast an echo.Context to our custom context.Context", op)) + } + return ctx +} + +/* +XLogger returns the xlog.Logger associated +with the Context. + +This method should be used instead of the +default Logger() method coming from +the echo.Context. +*/ +func (ctx Context) XLogger() xlog.Logger { + return ctx.logger +} + +// Config returns the conf.Config associated +// with the Context. +func (ctx Context) Config() conf.Config { + return ctx.config +} + +// ProcessesHealthcheck returns an error if +// one of the processes is not viable. +func (ctx Context) ProcessesHealthcheck() error { + const op string = "context.Context.ProcessesHealthcheck" + for _, process := range ctx.processes { + if !process.IsViable() { + return xerror.New( + op, + fmt.Errorf("'%s' is not viable", process.Fullname()), + ) + } + } + return nil +} + +// WithResource creates a resource.Resource and +// adds it to the Context. +func (ctx *Context) WithResource(directoryName string) error { + const op string = "context.Context.WithResource" + resolver := func() (resource.Resource, error) { + r, err := resource.New(ctx.logger, directoryName) + if err != nil { + return r, err + } + // retrieve form values from request. + for _, key := range resource.ArgKeys() { + r.WithArg(key, ctx.FormValue(string(key))) + } + // write form files from request. + form, err := ctx.MultipartForm() + if err != nil { + return r, err + } + for _, files := range form.File { + for _, fh := range files { + in, err := fh.Open() + if err != nil { + return r, err + } + defer in.Close() // nolint: errcheck + if err := r.WithFile(fh.Filename, in); err != nil { + return r, err + } + } + } + return r, nil + } + resource, err := resolver() + ctx.resource = resource + if err != nil { + return xerror.New(op, err) + } + return nil +} + +/* +MustResource returns the resource.Resource +associated with the Context. + +It panics if no resource.Resource. +*/ +func (ctx Context) MustResource() resource.Resource { + const op string = "context.Context.MustResource" + if !ctx.HasResource() { + panic(fmt.Sprintf("%s: unable to retrieve the resource.Resource from our custom context.Context", op)) + } + return ctx.resource +} + +// HasResource returns true if the Context +// has a resource.Resource. +func (ctx Context) HasResource() bool { + return &ctx.resource != nil +} + +/* +LogRequestResult logs the result of a request. +This method should only be used by a middleware! + +If an error is given, returns the exact same error. +*/ +func (ctx Context) LogRequestResult(err error, isDebug bool) error { + const op string = "context.Context.LogRequestResult" + req := ctx.Request() + resp := ctx.Response() + stopTime := time.Now() + fields := map[string]interface{}{ + "remote_ip": ctx.RealIP(), + "host": req.Host, + "uri": req.RequestURI, + "method": req.Method, + "path": path(req), + "referer": req.Referer(), + "user_agent": req.UserAgent(), + "status": resp.Status, + "latency": lantency(ctx.startTime, stopTime), + "latency_human": latencyHuman(ctx.startTime, stopTime), + "bytes_in": bytesIn(req), + "bytes_out": bytesOut(resp), + } + if err != nil { + ctx.logger.WithFields(fields).ErrorfOp(op, "request failed") + return err + } + if isDebug { + ctx.logger.WithFields(fields).DebugfOp(op, "request handled") + return nil + } + ctx.logger.WithFields(fields).InfofOp(op, "request handled") + return nil +} + +func path(r *http.Request) string { + path := r.URL.Path + if path == "" { + path = "/" + } + return path +} + +func lantency(startTime time.Time, stopTime time.Time) string { + return strconv.FormatInt(int64(stopTime.Sub(startTime)), 10) +} + +func latencyHuman(startTime time.Time, stopTime time.Time) string { + return stopTime.Sub(startTime).String() +} + +func bytesIn(r *http.Request) string { + bytesIn := r.Header.Get(echo.HeaderContentLength) + if bytesIn == "" { + bytesIn = "0" + } + return bytesIn +} + +func bytesOut(r *echo.Response) string { + return strconv.FormatInt(r.Size, 10) +} diff --git a/internal/app/xhttp/pkg/context/doc.go b/internal/app/xhttp/pkg/context/doc.go new file mode 100644 index 00000000..294bb860 --- /dev/null +++ b/internal/app/xhttp/pkg/context/doc.go @@ -0,0 +1,7 @@ +/* +Package context extends the default echo.Context. + +All functions return our standard xerror.Error +in case of error. +*/ +package context diff --git a/internal/app/xhttp/pkg/resource/arg.go b/internal/app/xhttp/pkg/resource/arg.go new file mode 100644 index 00000000..d225b121 --- /dev/null +++ b/internal/app/xhttp/pkg/resource/arg.go @@ -0,0 +1,253 @@ +package resource + +import ( + "github.com/thecodingmachine/gotenberg/internal/pkg/conf" + "github.com/thecodingmachine/gotenberg/internal/pkg/xassert" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" +) + +// ArgKey is a type for +// arguments' keys. +type ArgKey string + +const ( + // ResultFilenameArgKey is the key + // of the argument "resultFilename". + ResultFilenameArgKey ArgKey = "resultFilename" + // WaitTimeoutArgKey is the key + // of the argument "waitTimeout". + WaitTimeoutArgKey ArgKey = "waitTimeout" + // WebhookURLArgKey is the key + // of the argument "webhookURL". + WebhookURLArgKey ArgKey = "webhookURL" + // WebhookURLTimeoutArgKey is the key + // of the argument "webhookURLTimeout". + WebhookURLTimeoutArgKey ArgKey = "webhookURLTimeout" + // RemoteURLArgKey is the key + // of the argument "remoteURL". + RemoteURLArgKey ArgKey = "remoteURL" + // WaitDelayArgKey is the key + // of the argument "waitDelay". + WaitDelayArgKey ArgKey = "waitDelay" + // PaperWidthArgKey is the key + // of the argument "paperWidth". + PaperWidthArgKey ArgKey = "paperWidth" + // PaperHeightArgKey is the key + // of the argument "paperHeight". + PaperHeightArgKey ArgKey = "paperHeight" + // MarginTopArgKey is the key + // of the argument "marginTop". + MarginTopArgKey ArgKey = "marginTop" + // MarginBottomArgKey is the key + // of the argument "marginBottom". + MarginBottomArgKey ArgKey = "marginBottom" + // MarginLeftArgKey is the key + // of the argument "marginLeft". + MarginLeftArgKey ArgKey = "marginLeft" + // MarginRightArgKey is the key + // of the argument "marginRight". + MarginRightArgKey ArgKey = "marginRight" + // LandscapeArgKey is the key + // of the argument "landscape". + LandscapeArgKey ArgKey = "landscape" +) + +/* +ArgKeys returns a slice +containing all available +arguments' keys. +*/ +func ArgKeys() []ArgKey { + return []ArgKey{ + ResultFilenameArgKey, + WaitTimeoutArgKey, + WebhookURLArgKey, + WebhookURLTimeoutArgKey, + RemoteURLArgKey, + WaitDelayArgKey, + PaperWidthArgKey, + PaperHeightArgKey, + MarginTopArgKey, + MarginBottomArgKey, + MarginLeftArgKey, + MarginRightArgKey, + LandscapeArgKey, + } +} + +/* +WaitTimeoutArg is a helper for retrieving +the "waitTimeout" argument as float64. + +It also validates it against the application +configuration. +*/ +func WaitTimeoutArg(r Resource, config conf.Config) (float64, error) { + const op string = "resource.WaitTimeoutArg" + result, err := r.Float64Arg( + WaitTimeoutArgKey, + config.DefaultWaitTimeout(), + xassert.Float64NotInferiorTo(0), + xassert.Float64NotSuperiorTo(config.MaximumWaitTimeout()), + ) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} + +/* +WaitDelayArg is a helper for retrieving +the "waitDelay" argument as float64. + +It also validates it against the application +configuration. +*/ +func WaitDelayArg(r Resource, config conf.Config) (float64, error) { + const ( + op string = "resource.WaitDelayArg" + defaultWaitDelay float64 = 0.0 + ) + result, err := r.Float64Arg( + WaitDelayArgKey, + defaultWaitDelay, + xassert.Float64NotInferiorTo(0.0), + xassert.Float64NotSuperiorTo(config.MaximumWaitDelay()), + ) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} + +/* +PaperSizeArgs is a helper for retrieving +the "paperWidth" and "paperHeight" arguments +as float64. +*/ +func PaperSizeArgs(r Resource) (float64, float64, error) { + const ( + op string = "resource.PaperSizeArgs" + defaultPaperWidth float64 = 8.27 + defaultPaperHeight float64 = 11.7 + ) + resolver := func() (float64, float64, error) { + paperWidth, err := r.Float64Arg( + PaperWidthArgKey, + defaultPaperWidth, + xassert.Float64NotInferiorTo(0.0), + ) + if err != nil { + return defaultPaperWidth, + defaultPaperHeight, + err + } + paperHeight, err := r.Float64Arg( + PaperHeightArgKey, + defaultPaperHeight, + xassert.Float64NotInferiorTo(0.0), + ) + if err != nil { + return defaultPaperWidth, + defaultPaperHeight, + err + } + return paperWidth, + paperHeight, + nil + } + paperWidth, paperHeight, + err := resolver() + if err != nil { + return paperWidth, + paperHeight, + xerror.New(op, err) + } + return paperWidth, + paperHeight, + nil +} + +/* +MarginArgs is a helper for retrieving +the "marginTop", "marginBottom", "marginLeft" +and "marginRight" arguments as float64. +*/ +func MarginArgs(r Resource) (float64, float64, float64, float64, error) { + const ( + op string = "resource.MarginArgs" + defaultMarginTop float64 = 1.0 + defaultMarginBottom float64 = 1.0 + defaultMarginLeft float64 = 1.0 + defaultMarginRight float64 = 1.0 + ) + resolver := func() (float64, float64, float64, float64, error) { + marginTop, err := r.Float64Arg( + MarginTopArgKey, + defaultMarginTop, + xassert.Float64NotInferiorTo(0.0), + ) + if err != nil { + return defaultMarginTop, + defaultMarginBottom, + defaultMarginLeft, + defaultMarginRight, + err + } + marginBottom, err := r.Float64Arg( + MarginBottomArgKey, + defaultMarginBottom, + xassert.Float64NotInferiorTo(0.0), + ) + if err != nil { + return defaultMarginTop, + defaultMarginBottom, + defaultMarginLeft, + defaultMarginRight, + err + } + marginLeft, err := r.Float64Arg( + MarginLeftArgKey, + defaultMarginLeft, + xassert.Float64NotInferiorTo(0.0), + ) + if err != nil { + return defaultMarginTop, + defaultMarginBottom, + defaultMarginLeft, + defaultMarginRight, + err + } + marginRight, err := r.Float64Arg( + MarginRightArgKey, + defaultMarginRight, + xassert.Float64NotInferiorTo(0.0), + ) + if err != nil { + return defaultMarginTop, + defaultMarginBottom, + defaultMarginLeft, + defaultMarginRight, + err + } + return marginTop, + marginBottom, + marginLeft, + marginRight, + nil + } + marginTop, marginBottom, marginLeft, marginRight, + err := resolver() + if err != nil { + return marginTop, + marginBottom, + marginLeft, + marginRight, + xerror.New(op, err) + } + return marginTop, + marginBottom, + marginLeft, + marginRight, + nil +} diff --git a/internal/app/xhttp/pkg/resource/doc.go b/internal/app/xhttp/pkg/resource/doc.go new file mode 100644 index 00000000..3ec7b2c9 --- /dev/null +++ b/internal/app/xhttp/pkg/resource/doc.go @@ -0,0 +1,8 @@ +/* +Package resource helps managing +arguments and files for a conversion. + +All functions return our standard xerror.Error +in case of error. +*/ +package resource diff --git a/internal/app/xhttp/pkg/resource/file.go b/internal/app/xhttp/pkg/resource/file.go new file mode 100644 index 00000000..c6edbd0c --- /dev/null +++ b/internal/app/xhttp/pkg/resource/file.go @@ -0,0 +1,91 @@ +package resource + +import ( + "io" + "io/ioutil" + "os" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" +) + +// file represents a file within the resource. +type file struct { + fpath string +} + +// write writes given content to the +// resourceFile location. +func (f file) write(in io.Reader) error { + const op string = "resource.file.write" + resolver := func() error { + out, err := os.Create(f.fpath) + if err != nil { + return err + } + defer out.Close() // nolint: errcheck + if err := out.Chmod(0644); err != nil { + return err + } + if _, err := io.Copy(out, in); err != nil { + return err + } + if _, err := out.Seek(0, 0); err != nil { + return err + } + return nil + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// content returns the string content of +// the file. +func (f file) content() (string, error) { + const op string = "resource.file.content" + b, err := ioutil.ReadFile(f.fpath) + if err != nil { + return "", xerror.New(op, err) + } + return string(b), nil +} + +/* +HeaderFooterContents is a helper for retrieving +the content of the files "header.html" +and "footer.html". +*/ +func HeaderFooterContents(r Resource) (string, string, error) { + const ( + op string = "resource.HeaderFooterContents" + defaultHeaderFooterHTML string = "" + ) + resolver := func() (string, string, error) { + headerHTML, err := r.Fcontent("header.html", defaultHeaderFooterHTML) + if err != nil { + return defaultHeaderFooterHTML, + defaultHeaderFooterHTML, + err + } + footerHTML, err := r.Fcontent("footer.html", defaultHeaderFooterHTML) + if err != nil { + return defaultHeaderFooterHTML, + defaultHeaderFooterHTML, + err + } + return headerHTML, + footerHTML, + nil + } + headerHTML, footerHTML, + err := resolver() + if err != nil { + return headerHTML, + footerHTML, + xerror.New(op, err) + } + return headerHTML, + footerHTML, + nil +} diff --git a/internal/app/xhttp/pkg/resource/resource.go b/internal/app/xhttp/pkg/resource/resource.go new file mode 100644 index 00000000..81cf001a --- /dev/null +++ b/internal/app/xhttp/pkg/resource/resource.go @@ -0,0 +1,227 @@ +package resource + +import ( + "fmt" + "io" + "os" + "path/filepath" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xassert" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +/* +TemporaryDirectory is the directory +where all the resources directory +are located. +*/ +const TemporaryDirectory string = "tmp" + +// Resource helps managing +// arguments and files for a conversion. +type Resource struct { + logger xlog.Logger + dirPath string + args map[ArgKey]string + files map[string]file +} + +// New creates a Resource where its files will +// be located in the given directory name. +func New(logger xlog.Logger, directoryName string) (Resource, error) { + const op string = "resource.New" + resolver := func() (string, error) { + dirPath := fmt.Sprintf("%s/%s", TemporaryDirectory, directoryName) + if err := os.MkdirAll(dirPath, 0755); err != nil { + return "", err + } + absDirPath, err := filepath.Abs(dirPath) + if err != nil { + return "", err + } + return absDirPath, nil + } + dirPath, err := resolver() + if err != nil { + return Resource{}, xerror.New(op, err) + } + logger.DebugfOp(op, "resource directory '%s' created", directoryName) + return Resource{ + logger: logger, + dirPath: dirPath, + args: make(map[ArgKey]string), + files: make(map[string]file), + }, nil +} + +// Close removes the working directory of the +// Resource if it exists. +func (r Resource) Close() error { + const op string = "resource.Resource.Close" + if _, err := os.Stat(r.dirPath); os.IsNotExist(err) { + r.logger.DebugfOp(op, "resource directory '%s' does not exist, nothing to remove", r.dirPath) + return nil + } + if err := os.RemoveAll(r.dirPath); err != nil { + return xerror.New(op, err) + } + r.logger.DebugfOp(op, "resource directory '%s' removed", r.dirPath) + return nil +} + +// WithArg add a new argument to the Resource. +func (r *Resource) WithArg(key ArgKey, value string) { + const op string = "resource.Resource.WithArg" + r.args[key] = value + r.logger.DebugfOp(op, "added '%s' with value '%s' to resource args", key, value) +} + +// WithFile add a new file to the Resource. +func (r *Resource) WithFile(filename string, in io.Reader) error { + const op string = "resource.Resource.WithFile" + fpath := fmt.Sprintf("%s/%s", r.dirPath, filename) + file := file{fpath: fpath} + if err := file.write(in); err != nil { + return xerror.New(op, err) + } + r.files[filename] = file + r.logger.DebugfOp(op, "resource file '%s' created", filename) + return nil +} + +// DirPath returns the directory path +// of the Resource. +func (r Resource) DirPath() string { + return r.dirPath +} + +// HasArg returns true if given key exists +// among the Resource and its value is not empty. +func (r Resource) HasArg(key ArgKey) bool { + if v, ok := r.args[key]; ok { + return v != "" + } + return false +} + +/* +StringArg returns the value of the +argument identified by given key. + +It works in the same manner as xassert.String. +*/ +func (r Resource) StringArg(key ArgKey, defaultValue string, rules ...xassert.RuleString) (string, error) { + const op string = "resource.Resource.StringArg" + result, err := xassert.String(string(key), r.args[key], defaultValue, rules...) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} + +/* +Int64Arg returns the int64 representation of the +argument identified by given key. + +It works in the same manner as xassert.Int64. +*/ +func (r Resource) Int64Arg(key ArgKey, defaultValue int64, rules ...xassert.RuleInt64) (int64, error) { + const op string = "resource.Resource.Int64Arg" + result, err := xassert.Int64(string(key), r.args[key], defaultValue, rules...) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} + +/* +Float64Arg returns the float64 representation of the +argument identified by given key. + +It works in the same manner as xassert.Float64. +*/ +func (r Resource) Float64Arg(key ArgKey, defaultValue float64, rules ...xassert.RuleFloat64) (float64, error) { + const op string = "resource.Resource.Float64Arg" + result, err := xassert.Float64(string(key), r.args[key], defaultValue, rules...) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} + +/* +BoolArg returns the boolean representation of the +argument identified by given key. + +It works in the same manner as xassert.Bool. +*/ +func (r Resource) BoolArg(key ArgKey, defaultValue bool) (bool, error) { + const op string = "resource.Resource.BoolArg" + result, err := xassert.Bool(string(key), r.args[key], defaultValue) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} + +// Fpath returns the path of the given filename. +// This filename should exist whithin the Resource. +func (r Resource) Fpath(filename string) (string, error) { + const op string = "resource.Resource.Fpath" + file, ok := r.files[filename] + if !ok { + return "", xerror.Invalid( + op, + fmt.Sprintf("resource file '%s' does not exist", filename), + nil, + ) + } + return file.fpath, nil +} + +/* +Fpaths returns the paths of the files +having one of the given file extensions. + +It should found at least one path. +*/ +func (r Resource) Fpaths(exts ...string) ([]string, error) { + const op string = "resource.Resource.Fpaths" + var fpaths []string + for filename, file := range r.files { + for _, ext := range exts { + if filepath.Ext(filename) == ext { + fpaths = append(fpaths, file.fpath) + } + } + } + if len(fpaths) == 0 { + return nil, xerror.Invalid( + op, + fmt.Sprintf("no resource file found for extensions '%v'", exts), + nil, + ) + } + return fpaths, nil +} + +/* +Fcontent returns the string content of the +given filename. + +If filename does not exist within the Resource, +returns the default value. +*/ +func (r Resource) Fcontent(filename, defaultValue string) (string, error) { + const op string = "resource.Resource.Fcontent" + file, ok := r.files[filename] + if !ok { + return defaultValue, nil + } + content, err := file.content() + if err != nil { + return "", xerror.New(op, err) + } + return content, nil +} diff --git a/internal/app/xhttp/xhttp.go b/internal/app/xhttp/xhttp.go new file mode 100644 index 00000000..73241d9b --- /dev/null +++ b/internal/app/xhttp/xhttp.go @@ -0,0 +1,33 @@ +package xhttp + +import ( + "github.com/labstack/echo/v4" + "github.com/thecodingmachine/gotenberg/internal/pkg/conf" + "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" +) + +// New returns a custom echo.Echo. +func New(config conf.Config, processes ...pm2.Process) *echo.Echo { + srv := echo.New() + srv.HideBanner = true + srv.HidePort = true + srv.Use(contextMiddleware(config, processes...)) + srv.Use(loggerMiddleware()) + srv.Use(cleanupMiddleware()) + srv.Use(errorMiddleware()) + srv.GET(pingEndpoint, pingHandler) + srv.POST(mergeEndpoint, mergeHandler) + if config.DisableGoogleChrome() && config.DisableUnoconv() { + return srv + } + g := srv.Group(convertGroupEndpoint) + if !config.DisableGoogleChrome() { + g.POST(htmlEndpoint, htmlHandler) + g.POST(urlEndpoint, urlHandler) + g.POST(markdownEndpoint, markdownHandler) + } + if !config.DisableUnoconv() { + g.POST(officeEndpoint, officeHandler) + } + return srv +} diff --git a/internal/pkg/conf/conf.go b/internal/pkg/conf/conf.go new file mode 100644 index 00000000..56072b74 --- /dev/null +++ b/internal/pkg/conf/conf.go @@ -0,0 +1,206 @@ +package conf + +import ( + "github.com/thecodingmachine/gotenberg/internal/pkg/xassert" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +const ( + maximumWaitTimeoutEnvVar string = "MAXIMUM_WAIT_TIMEOUT" + maximumWaitDelayEnvVar string = "MAXIMUM_WAIT_DELAY" + maximumWebhookURLTimeoutEnvVar string = "MAXIMUM_WEBHOOK_URL_TIMEOUT" + defaultWaitTimeoutEnvVar string = "DEFAULT_WAIT_TIMEOUT" + defaultWebhookURLTimeoutEnvVar string = "DEFAULT_WEBHOOK_URL_TIMEOUT" + defaultListenPortEnvVar string = "DEFAULT_LISTEN_PORT" + disableGoogleChromeEnvVar string = "DISABLE_GOOGLE_CHROME" + disableUnoconvEnvVar string = "DISABLE_UNOCONV" + logLevelEnvVar string = "LOG_LEVEL" +) + +// Config contains the application +// configuration. +type Config struct { + maximumWaitTimeout float64 + maximumWaitDelay float64 + maximumWebhookURLTimeout float64 + defaultWaitTimeout float64 + defaultWebhookURLTimeout float64 + defaultListenPort int64 + disableGoogleChrome bool + disableUnoconv bool + logLevel xlog.Level +} + +func defaultConfig() Config { + return Config{ + maximumWaitTimeout: 30.0, + maximumWaitDelay: 10.0, + maximumWebhookURLTimeout: 30.0, + defaultWaitTimeout: 10.0, + defaultWebhookURLTimeout: 10.0, + defaultListenPort: 3000, + disableGoogleChrome: false, + disableUnoconv: false, + logLevel: xlog.InfoLevel, + } +} + +/* +FromEnv returns a Conf according +to environment variables. +*/ +func FromEnv() (Config, error) { + const op string = "conf.FromEnv" + resolver := func() (Config, error) { + c := defaultConfig() + maximumWaitTimeout, err := xassert.Float64FromEnv( + maximumWaitTimeoutEnvVar, + c.maximumWaitTimeout, + xassert.Float64NotInferiorTo(0.0), + ) + c.maximumWaitTimeout = maximumWaitTimeout + if err != nil { + return c, err + } + maximumWaitDelay, err := xassert.Float64FromEnv( + maximumWaitDelayEnvVar, + c.maximumWaitDelay, + xassert.Float64NotInferiorTo(0.0), + ) + c.maximumWaitDelay = maximumWaitDelay + if err != nil { + return c, err + } + maximumWebhookURLTimeout, err := xassert.Float64FromEnv( + maximumWebhookURLTimeoutEnvVar, + c.maximumWebhookURLTimeout, + xassert.Float64NotInferiorTo(0.0), + ) + c.maximumWebhookURLTimeout = maximumWebhookURLTimeout + if err != nil { + return c, err + } + defaultWaitTimeout, err := xassert.Float64FromEnv( + defaultWaitTimeoutEnvVar, + c.defaultWaitTimeout, + xassert.Float64NotInferiorTo(0.0), + xassert.Float64NotSuperiorTo(c.maximumWaitTimeout), + ) + c.defaultWaitTimeout = defaultWaitTimeout + if err != nil { + return c, err + } + defaultWebhookURLTimeout, err := xassert.Float64FromEnv( + defaultWebhookURLTimeoutEnvVar, + c.defaultWebhookURLTimeout, + xassert.Float64NotInferiorTo(0.0), + xassert.Float64NotSuperiorTo(c.defaultWebhookURLTimeout), + ) + c.defaultWebhookURLTimeout = defaultWebhookURLTimeout + if err != nil { + return c, err + } + defaultListenPort, err := xassert.Int64FromEnv( + defaultListenPortEnvVar, + c.defaultListenPort, + xassert.Int64NotInferiorTo(0), + xassert.Int64NotSuperiorTo(65535), + ) + c.defaultListenPort = defaultListenPort + if err != nil { + return c, err + } + disableGoogleChrome, err := xassert.BoolFromEnv( + disableGoogleChromeEnvVar, + c.disableGoogleChrome, + ) + c.disableGoogleChrome = disableGoogleChrome + if err != nil { + return c, err + } + disableUnoconv, err := xassert.BoolFromEnv( + disableUnoconvEnvVar, + c.disableUnoconv, + ) + c.disableUnoconv = disableUnoconv + if err != nil { + return c, err + } + logLevel, err := xassert.StringFromEnv( + logLevelEnvVar, + string(c.logLevel), + xassert.StringOneOf(xlog.Levels()), + ) + c.logLevel = xlog.MustParseLevel(logLevel) + if err != nil { + return c, err + } + return c, nil + } + result, err := resolver() + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} + +// MaximumWaitTimeout returns the maximum +// wait timeout from the configuration. +func (c Config) MaximumWaitTimeout() float64 { + return c.maximumWaitTimeout +} + +// MaximumWaitDelay returns the maximum +// wait timeout from the configuration. +func (c Config) MaximumWaitDelay() float64 { + return c.maximumWaitDelay +} + +// MaximumWebhookURLTimeout returns the maximum +// webhook URL wait timeout from the configuration. +func (c Config) MaximumWebhookURLTimeout() float64 { + return c.maximumWebhookURLTimeout +} + +// DefaultWaitTimeout returns the default +// wait timeout from the configuration. +func (c Config) DefaultWaitTimeout() float64 { + return c.defaultWaitTimeout +} + +// DefaultWebhookURLTimeout returns the default +// webhook URL wait timeout from the configuration. +func (c Config) DefaultWebhookURLTimeout() float64 { + return c.defaultWebhookURLTimeout +} + +// DefaultListenPort returns the default +// listen port from the configuration. +func (c Config) DefaultListenPort() int64 { + return c.defaultListenPort +} + +/* +DisableGoogleChrome returns true if +Google Chrome is disabled in the +configuration. +*/ +func (c Config) DisableGoogleChrome() bool { + return c.disableGoogleChrome +} + +/* +DisableUnoconv returns true if +Unoconv is disabled in the +configuration. +*/ +func (c Config) DisableUnoconv() bool { + return c.disableUnoconv +} + +// LogLevel returns the xlog.Level from +// the configuration. +func (c Config) LogLevel() xlog.Level { + return c.logLevel +} diff --git a/internal/pkg/conf/conf_test.go b/internal/pkg/conf/conf_test.go new file mode 100644 index 00000000..8ce2b2f9 --- /dev/null +++ b/internal/pkg/conf/conf_test.go @@ -0,0 +1,334 @@ +package conf + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xerrortest" +) + +func TestEmptyFromEnv(t *testing.T) { + var ( + expected Config + result Config + err error + ) + // no environment variables set, + // values should be equal to default config. + expected = defaultConfig() + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) +} + +func TestMaximumWaitTimeoutFromEnv(t *testing.T) { + var ( + expected Config + result Config + err error + ) + // MAXIMUM_WAIT_TIMEOUT correctly set. + os.Setenv(maximumWaitTimeoutEnvVar, "10.0") + expected = defaultConfig() + expected.maximumWaitTimeout = 10.0 + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(maximumWaitTimeoutEnvVar) + // MAXIMUM_WAIT_TIMEOUT wrongly set. + os.Setenv(maximumWaitTimeoutEnvVar, "foo") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(maximumWaitTimeoutEnvVar) + // MAXIMUM_WAIT_TIMEOUT < 0. + os.Setenv(maximumWaitTimeoutEnvVar, "-1.0") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(maximumWaitTimeoutEnvVar) +} + +func TestMaximumWaitDelayFromEnv(t *testing.T) { + var ( + expected Config + result Config + err error + ) + // MAXIMUM_WAIT_DELAY correctly set. + os.Setenv(maximumWaitDelayEnvVar, "10.0") + expected = defaultConfig() + expected.maximumWaitDelay = 10.0 + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(maximumWaitDelayEnvVar) + // MAXIMUM_WAIT_DELAY wrongly set. + os.Setenv(maximumWaitDelayEnvVar, "foo") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(maximumWaitDelayEnvVar) + // MAXIMUM_WAIT_DELAY < 0. + os.Setenv(maximumWaitDelayEnvVar, "-1.0") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(maximumWaitDelayEnvVar) +} + +func TestMaximumWebhookURLTimeoutFromEnv(t *testing.T) { + var ( + expected Config + result Config + err error + ) + // MAXIMUM_WEBHOOK_URL_TIMEOUT correctly set. + os.Setenv(maximumWebhookURLTimeoutEnvVar, "10.0") + expected = defaultConfig() + expected.maximumWebhookURLTimeout = 10.0 + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(maximumWebhookURLTimeoutEnvVar) + // MAXIMUM_WEBHOOK_URL_TIMEOUT wrongly set. + os.Setenv(maximumWebhookURLTimeoutEnvVar, "foo") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(maximumWebhookURLTimeoutEnvVar) + // MAXIMUM_WEBHOOK_URL_TIMEOUT < 0. + os.Setenv(maximumWebhookURLTimeoutEnvVar, "-1.0") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(maximumWebhookURLTimeoutEnvVar) +} + +func TestDefaultWaitTimeoutFromEnv(t *testing.T) { + var ( + expected Config + result Config + err error + ) + // DEFAULT_WAIT_TIMEOUT correctly set. + os.Setenv(defaultWaitTimeoutEnvVar, "10.0") + expected = defaultConfig() + expected.defaultWaitTimeout = 10.0 + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultWaitTimeoutEnvVar) + // DEFAULT_WAIT_TIMEOUT wrongly set. + os.Setenv(defaultWaitTimeoutEnvVar, "foo") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultWaitTimeoutEnvVar) + // DEFAULT_WAIT_TIMEOUT < 0. + os.Setenv(defaultWaitTimeoutEnvVar, "-1.0") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultWaitTimeoutEnvVar) + // DEFAULT_WAIT_TIMEOUT > MAXIMUM_WAIT_TIMEOUT. + os.Setenv(defaultWaitTimeoutEnvVar, "40.0") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultWaitTimeoutEnvVar) +} + +func TestDefaultWebhookURLTimeoutFromEnv(t *testing.T) { + var ( + expected Config + result Config + err error + ) + // DEFAULT_WEBHOOK_URL_TIMEOUT correctly set. + os.Setenv(defaultWebhookURLTimeoutEnvVar, "10.0") + expected = defaultConfig() + expected.defaultWebhookURLTimeout = 10.0 + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultWebhookURLTimeoutEnvVar) + // DEFAULT_WEBHOOK_URL_TIMEOUT wrongly set. + os.Setenv(defaultWebhookURLTimeoutEnvVar, "foo") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultWebhookURLTimeoutEnvVar) + // DEFAULT_WEBHOOK_URL_TIMEOUT < 0. + os.Setenv(defaultWebhookURLTimeoutEnvVar, "-1.0") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultWebhookURLTimeoutEnvVar) + // DEFAULT_WEBHOOK_URL_TIMEOUT > MAXIMUM_WEBHOOK_URL_TIMEOUT. + os.Setenv(defaultWebhookURLTimeoutEnvVar, "40.0") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultWebhookURLTimeoutEnvVar) +} + +func TestDefaultListenPortFromEnv(t *testing.T) { + var ( + expected Config + result Config + err error + ) + // DEFAULT_LISTEN_PORT correctly set. + os.Setenv(defaultListenPortEnvVar, "80") + expected = defaultConfig() + expected.defaultListenPort = 80 + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultListenPortEnvVar) + // DEFAULT_LISTEN_PORT wrongly set. + os.Setenv(defaultListenPortEnvVar, "foo") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultListenPortEnvVar) + // DEFAULT_LISTEN_PORT < 0. + os.Setenv(defaultListenPortEnvVar, "-1.0") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultListenPortEnvVar) + // DEFAULT_LISTEN_PORT > 65535. + os.Setenv(defaultListenPortEnvVar, "65536") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(defaultListenPortEnvVar) +} + +func TestDisableGoogleChromeFromEnv(t *testing.T) { + var ( + expected Config + result Config + err error + ) + // DISABLE_GOOGLE_CHROME correctly set. + os.Setenv(disableGoogleChromeEnvVar, "1") + expected = defaultConfig() + expected.disableGoogleChrome = true + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(disableGoogleChromeEnvVar) + os.Setenv(disableGoogleChromeEnvVar, "0") + expected = defaultConfig() + expected.disableGoogleChrome = false + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(disableGoogleChromeEnvVar) + // DISABLE_GOOGLE_CHROME wrongly set. + os.Setenv(disableGoogleChromeEnvVar, "foo") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(disableGoogleChromeEnvVar) +} + +func TestDisableUnoconvFromEnv(t *testing.T) { + var ( + expected Config + result Config + err error + ) + // DISABLE_UNOCONV correctly set. + os.Setenv(disableUnoconvEnvVar, "1") + expected = defaultConfig() + expected.disableUnoconv = true + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(disableUnoconvEnvVar) + os.Setenv(disableUnoconvEnvVar, "0") + expected = defaultConfig() + expected.disableUnoconv = false + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(disableUnoconvEnvVar) + // DISABLE_UNOCONV wrongly set. + os.Setenv(disableUnoconvEnvVar, "foo") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(disableUnoconvEnvVar) +} + +func TestLogLevelFromEnv(t *testing.T) { + var ( + expected Config + result Config + err error + ) + // LOG_LEVEL correctly set. + os.Setenv(logLevelEnvVar, "DEBUG") + expected = defaultConfig() + expected.logLevel = xlog.DebugLevel + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(logLevelEnvVar) + os.Setenv(logLevelEnvVar, "INFO") + expected = defaultConfig() + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(logLevelEnvVar) + os.Setenv(logLevelEnvVar, "ERROR") + expected = defaultConfig() + expected.logLevel = xlog.ErrorLevel + result, err = FromEnv() + assert.Nil(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(logLevelEnvVar) + // LOG_LEVEL wrongly set. + os.Setenv(logLevelEnvVar, "foo") + expected = defaultConfig() + result, err = FromEnv() + xerrortest.AssertError(t, err) + assert.Equal(t, expected, result) + os.Unsetenv(logLevelEnvVar) +} + +func TestGetters(t *testing.T) { + result := defaultConfig() + assert.Equal(t, result.maximumWaitTimeout, result.MaximumWaitTimeout()) + assert.Equal(t, result.maximumWaitDelay, result.MaximumWaitDelay()) + assert.Equal(t, result.maximumWebhookURLTimeout, result.MaximumWebhookURLTimeout()) + assert.Equal(t, result.defaultWaitTimeout, result.DefaultWaitTimeout()) + assert.Equal(t, result.defaultWebhookURLTimeout, result.DefaultWebhookURLTimeout()) + assert.Equal(t, result.defaultListenPort, result.DefaultListenPort()) + assert.Equal(t, result.disableGoogleChrome, result.DisableGoogleChrome()) + assert.Equal(t, result.disableUnoconv, result.DisableUnoconv()) + assert.Equal(t, result.logLevel, result.LogLevel()) +} diff --git a/internal/pkg/conf/doc.go b/internal/pkg/conf/doc.go new file mode 100644 index 00000000..352ce083 --- /dev/null +++ b/internal/pkg/conf/doc.go @@ -0,0 +1,3 @@ +// Package conf gathers all +// configuration data. +package conf diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go deleted file mode 100644 index 41be1df9..00000000 --- a/internal/pkg/config/config.go +++ /dev/null @@ -1,178 +0,0 @@ -package config - -import ( - "fmt" - "os" - "strconv" - - "github.com/sirupsen/logrus" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -const ( - defaultWaitTimeoutEnvVar string = "DEFAULT_WAIT_TIMEOUT" - defaultListenPortEnvVar string = "DEFAULT_LISTEN_PORT" - disableGoogleChromeEnvVar string = "DISABLE_GOOGLE_CHROME" - disableUnoconvEnvVar string = "DISABLE_UNOCONV" - logLevelEnvVar string = "LOG_LEVEL" -) - -// Config contains the application -// configuration. -type Config struct { - defaultWaitTimeout float64 - defaultListenPort string - enableChromeEndpoints bool - enableUnoconvEndpoints bool - logLevel logrus.Level -} - -func defaultConfig() *Config { - return &Config{ - defaultWaitTimeout: 10, - defaultListenPort: "3000", - enableChromeEndpoints: true, - enableUnoconvEndpoints: true, - logLevel: logrus.InfoLevel, - } -} - -// FromEnv fetches configuration -// from environment variables. -func FromEnv() (*Config, error) { - const op string = "config.FromEnv" - c := defaultConfig() - defaultWaitTimeout, err := defaultWaitTimeoutFromEnv(defaultWaitTimeoutEnvVar, c.DefaultWaitTimeout()) - c.defaultWaitTimeout = defaultWaitTimeout - if err != nil { - return c, &standarderror.Error{Op: op, Err: err} - } - defaultListenPort, err := defaultListenPortFromEnv(defaultListenPortEnvVar, c.DefaultListenPort()) - c.defaultListenPort = defaultListenPort - if err != nil { - return c, &standarderror.Error{Op: op, Err: err} - } - disableChromeEndpoints, err := boolFromEnv(disableGoogleChromeEnvVar, !c.EnableChromeEndpoints()) - c.enableChromeEndpoints = !disableChromeEndpoints - if err != nil { - return c, &standarderror.Error{Op: op, Err: err} - } - disableUnoconvEndpoints, err := boolFromEnv(disableUnoconvEnvVar, !c.EnableUnoconvEndpoints()) - c.enableUnoconvEndpoints = !disableUnoconvEndpoints - if err != nil { - return c, &standarderror.Error{Op: op, Err: err} - } - logLevel, err := logLevelFromEnv(logLevelEnvVar, c.LogLevel()) - c.logLevel = logLevel - if err != nil { - return c, &standarderror.Error{Op: op, Err: err} - } - return c, nil -} - -// DefaultWaitTimeout returns the default -// wait timeout from the configuration. -func (c *Config) DefaultWaitTimeout() float64 { - return c.defaultWaitTimeout -} - -// DefaultListenPort returns the default -// listen port from the configuration. -func (c *Config) DefaultListenPort() string { - return c.defaultListenPort -} - -// EnableChromeEndpoints returns true if -// Chrome endpoints are enabled in the -// configuration. -func (c *Config) EnableChromeEndpoints() bool { - return c.enableChromeEndpoints -} - -// EnableUnoconvEndpoints returns true if -// Unoconv endpoints are enabled in the -// configuration. -func (c *Config) EnableUnoconvEndpoints() bool { - return c.enableUnoconvEndpoints -} - -// LogLevel returns the logrus.Level from -// the configuration. -func (c *Config) LogLevel() logrus.Level { - return c.logLevel -} - -func defaultWaitTimeoutFromEnv(envVar string, defaultValue float64) (float64, error) { - const op string = "config.defaultWaitTimeoutFromEnv" - if v, ok := os.LookupEnv(envVar); ok { - waitTimeout, err := strconv.ParseFloat(v, 64) - if err != nil { - return defaultValue, &standarderror.Error{ - Code: standarderror.Invalid, - Message: fmt.Sprintf("'%s' is not a float, got '%s'", envVar, v), - Op: op, - } - } - return waitTimeout, nil - } - return defaultValue, nil -} - -func defaultListenPortFromEnv(envVar string, defaultValue string) (string, error) { - const op string = "config.defaultListenPortFromEnv" - if v, ok := os.LookupEnv(envVar); ok { - portAsUint, err := strconv.ParseUint(v, 10, 64) - if err != nil { - return defaultValue, &standarderror.Error{ - Code: standarderror.Invalid, - Message: fmt.Sprintf("'%s' is not a uint, got '%s'", envVar, v), - Op: op, - } - } - if portAsUint > 65535 { - return defaultValue, &standarderror.Error{ - Code: standarderror.Invalid, - Message: fmt.Sprintf("'%s' is not a uint < 65535, got '%d'", envVar, portAsUint), - Op: op, - } - } - return v, nil - } - return defaultValue, nil -} - -func boolFromEnv(envVar string, defaultValue bool) (bool, error) { - const op string = "config.boolFromEnv" - if v, ok := os.LookupEnv(envVar); ok { - if v != "1" && v != "0" { - return defaultValue, &standarderror.Error{ - Code: standarderror.Invalid, - Message: fmt.Sprintf("'%s' is not '0' or '1', got %s", envVar, v), - Op: op, - } - } - return v == "1", nil - } - return defaultValue, nil -} - -func logLevelFromEnv(envVar string, defaultValue logrus.Level) (logrus.Level, error) { - const op string = "config.logLevelFromEnv" - if v, ok := os.LookupEnv(envVar); ok { - switch v { - case "DEBUG": - return logrus.DebugLevel, nil - case "INFO": - return logrus.InfoLevel, nil - case "ERROR": - return logrus.ErrorLevel, nil - default: - return defaultValue, &standarderror.Error{ - Code: standarderror.Invalid, - Message: fmt.Sprintf("'%s' is not 'DEBUG', 'INFO' or 'ERROR', got '%s'", envVar, v), - Op: op, - } - } - } - return defaultValue, nil -} diff --git a/internal/pkg/config/config_test.go b/internal/pkg/config/config_test.go deleted file mode 100644 index 72efa520..00000000 --- a/internal/pkg/config/config_test.go +++ /dev/null @@ -1,123 +0,0 @@ -package config - -import ( - "os" - "testing" - - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" - "github.com/thecodingmachine/gotenberg/test" -) - -func TestDefaultWaitTimeout(t *testing.T) { - // should be OK. - config, err := FromEnv() - assert.Nil(t, err) - assert.Equal(t, 10.0, config.DefaultWaitTimeout()) - os.Setenv(defaultWaitTimeoutEnvVar, "1.5") - config, err = FromEnv() - assert.Nil(t, err) - assert.Equal(t, 1.5, config.DefaultWaitTimeout()) - // should failed. - os.Setenv(defaultWaitTimeoutEnvVar, "foo") - _, err = FromEnv() - assert.NotNil(t, err) - standardized := test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) - os.Unsetenv(defaultWaitTimeoutEnvVar) -} - -func TestDefaultListenPort(t *testing.T) { - // should be OK. - config, err := FromEnv() - assert.Nil(t, err) - assert.Equal(t, "3000", config.DefaultListenPort()) - os.Setenv(defaultListenPortEnvVar, "4000") - config, err = FromEnv() - assert.Nil(t, err) - assert.Equal(t, "4000", config.DefaultListenPort()) - // should failed. - os.Setenv(defaultListenPortEnvVar, "foo") - _, err = FromEnv() - assert.NotNil(t, err) - standardized := test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) - os.Setenv(defaultListenPortEnvVar, "100000000") - _, err = FromEnv() - assert.NotNil(t, err) - standardized = test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) - os.Unsetenv(defaultListenPortEnvVar) -} - -func TestEnableChromeEndpoints(t *testing.T) { - // should be OK. - config, err := FromEnv() - assert.Nil(t, err) - assert.Equal(t, true, config.EnableChromeEndpoints()) - os.Setenv(disableGoogleChromeEnvVar, "1") - config, err = FromEnv() - assert.Nil(t, err) - assert.Equal(t, false, config.EnableChromeEndpoints()) - os.Setenv(disableGoogleChromeEnvVar, "0") - config, err = FromEnv() - assert.Nil(t, err) - assert.Equal(t, true, config.EnableChromeEndpoints()) - // should failed. - os.Setenv(disableGoogleChromeEnvVar, "true") - _, err = FromEnv() - assert.NotNil(t, err) - standardized := test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) - os.Unsetenv(disableGoogleChromeEnvVar) -} - -func TestEnableUnoconvEndpoints(t *testing.T) { - // should be OK. - config, err := FromEnv() - assert.Nil(t, err) - assert.Equal(t, true, config.EnableUnoconvEndpoints()) - os.Setenv(disableUnoconvEnvVar, "1") - config, err = FromEnv() - assert.Nil(t, err) - assert.Equal(t, false, config.EnableUnoconvEndpoints()) - os.Setenv(disableUnoconvEnvVar, "0") - config, err = FromEnv() - assert.Nil(t, err) - assert.Equal(t, true, config.EnableUnoconvEndpoints()) - // should failed. - os.Setenv(disableUnoconvEnvVar, "true") - _, err = FromEnv() - assert.NotNil(t, err) - standardized := test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) - os.Unsetenv(disableUnoconvEnvVar) -} - -func TestLogLevel(t *testing.T) { - // should be OK. - config, err := FromEnv() - assert.Nil(t, err) - assert.Equal(t, logrus.InfoLevel, config.LogLevel()) - os.Setenv(logLevelEnvVar, "DEBUG") - config, err = FromEnv() - assert.Nil(t, err) - assert.Equal(t, logrus.DebugLevel, config.LogLevel()) - os.Setenv(logLevelEnvVar, "INFO") - config, err = FromEnv() - assert.Nil(t, err) - assert.Equal(t, logrus.InfoLevel, config.LogLevel()) - os.Setenv(logLevelEnvVar, "ERROR") - config, err = FromEnv() - assert.Nil(t, err) - assert.Equal(t, logrus.ErrorLevel, config.LogLevel()) - // should failed. - os.Setenv(logLevelEnvVar, "foo") - config, err = FromEnv() - assert.Equal(t, logrus.InfoLevel, config.LogLevel()) - assert.NotNil(t, err) - standardized := test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Invalid, standarderror.Code(standardized)) - os.Unsetenv(logLevelEnvVar) -} diff --git a/internal/pkg/config/doc.go b/internal/pkg/config/doc.go deleted file mode 100644 index 55b7416f..00000000 --- a/internal/pkg/config/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package config gathers all -// configuration data. -package config diff --git a/internal/pkg/logger/doc.go b/internal/pkg/logger/doc.go deleted file mode 100644 index b9fcafe6..00000000 --- a/internal/pkg/logger/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package logger defines a standard -// logger for the application. -package logger diff --git a/internal/pkg/logger/logger.go b/internal/pkg/logger/logger.go deleted file mode 100644 index ee24d8c3..00000000 --- a/internal/pkg/logger/logger.go +++ /dev/null @@ -1,63 +0,0 @@ -package logger - -import ( - "os" - - "github.com/mattn/go-isatty" - "github.com/sirupsen/logrus" -) - -// Logger enforces specific log message formats. -type Logger struct { - entry *logrus.Entry -} - -// New initializes the logger. -func New(level logrus.Level, trace string) *Logger { - l := logrus.New() - l.SetLevel(level) - if !isatty.IsTerminal(os.Stdout.Fd()) { - l.SetFormatter(&logrus.JSONFormatter{}) - } - return &Logger{ - entry: l.WithField("trace", trace), - } -} - -// WithFields creates a new logger with -// given fields. -func (l *Logger) WithFields(fields map[string]interface{}) *Logger { - return &Logger{ - entry: l.entry.WithFields(fields), - } -} - -// DebugfOp logs a debug message for given -// logical operation. -func (l *Logger) DebugfOp(op string, format string, args ...interface{}) { - l.entry.WithField("op", op).Debugf(format, args...) -} - -// InfofOp logs an info message for given -// logical operation. -func (l *Logger) InfofOp(op string, format string, args ...interface{}) { - l.entry.WithField("op", op).Infof(format, args...) -} - -// ErrorOp logs an error for given -// logical operation. -func (l *Logger) ErrorOp(op string, err error) { - l.entry.WithField("op", op).Error(err.Error()) -} - -// ErrorfOp logs an error message for given -// logical operation. -func (l *Logger) ErrorfOp(op string, message string) { - l.entry.WithField("op", op).Error(message) -} - -// FatalOp logs an error message for given -// logical operation. -func (l *Logger) FatalOp(op string, err error) { - l.entry.WithField("op", op).Error(err.Error()) -} diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index 52a639c9..a111e456 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -5,45 +5,72 @@ import ( "time" "github.com/mafredri/cdp/devtool" - "github.com/thecodingmachine/gotenberg/internal/pkg/logger" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) -const chromeWarmupTime time.Duration = 10 * time.Second - -type chrome struct { - manager *processManager +type chromeProcess struct { + logger xlog.Logger } -// NewChrome returns a Google Chrome +// NewChromeProcess returns a Google Chrome // headless process. -func NewChrome(logger *logger.Logger) Process { - return &chrome{ - manager: &processManager{logger: logger}, +func NewChromeProcess(logger xlog.Logger) Process { + return chromeProcess{ + logger: logger, } } -func (p *chrome) Fullname() string { +func (p chromeProcess) Fullname() string { return "Google Chrome headless" } -func (p *chrome) Start() error { - const op string = "pm2.chrome.Start" - if err := p.manager.start(p); err != nil { - return &standarderror.Error{Op: op, Err: err} +func (p chromeProcess) Start() error { + const op string = "pm2.chromeProcess.Start" + if err := start(p.logger, p); err != nil { + return xerror.New(op, err) } return nil } -func (p *chrome) Shutdown() error { - const op string = "pm2.chrome.Shutdown" - if err := p.manager.shutdown(p); err != nil { - return &standarderror.Error{Op: op, Err: err} +func (p chromeProcess) IsViable() bool { + const op string = "pm2.chromeProcess.IsViable" + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + p.logger.DebugfOp( + op, + "checking '%s' viability via endpoint '%s'", + p.Fullname(), + "http://localhost:9222/json/version", + ) + v, err := devtool.New("http://localhost:9222").Version(ctx) + if err != nil { + p.logger.ErrorfOp( + op, + "'%s' is not viable as endpoint returned '%v'", + p.Fullname(), + err, + ) + return false + } + p.logger.DebugfOp( + op, + "'%s' is viable as endpoint returned '%v'", + p.Fullname(), + v, + ) + return true +} + +func (p chromeProcess) Stop() error { + const op string = "pm2.chromeProcess.Stop" + if err := stop(p.logger, p); err != nil { + return xerror.New(op, err) } return nil } -func (p *chrome) args() []string { +func (p chromeProcess) args() []string { return []string{ "--no-sandbox", "--headless", @@ -62,47 +89,25 @@ func (p *chrome) args() []string { } } -func (p *chrome) name() string { +func (p chromeProcess) binary() string { return "google-chrome-stable" } -func (p *chrome) viable() bool { - const op string = "pm2.chrome.viable" - // check if Google Chrome is correctly running. - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - p.manager.logger.DebugfOp( - op, - "checking liveness via debug version endpoint http://localhost:9222/json/version", +func (p chromeProcess) warmup() { + const ( + op string = "pm2.chromeProcess.warmup" + warmupTime time.Duration = 10 * time.Second ) - v, err := devtool.New("http://localhost:9222").Version(ctx) - if err != nil { - p.manager.logger.DebugfOp( - op, - "debug version endpoint returned error: %v", - err, - ) - return false - } - p.manager.logger.DebugfOp( + p.logger.DebugfOp( op, - "debug version endpoint returned version info: %+v", - *v, + "waiting '%v' for allowing '%s' to warmup", + warmupTime, + p.Fullname(), ) - return true -} - -func (p *chrome) warmup() { - const op string = "pm2.chrome.warmup" - p.manager.logger.DebugfOp( - op, - "allowing %v to startup", - chromeWarmupTime, - ) - time.Sleep(chromeWarmupTime) + time.Sleep(warmupTime) } // Compile-time checks to ensure type implements desired interfaces. var ( - _ = Process(new(chrome)) + _ = Process(new(chromeProcess)) ) diff --git a/internal/pkg/pm2/chrome_test.go b/internal/pkg/pm2/chrome_test.go deleted file mode 100644 index 2fea8458..00000000 --- a/internal/pkg/pm2/chrome_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package pm2 - -import ( - "testing" - - "github.com/stretchr/testify/require" - "github.com/thecodingmachine/gotenberg/test" -) - -func TestChromeStart(t *testing.T) { - p := NewChrome(test.CreateTestLogger()) - err := p.Start() - require.Nil(t, err) -} - -func TestChromeShutdown(t *testing.T) { - p := NewChrome(test.CreateTestLogger()) - err := p.Shutdown() - require.Nil(t, err) -} diff --git a/internal/pkg/pm2/doc.go b/internal/pkg/pm2/doc.go index 879a203c..d64ac2a0 100644 --- a/internal/pkg/pm2/doc.go +++ b/internal/pkg/pm2/doc.go @@ -1,6 +1,6 @@ /* Package pm2 facilitates starting external -processes on which our API depends. +processes on which our application depends. For instance, it may start Google Chrome headless and unoconv listener with PM2. diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go index 7f1113f0..6338ecb5 100644 --- a/internal/pkg/pm2/pm2.go +++ b/internal/pkg/pm2/pm2.go @@ -1,124 +1,102 @@ package pm2 import ( - "bufio" "fmt" - "io" - "os/exec" - "strings" - "github.com/thecodingmachine/gotenberg/internal/pkg/logger" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -const ( - stoppedState int32 = iota - runningState - errorState + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) // Process is a type that can start or -// shutdown a process with PM2. +// stop a process with PM2. type Process interface { Fullname() string Start() error - Shutdown() error + IsViable() bool + Stop() error args() []string - name() string - viable() bool + binary() string warmup() } -type processManager struct { - heuristicState int32 - logger *logger.Logger -} +type pm2Command string -func (m *processManager) start(p Process) error { - const op string = "pm2.start" - if err := m.pm2(p, "start"); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - p.warmup() - if !p.viable() { - attempts := 0 - for attempts < 5 && !p.viable() { - if err := m.pm2(p, "restart"); err != nil { - m.heuristicState = errorState - return &standarderror.Error{Op: op, Err: err} - } - p.warmup() - attempts++ +const ( + startCommand pm2Command = "start" + restartCommand pm2Command = "restart" + stopCommand pm2Command = "stop" + logsCommand pm2Command = "logs" +) + +func start(logger xlog.Logger, process Process) error { + const ( + op string = "pm2.start" + maximumAttempts int = 3 + ) + resolver := func() error { + // first, we try to start the process. + if err := run(logger, startCommand, process); err != nil { + return err } - if !p.viable() { - m.heuristicState = errorState - return &standarderror.Error{ - Op: op, - Message: fmt.Sprintf("failed to launch %s", p.Fullname()), + // we wait the process to be ready. + process.warmup() + // if the process failed to start correctly, + // we have to restart it. + if !process.IsViable() { + attempts := 0 + for attempts < maximumAttempts && !process.IsViable() { + if err := run(logger, restartCommand, process); err != nil { + return err + } + process.warmup() + attempts++ + } + if !process.IsViable() { + return fmt.Errorf("failed to start '%s'", process.Fullname()) } } - } - m.heuristicState = runningState - return nil -} - -func (m *processManager) shutdown(p Process) error { - const op string = "pm2.shutdown" - if m.heuristicState != runningState { + // the process is viable, let's log its + // output. + if err := run(logger, logsCommand, process); err != nil { + return err + } return nil } - if err := m.pm2(p, "stop"); err != nil { - m.heuristicState = errorState - return &standarderror.Error{Op: op, Err: err} + if err := resolver(); err != nil { + return xerror.New(op, err) } - m.heuristicState = stoppedState return nil } -func (m *processManager) pm2(p Process, cmdName string) error { - const op string = "pm2.pm2" - cmdArgs := []string{ - cmdName, - p.name(), - } - if cmdName == "start" { - cmdArgs = append(cmdArgs, "--interpreter=none", "--") - cmdArgs = append(cmdArgs, p.args()...) - } - cmd := exec.Command( - "pm2", - cmdArgs..., - ) - m.logger.DebugfOp(op, "executing command: %s", strings.Join(cmd.Args, " ")) - processStdOut, err := cmd.StdoutPipe() - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - processStdErr, err := cmd.StderrPipe() - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - readFromPipe := func(outputType string, reader io.ReadCloser) { - readFromPipeOp := fmt.Sprintf("pm2.%s.%s", p.name(), outputType) - r := bufio.NewReader(reader) - defer reader.Close() // nolint: errcheck - for { - line, _, err := r.ReadLine() - if err != nil { - if err != io.EOF { - m.logger.ErrorOp(readFromPipeOp, err) - } - break - } - if len(line) != 0 { - m.logger.DebugfOp(readFromPipeOp, string(line)) - } - } - } - go readFromPipe("stdout", processStdOut) - go readFromPipe("stderr", processStdErr) - if err := cmd.Start(); err != nil { - return &standarderror.Error{Op: op, Err: err} +func stop(logger xlog.Logger, process Process) error { + const op string = "pm2.stop" + if err := run(logger, stopCommand, process); err != nil { + return xerror.New(op, err) + } + return nil +} + +func run(logger xlog.Logger, pm2Cmd pm2Command, process Process) error { + const op string = "pm2.run" + resolver := func() error { + args := []string{ + string(pm2Cmd), + process.binary(), + } + if pm2Cmd == startCommand { + args = append(args, "--interpreter=none", "--") + args = append(args, process.args()...) + } + cmd, err := xexec.Command(logger, "pm2", args...) + if err != nil { + return err + } + xexec.LogBeforeExecute(logger, cmd) + return cmd.Start() + } + if err := resolver(); err != nil { + return xerror.New(op, err) } return nil } diff --git a/internal/pkg/pm2/unoconv.go b/internal/pkg/pm2/unoconv.go index 6c67b3f6..05cd5b06 100644 --- a/internal/pkg/pm2/unoconv.go +++ b/internal/pkg/pm2/unoconv.go @@ -3,73 +3,75 @@ package pm2 import ( "time" - "github.com/thecodingmachine/gotenberg/internal/pkg/logger" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) -const unoconvWarmupTime time.Duration = 5 * time.Second - -type unoconv struct { - manager *processManager +type unoconvProcess struct { + logger xlog.Logger } -// NewUnoconv returns a unoconv listener +// NewUnoconvProcess returns a unoconv listener // process. -func NewUnoconv(logger *logger.Logger) Process { - return &unoconv{ - manager: &processManager{logger: logger}, +func NewUnoconvProcess(logger xlog.Logger) Process { + return unoconvProcess{ + logger: logger, } } -func (p *unoconv) Fullname() string { +func (p unoconvProcess) Fullname() string { return "unoconv listener" } -func (p *unoconv) Start() error { - const op string = "pm2.unoconv.Start" - if err := p.manager.start(p); err != nil { - return &standarderror.Error{Op: op, Err: err} +func (p unoconvProcess) Start() error { + const op string = "pm2.unoconvProcess.Start" + if err := start(p.logger, p); err != nil { + return xerror.New(op, err) } return nil } -func (p *unoconv) Shutdown() error { - const op string = "pm2.unoconv.Shutdown" - if err := p.manager.shutdown(p); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - return nil -} - -func (p *unoconv) args() []string { - return []string{ - "--listener", - "--verbose", - } -} - -func (p *unoconv) name() string { - return "unoconv" -} - -func (p *unoconv) viable() bool { +func (p unoconvProcess) IsViable() bool { // TODO find a way to check if // the unoconv listener // is correctly started? return true } -func (p *unoconv) warmup() { - const op string = "pm2.unoconv.warmup" - p.manager.logger.DebugfOp( - op, - "allowing %v to startup", - unoconvWarmupTime, +func (p unoconvProcess) Stop() error { + const op string = "pm2.unoconvProcess.Stop" + if err := stop(p.logger, p); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (p unoconvProcess) args() []string { + return []string{ + "--listener", + "--verbose", + } +} + +func (p unoconvProcess) binary() string { + return "unoconv" +} + +func (p unoconvProcess) warmup() { + const ( + op string = "pm2.unoconvProcess.warmup" + warmupTime time.Duration = 3 * time.Second ) - time.Sleep(unoconvWarmupTime) + p.logger.DebugfOp( + op, + "waiting '%v' for allowing '%s' to warmup", + warmupTime, + p.Fullname(), + ) + time.Sleep(warmupTime) } // Compile-time checks to ensure type implements desired interfaces. var ( - _ = Process(new(unoconv)) + _ = Process(new(unoconvProcess)) ) diff --git a/internal/pkg/pm2/unoconv_test.go b/internal/pkg/pm2/unoconv_test.go deleted file mode 100644 index 4c5fb8bf..00000000 --- a/internal/pkg/pm2/unoconv_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package pm2 - -import ( - "testing" - - "github.com/stretchr/testify/require" - "github.com/thecodingmachine/gotenberg/test" -) - -func TestUnoconvStart(t *testing.T) { - p := NewUnoconv(test.CreateTestLogger()) - err := p.Start() - require.Nil(t, err) -} - -func TestUnoconvShutdown(t *testing.T) { - p := NewUnoconv(test.CreateTestLogger()) - err := p.Shutdown() - require.Nil(t, err) -} diff --git a/internal/pkg/printer/chrome.go b/internal/pkg/printer/chrome.go index 968030dd..8976fea6 100644 --- a/internal/pkg/printer/chrome.go +++ b/internal/pkg/printer/chrome.go @@ -12,19 +12,22 @@ import ( "github.com/mafredri/cdp/protocol/page" "github.com/mafredri/cdp/protocol/target" "github.com/mafredri/cdp/rpcc" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" - "github.com/thecodingmachine/gotenberg/internal/pkg/timeout" + "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" "golang.org/x/sync/errgroup" ) -type chrome struct { - url string - opts *ChromeOptions +type chromePrinter struct { + logger xlog.Logger + url string + opts ChromePrinterOptions } -// ChromeOptions helps customizing the +// ChromePrinterOptions helps customizing the // Google Chrome printer behaviour. -type ChromeOptions struct { +type ChromePrinterOptions struct { WaitTimeout float64 WaitDelay float64 HeaderHTML string @@ -38,26 +41,27 @@ type ChromeOptions struct { Landscape bool } -func (p *chrome) Print(destination string) error { - const op string = "printer.chrome.Print" - ctx, cancel := timeout.Context(p.opts.WaitTimeout + p.opts.WaitDelay) +func (p chromePrinter) Print(destination string) error { + const op string = "printer.chromePrinter.Print" + logOptions(p.logger, p.opts) + ctx, cancel := xcontext.WithTimeout(p.logger, p.opts.WaitTimeout+p.opts.WaitDelay) defer cancel() resolver := func() error { devt, err := devtool.New("http://localhost:9222").Version(ctx) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return err } // connect to WebSocket URL (page) that speaks the Chrome DevTools Protocol. devtConn, err := rpcc.DialContext(ctx, devt.WebSocketDebuggerURL) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return err } defer devtConn.Close() // nolint: errcheck // create a new CDP Client that uses conn. devtClient := cdp.NewClient(devtConn) newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return err } // create a new blank target with the new browser context. createTargetArgs := target. @@ -65,13 +69,13 @@ func (p *chrome) Print(destination string) error { SetBrowserContextID(newContextTarget.BrowserContextID) newTarget, err := devtClient.Target.CreateTarget(ctx, createTargetArgs) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return err } // connect the client to the new target. newTargetWsURL := fmt.Sprintf("ws://127.0.0.1:9222/devtools/page/%s", newTarget.TargetID) newContextConn, err := rpcc.DialContext(ctx, newTargetWsURL) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return err } defer newContextConn.Close() // nolint: errcheck // create a new CDP Client that uses newContextConn. @@ -86,10 +90,10 @@ func (p *chrome) Print(destination string) error { func() error { return targetClient.Page.Enable(ctx) }, func() error { return targetClient.Runtime.Enable(ctx) }, ); err != nil { - return &standarderror.Error{Op: op, Err: err} + return err } if err := p.navigate(ctx, targetClient); err != nil { - return &standarderror.Error{Op: op, Err: err} + return err } print, err := targetClient.Page.PrintToPDF( ctx, @@ -107,58 +111,67 @@ func (p *chrome) Print(destination string) error { SetPrintBackground(true), ) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return err } if err := ioutil.WriteFile(destination, print.Data, 0644); err != nil { - return &standarderror.Error{Op: op, Err: err} + return err } return nil } if err := resolver(); err != nil { - return timeout.Err(ctx, err) + return xcontext.MustHandleError( + ctx, + xerror.New(op, err), + ) } return nil } -func (p *chrome) navigate(ctx context.Context, client *cdp.Client) error { - const op string = "printer.chrome.navigate" - // make sure Page events are enabled. - if err := client.Page.Enable(ctx); err != nil { - return &standarderror.Error{Op: op, Err: err} +func (p chromePrinter) navigate(ctx context.Context, client *cdp.Client) error { + const op string = "printer.chromePrinter.navigate" + resolver := func() error { + // make sure Page events are enabled. + if err := client.Page.Enable(ctx); err != nil { + return err + } + // make sure Network events are enabled. + if err := client.Network.Enable(ctx, nil); err != nil { + return err + } + // create all clients for events. + domContentEventFired, err := client.Page.DOMContentEventFired(ctx) + if err != nil { + return err + } + defer domContentEventFired.Close() // nolint: errcheck + loadEventFired, err := client.Page.LoadEventFired(ctx) + if err != nil { + return err + } + defer loadEventFired.Close() // nolint: errcheck + loadingFinished, err := client.Network.LoadingFinished(ctx) + if err != nil { + return err + } + defer loadingFinished.Close() // nolint: errcheck + if _, err := client.Page.Navigate(ctx, page.NewNavigateArgs(p.url)); err != nil { + return err + } + if err := runBatch( + // wait for all events. + func() error { _, err := domContentEventFired.Recv(); return err }, + func() error { _, err := loadEventFired.Recv(); return err }, + func() error { _, err := loadingFinished.Recv(); return err }, + ); err != nil { + return err + } + // wait for a given amount of time (useful for javascript delay). + time.Sleep(xtime.Duration(p.opts.WaitDelay)) + return nil } - // make sure Network events are enabled. - if err := client.Network.Enable(ctx, nil); err != nil { - return &standarderror.Error{Op: op, Err: err} + if err := resolver(); err != nil { + return xerror.New(op, err) } - // create all clients for events. - domContentEventFired, err := client.Page.DOMContentEventFired(ctx) - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - defer domContentEventFired.Close() // nolint: errcheck - loadEventFired, err := client.Page.LoadEventFired(ctx) - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - defer loadEventFired.Close() // nolint: errcheck - loadingFinished, err := client.Network.LoadingFinished(ctx) - if err != nil { - return &standarderror.Error{Op: op, Err: err} - } - defer loadingFinished.Close() // nolint: errcheck - if _, err := client.Page.Navigate(ctx, page.NewNavigateArgs(p.url)); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - if err := runBatch( - // wait for all events. - func() error { _, err := domContentEventFired.Recv(); return err }, - func() error { _, err := loadEventFired.Recv(); return err }, - func() error { _, err := loadingFinished.Recv(); return err }, - ); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - // wait for a given amount of time (useful for javascript delay). - time.Sleep(timeout.Duration(p.opts.WaitDelay)) return nil } @@ -174,5 +187,5 @@ func runBatch(fn ...func() error) error { // Compile-time checks to ensure type implements desired interfaces. var ( - _ = Printer(new(chrome)) + _ = Printer(new(chromePrinter)) ) diff --git a/internal/pkg/printer/doc.go b/internal/pkg/printer/doc.go index 4b2ce259..d36329e3 100644 --- a/internal/pkg/printer/doc.go +++ b/internal/pkg/printer/doc.go @@ -1,5 +1,3 @@ -/* -Package printer contains structs which convert -a specific file type to PDF. -*/ +// Package printer helps converting +// a specific file type to PDF. package printer diff --git a/internal/pkg/printer/html.go b/internal/pkg/printer/html.go index 026c0f24..edad5ebf 100644 --- a/internal/pkg/printer/html.go +++ b/internal/pkg/printer/html.go @@ -2,13 +2,17 @@ package printer import ( "fmt" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) -// NewHTML returns an HTML printer. -func NewHTML(fpath string, opts *ChromeOptions) Printer { +// NewHTMLPrinter returns a Printer which +// is able to convert an HTML file to PDF. +func NewHTMLPrinter(logger xlog.Logger, fpath string, opts ChromePrinterOptions) Printer { URL := fmt.Sprintf("file://%s", fpath) - return &chrome{ - url: URL, - opts: opts, + return chromePrinter{ + logger: logger, + url: URL, + opts: opts, } } diff --git a/internal/pkg/printer/markdown.go b/internal/pkg/printer/markdown.go index 199ebeea..2332db4d 100644 --- a/internal/pkg/printer/markdown.go +++ b/internal/pkg/printer/markdown.go @@ -7,37 +7,46 @@ import ( "io/ioutil" "path/filepath" - "github.com/labstack/gommon/random" "github.com/microcosm-cc/bluemonday" "github.com/russross/blackfriday/v2" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" ) -// NewMarkdown returns a Markdown printer. -func NewMarkdown(fpath string, opts *ChromeOptions) (Printer, error) { - const op string = "printer.NewMarkdown" - tmpl, err := template. - New(filepath.Base(fpath)). - Funcs(template.FuncMap{"toHTML": markdownToHTML}). - ParseFiles(fpath) +// NewMarkdownPrinter returns a Printer which +// is able to convert Markdown files to PDF. +func NewMarkdownPrinter(logger xlog.Logger, fpath string, opts ChromePrinterOptions) (Printer, error) { + const op string = "printer.NewMarkdownPrinter" + resolver := func() (string, error) { + tmpl, err := template. + New(filepath.Base(fpath)). + Funcs(template.FuncMap{"toHTML": markdownToHTML}). + ParseFiles(fpath) + if err != nil { + return "", err + } + dirPath := filepath.Dir(fpath) + data := &templateData{DirPath: dirPath} + var buffer bytes.Buffer + if err := tmpl.Execute(&buffer, data); err != nil { + return "", err + } + baseFilename := xrand.Get() + dst := fmt.Sprintf("%s/%s.html", dirPath, baseFilename) + if err := ioutil.WriteFile(dst, buffer.Bytes(), 0644); err != nil { + return "", err + } + return fmt.Sprintf("file://%s", dst), nil + } + URL, err := resolver() if err != nil { - return nil, &standarderror.Error{Op: op, Err: err} + return chromePrinter{}, xerror.New(op, err) } - dirPath := filepath.Dir(fpath) - data := &templateData{DirPath: dirPath} - var buffer bytes.Buffer - if err := tmpl.Execute(&buffer, data); err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - baseFilename := random.String(32) - dst := fmt.Sprintf("%s/%s.html", dirPath, baseFilename) - if err := ioutil.WriteFile(dst, buffer.Bytes(), 0644); err != nil { - return nil, &standarderror.Error{Op: op, Err: err} - } - URL := fmt.Sprintf("file://%s", dst) - return &chrome{ - url: URL, - opts: opts, + return chromePrinter{ + logger: logger, + url: URL, + opts: opts, }, nil } @@ -50,7 +59,7 @@ func markdownToHTML(dirPath, filename string) (template.HTML, error) { fpath := fmt.Sprintf("%s/%s", dirPath, filename) b, err := ioutil.ReadFile(fpath) if err != nil { - return "", &standarderror.Error{Op: op, Err: err} + return "", xerror.New(op, err) } unsafe := blackfriday.Run(b) content := bluemonday.UGCPolicy().SanitizeBytes(unsafe) diff --git a/internal/pkg/printer/merge.go b/internal/pkg/printer/merge.go index 4bf5e2e5..fd350f38 100644 --- a/internal/pkg/printer/merge.go +++ b/internal/pkg/printer/merge.go @@ -2,57 +2,71 @@ package printer import ( "context" - "os/exec" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" - "github.com/thecodingmachine/gotenberg/internal/pkg/timeout" + "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) -type merge struct { +type mergePrinter struct { ctx context.Context + logger xlog.Logger fpaths []string - opts *MergeOptions + opts MergePrinterOptions } -// MergeOptions helps customizing the -// merge printer behaviour. -type MergeOptions struct { +// MergePrinterOptions helps customizing the +// merge Printer behaviour. +type MergePrinterOptions struct { WaitTimeout float64 } -// NewMerge returns a merge printer. -func NewMerge(fpaths []string, opts *MergeOptions) Printer { - return &merge{ +// NewMergePrinter returns a Printer which +// is able to merge PDFs. +func NewMergePrinter(logger xlog.Logger, fpaths []string, opts MergePrinterOptions) Printer { + return mergePrinter{ + logger: logger, fpaths: fpaths, opts: opts, } } -func (p *merge) Print(destination string) error { - const op string = "printer.merge.Print" +func (p mergePrinter) Print(destination string) error { + const op string = "printer.mergePrinter.Print" + logOptions(p.logger, p.opts) + /* + context.Context may be providen from + an officePrinter which needs to merge + its result files. + */ if p.ctx == nil { - ctx, cancel := timeout.Context(p.opts.WaitTimeout) + ctx, cancel := xcontext.WithTimeout(p.logger, p.opts.WaitTimeout) defer cancel() p.ctx = ctx } + p.logger.DebugfOp(op, "merging '%v'...", p.fpaths) resolver := func() error { - var cmdArgs []string - cmdArgs = append(cmdArgs, p.fpaths...) - cmdArgs = append(cmdArgs, "cat", "output", destination) - cmd := exec.CommandContext(p.ctx, "pdftk", cmdArgs...) - _, err := cmd.Output() + var args []string + args = append(args, p.fpaths...) + args = append(args, "cat", "output", destination) + cmd, err := xexec.CommandContext(p.ctx, p.logger, "pdftk", args...) if err != nil { - return &standarderror.Error{Op: op, Err: err} + return err } - return nil + xexec.LogBeforeExecute(p.logger, cmd) + return cmd.Run() } if err := resolver(); err != nil { - return timeout.Err(p.ctx, err) + return xcontext.MustHandleError( + p.ctx, + xerror.New(op, err), + ) } return nil } // Compile-time checks to ensure type implements desired interfaces. var ( - _ = Printer(new(merge)) + _ = Printer(new(mergePrinter)) ) diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index d7a9520f..9ed66c0e 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -4,67 +4,75 @@ import ( "context" "fmt" "os" - "os/exec" "path/filepath" "sync" - "github.com/labstack/gommon/random" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" - "github.com/thecodingmachine/gotenberg/internal/pkg/timeout" + "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" ) -type office struct { +type officePrinter struct { + logger xlog.Logger fpaths []string - opts *OfficeOptions + opts OfficePrinterOptions } -// OfficeOptions helps customizing the -// Office printer behaviour. -type OfficeOptions struct { +// OfficePrinterOptions helps customizing the +// Office Printer behaviour. +type OfficePrinterOptions struct { WaitTimeout float64 Landscape bool } -// NewOffice returns an Office printer. -func NewOffice(fpaths []string, opts *OfficeOptions) Printer { - return &office{ +// NewOfficePrinter returns a Printer which +// is able to convert Office documents to PDF. +func NewOfficePrinter(logger xlog.Logger, fpaths []string, opts OfficePrinterOptions) Printer { + return officePrinter{ + logger: logger, fpaths: fpaths, opts: opts, } } -func (p *office) Print(destination string) error { - const op string = "printer.office.Print" - ctx, cancel := timeout.Context(p.opts.WaitTimeout) +func (p officePrinter) Print(destination string) error { + const op string = "printer.officePrinter.Print" + logOptions(p.logger, p.opts) + ctx, cancel := xcontext.WithTimeout(p.logger, p.opts.WaitTimeout) defer cancel() - fpaths := make([]string, len(p.fpaths)) resolver := func() error { + fpaths := make([]string, len(p.fpaths)) dirPath := filepath.Dir(destination) for i, fpath := range p.fpaths { - baseFilename := random.String(32) + baseFilename := xrand.Get() tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) - if err := unoconv(ctx, fpath, tmpDest, p.opts); err != nil { - return &standarderror.Error{Op: op, Err: err} + p.logger.DebugfOp(op, "converting '%s' to PDF...", fpath) + if err := unoconv(ctx, p.logger, fpath, tmpDest, p.opts); err != nil { + return err } + p.logger.DebugfOp(op, "'%s.pdf' created", baseFilename) fpaths[i] = tmpDest } - return nil + if len(fpaths) == 1 { + p.logger.DebugOp(op, "only one PDF created, nothing to merge") + if err := os.Rename(fpaths[0], destination); err != nil { + return err + } + return nil + } + m := mergePrinter{ + ctx: ctx, + fpaths: fpaths, + } + return m.Print(destination) } if err := resolver(); err != nil { - return timeout.Err(ctx, err) - } - if len(fpaths) == 1 { - if err := os.Rename(fpaths[0], destination); err != nil { - return &standarderror.Error{Op: op, Err: err} - } - return nil - } - m := &merge{ - ctx: ctx, - fpaths: fpaths, - } - if err := m.Print(destination); err != nil { - return &standarderror.Error{Op: op, Err: err} + return xcontext.MustHandleError( + ctx, + xerror.New(op, err), + ) } return nil } @@ -72,31 +80,41 @@ func (p *office) Print(destination string) error { // nolint: gochecknoglobals var mu sync.Mutex -func unoconv(ctx context.Context, fpath, destination string, opts *OfficeOptions) error { +func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, opts OfficePrinterOptions) error { const op string = "printer.unoconv" + // TODO check if timeout while waiting for the lock. + logger.DebugOp(op, "waiting lock to be released...") mu.Lock() defer mu.Unlock() - cmdArgs := []string{ - "--format", - "pdf", + logger.DebugOp(op, "lock released") + resolver := func() error { + args := []string{ + "--format", + "pdf", + } + if opts.Landscape { + args = append(args, "--printer", "PaperOrientation=landscape") + } + args = append(args, "--output", destination, fpath) + cmd, err := xexec.CommandContext( + ctx, + logger, + "unoconv", + args..., + ) + if err != nil { + return err + } + xexec.LogBeforeExecute(logger, cmd) + return cmd.Run() } - if opts.Landscape { - cmdArgs = append(cmdArgs, "--printer", "PaperOrientation=landscape") - } - cmdArgs = append(cmdArgs, "--output", destination, fpath) - cmd := exec.CommandContext( - ctx, - "unoconv", - cmdArgs..., - ) - _, err := cmd.Output() - if err != nil { - return &standarderror.Error{Op: op, Err: err} + if err := resolver(); err != nil { + return xerror.New(op, err) } return nil } // Compile-time checks to ensure type implements desired interfaces. var ( - _ = Printer(new(office)) + _ = Printer(new(officePrinter)) ) diff --git a/internal/pkg/printer/printer.go b/internal/pkg/printer/printer.go index e1e72497..de800bdf 100644 --- a/internal/pkg/printer/printer.go +++ b/internal/pkg/printer/printer.go @@ -1,7 +1,16 @@ package printer +import ( + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + // Printer is a type that can create a PDF file from a source. // The source is defined in the underlying implementation. type Printer interface { Print(destination string) error } + +func logOptions(logger xlog.Logger, opts interface{}) { + const op string = "printer.logOptions" + logger.DebugfOp(op, "options: %+v", opts) +} diff --git a/internal/pkg/printer/url.go b/internal/pkg/printer/url.go index c31a92c0..191fb93b 100644 --- a/internal/pkg/printer/url.go +++ b/internal/pkg/printer/url.go @@ -1,9 +1,15 @@ package printer -// NewURL returns a URL printer. -func NewURL(url string, opts *ChromeOptions) Printer { - return &chrome{ - url: url, - opts: opts, +import ( + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +// NewURLPrinter returns a Printer which +// is able to convert a URL to PDF. +func NewURLPrinter(logger xlog.Logger, url string, opts ChromePrinterOptions) Printer { + return chromePrinter{ + logger: logger, + url: url, + opts: opts, } } diff --git a/internal/pkg/random/doc.go b/internal/pkg/random/doc.go deleted file mode 100644 index d79456c1..00000000 --- a/internal/pkg/random/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package random helps generating -// a random string. -package random diff --git a/internal/pkg/standarderror/doc.go b/internal/pkg/standarderror/doc.go deleted file mode 100644 index b932abe3..00000000 --- a/internal/pkg/standarderror/doc.go +++ /dev/null @@ -1,7 +0,0 @@ -/* -Package standarderror helps standardizing -the errors in the application. - -Credits: https://middlemost.com/failure-is-your-domain/ -*/ -package standarderror diff --git a/internal/pkg/standarderror/standarderror.go b/internal/pkg/standarderror/standarderror.go deleted file mode 100644 index d39cc2f0..00000000 --- a/internal/pkg/standarderror/standarderror.go +++ /dev/null @@ -1,108 +0,0 @@ -package standarderror - -import ( - "bytes" - "fmt" -) - -const ( - // Internal is a code - // for internal errors. - Internal = "internal" - // Invalid is a code - // for validation errors. - Invalid = "invalid" - // Timeout is a code - // for timeout errors. - Timeout = "timeout" -) - -// Error defines a standard application -// error. -type Error struct { - // Code is a machine-readable - // error code. - Code string - // Message is a human-readable - // message. - Message string - // Op is a logical operation. - Op string - // Err is a nested error. - Err error -} - -// Error returns the string representation of the error message. -func (err *Error) Error() string { - var buf bytes.Buffer - // if wrapping an error, print its Error() message. - // Otherwise print the error code & message. - if err.Err != nil { - buf.WriteString(err.Err.Error()) - } else { - if err.Code != "" { - fmt.Fprintf(&buf, "<%s> ", err.Code) - } - buf.WriteString(err.Message) - } - return buf.String() -} - -// Code returns the code of the root error, if available. -// Otherwise returns Internal. -func Code(err error) string { - if err == nil { - return "" - } - e, ok := err.(*Error) - if ok && e.Code != "" { - return e.Code - } - if ok && e.Err != nil { - return Code(e.Err) - } - return Internal -} - -const defaultMessage string = "an internal error has occurred: please contact technical support" - -// Message returns the human-readable message of the error, if available. -// Otherwise returns a generic error message. -func Message(err error) string { - if err == nil { - return "" - } - e, ok := err.(*Error) - if ok && e.Message != "" { - return e.Message - } - if ok && e.Err != nil { - return Message(e.Err) - } - return defaultMessage -} - -// Op returns the logical operation of the error, if available. -// Otherwise returns an empty string. -func Op(err error) string { - if err == nil { - return "" - } - e, ok := err.(*Error) - if !ok { - return "" - } - var buf bytes.Buffer - if e.Op != "" { - fmt.Fprintf(&buf, "%s", e.Op) - } - if nestedOp := Op(e.Err); nestedOp != "" { - fmt.Fprintf(&buf, ": %s", nestedOp) - } - return buf.String() -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = error(new(Error)) -) diff --git a/internal/pkg/standarderror/standarderror_test.go b/internal/pkg/standarderror/standarderror_test.go deleted file mode 100644 index eecd5631..00000000 --- a/internal/pkg/standarderror/standarderror_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package standarderror - -import ( - "errors" - "testing" - - "github.com/stretchr/testify/assert" -) - -func scenario1() error { - rootErr := errors.New("root error") - nestedErr := &Error{ - Code: Invalid, - Op: "bar", - Message: "nested error", - Err: rootErr, - } - err := &Error{ - Op: "foo", - Err: nestedErr, - } - return err -} - -func scenario2() error { - nestedErr := &Error{ - Code: Invalid, - Op: "bar", - Message: "nested error", - } - err := &Error{ - Code: Internal, - Op: "foo", - Err: nestedErr, - } - return err -} - -func TestError(t *testing.T) { - err := scenario1() - assert.Equal(t, "root error", err.Error()) - err = scenario2() - assert.Equal(t, " nested error", err.Error()) -} - -func TestCode(t *testing.T) { - assert.Equal(t, "", Code(nil)) - err := scenario1() - assert.Equal(t, Invalid, Code(err)) - err = scenario2() - assert.Equal(t, Internal, Code(err)) - err = errors.New("some error") - assert.Equal(t, Internal, Code(err)) -} - -func TestMessage(t *testing.T) { - assert.Equal(t, "", Message(nil)) - err := scenario1() - assert.Equal(t, "nested error", Message(err)) - err = errors.New("some error") - assert.Equal(t, defaultMessage, Message(err)) -} - -func TestOp(t *testing.T) { - assert.Equal(t, "", Op(nil)) - err := scenario1() - assert.Equal(t, "foo: bar", Op(err)) - err = errors.New("some error") - assert.Equal(t, "", Op(err)) -} diff --git a/internal/pkg/timeout/doc.go b/internal/pkg/timeout/doc.go deleted file mode 100644 index e8c95004..00000000 --- a/internal/pkg/timeout/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -// Package timeout helps managing -// context with timeout. -package timeout diff --git a/internal/pkg/timeout/timeout.go b/internal/pkg/timeout/timeout.go deleted file mode 100644 index 37a61325..00000000 --- a/internal/pkg/timeout/timeout.go +++ /dev/null @@ -1,47 +0,0 @@ -package timeout - -import ( - "context" - "fmt" - "strings" - "time" - - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" -) - -// Context creates a context with timeout for -// given second. -func Context(seconds float64) (context.Context, context.CancelFunc) { - return context.WithTimeout(context.Background(), Duration(seconds)) -} - -// Duration creates a duration from seconds. -func Duration(seconds float64) time.Duration { - return time.Duration(1000*seconds) * time.Millisecond -} - -// Err checks if there is an error in the given context -// and wraps the previous error inside a standarderror.Error. -func Err(ctx context.Context, previousErr error) error { - const op string = "timeout.Err" - if previousErr == nil { - panic(fmt.Sprintf("%s: previous error should not be nil", op)) - } - err := ctx.Err() - if err == nil { - return previousErr - } - if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { - return &standarderror.Error{ - Code: standarderror.Timeout, - Message: "context has timed out", - Op: op, - Err: previousErr, - } - } - return &standarderror.Error{ - Message: "context finished with an error", - Op: op, - Err: previousErr, - } -} diff --git a/internal/pkg/timeout/timeout_test.go b/internal/pkg/timeout/timeout_test.go deleted file mode 100644 index 3ff7f724..00000000 --- a/internal/pkg/timeout/timeout_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package timeout - -import ( - "errors" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" - "github.com/thecodingmachine/gotenberg/test" -) - -func TestDuration(t *testing.T) { - expected := time.Duration(1500) * time.Millisecond - result := Duration(1.5) - assert.Equal(t, expected.String(), result.String()) -} - -func TestErr(t *testing.T) { - previousErr := errors.New("previous error") - // should be OK. - ctx, cancel := Context(5) - defer cancel() - assert.NotNil(t, Err(ctx, previousErr)) - // should timeout. - ctx, cancel = Context(0.5) - defer cancel() - time.Sleep(Duration(1)) - err := Err(ctx, previousErr) - assert.NotNil(t, err) - standardized := test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Timeout, standardized.Code) - // should failed. - ctx, cancel = Context(5) - cancel() - err = Err(ctx, previousErr) - assert.NotNil(t, err) - standardized = test.RequireStandardError(t, err) - assert.Equal(t, standarderror.Internal, standarderror.Code(err)) -} diff --git a/internal/pkg/xassert/doc.go b/internal/pkg/xassert/doc.go new file mode 100644 index 00000000..14b2417e --- /dev/null +++ b/internal/pkg/xassert/doc.go @@ -0,0 +1,8 @@ +/* +Package xassert is a helper for converting +and/or validating strings. + +All functions return our standard xerror.Error +in case of error. +*/ +package xassert diff --git a/internal/pkg/xassert/float64.go b/internal/pkg/xassert/float64.go new file mode 100644 index 00000000..e8521b7e --- /dev/null +++ b/internal/pkg/xassert/float64.go @@ -0,0 +1,88 @@ +package xassert + +import ( + "fmt" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" +) + +// RuleFloat64 is an interface for +// validating a float64. +type RuleFloat64 interface { + with(key string, value float64) + validate() error +} + +type baseRuleFloat64 struct { + key string + value float64 +} + +func (r *baseRuleFloat64) with(key string, value float64) { + r.key = key + r.value = value +} + +type ruleFloat64NotInferiorTo struct { + *baseRuleFloat64 + lowerBound float64 +} + +func (r ruleFloat64NotInferiorTo) validate() error { + const op string = "xassert.ruleFloat64NotInferiorTo.validate" + if r.value < r.lowerBound { + return xerror.Invalid( + op, + fmt.Sprintf("'%s' should be > '%f', got '%f'", r.key, r.lowerBound, r.value), + nil, + ) + } + return nil +} + +/* +Float64NotInferiorTo returns a RuleFloat64 for +validating that a float64 is not inferior to +given lower bound. +*/ +func Float64NotInferiorTo(lowerBound float64) RuleFloat64 { + return ruleFloat64NotInferiorTo{ + &baseRuleFloat64{}, + lowerBound, + } +} + +type ruleFloat64NotSuperiorTo struct { + *baseRuleFloat64 + upperBound float64 +} + +func (r ruleFloat64NotSuperiorTo) validate() error { + const op string = "xassert.ruleFloat64NotSuperiorTo.validate" + if r.value > r.upperBound { + return xerror.Invalid( + op, + fmt.Sprintf("'%s' should be < '%f', got '%f'", r.key, r.upperBound, r.value), + nil, + ) + } + return nil +} + +/* +Float64NotSuperiorTo returns a RuleFloat64 for +validating that a float64 is not superior to +given upper bound. +*/ +func Float64NotSuperiorTo(upperBound float64) RuleFloat64 { + return ruleFloat64NotSuperiorTo{ + &baseRuleFloat64{}, + upperBound, + } +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = RuleFloat64(new(ruleFloat64NotInferiorTo)) + _ = RuleFloat64(new(ruleFloat64NotSuperiorTo)) +) diff --git a/internal/pkg/xassert/float64_test.go b/internal/pkg/xassert/float64_test.go new file mode 100644 index 00000000..c43124d1 --- /dev/null +++ b/internal/pkg/xassert/float64_test.go @@ -0,0 +1,32 @@ +package xassert + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xerrortest" +) + +func TestFloat64NotInferiorTo(t *testing.T) { + rule := Float64NotInferiorTo(0.0) + // should be OK. + rule.with("FOO", 10.0) + err := rule.validate() + assert.Nil(t, err) + // should not be OK. + rule.with("FOO", -10.0) + err = rule.validate() + xerrortest.AssertError(t, err) +} + +func TestFloat64NotSuperiorTo(t *testing.T) { + rule := Float64NotSuperiorTo(0.0) + // should be OK. + rule.with("FOO", -10.0) + err := rule.validate() + assert.Nil(t, err) + // should not be OK. + rule.with("FOO", 10.0) + err = rule.validate() + xerrortest.AssertError(t, err) +} diff --git a/internal/pkg/xassert/int64.go b/internal/pkg/xassert/int64.go new file mode 100644 index 00000000..c3fc3ae7 --- /dev/null +++ b/internal/pkg/xassert/int64.go @@ -0,0 +1,88 @@ +package xassert + +import ( + "fmt" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" +) + +// RuleInt64 is an interface for +// validating an int64. +type RuleInt64 interface { + with(key string, value int64) + validate() error +} + +type baseRuleInt64 struct { + key string + value int64 +} + +func (r *baseRuleInt64) with(key string, value int64) { + r.key = key + r.value = value +} + +type ruleInt64NotInferiorTo struct { + *baseRuleInt64 + lowerBound int64 +} + +func (r ruleInt64NotInferiorTo) validate() error { + const op string = "xassert.ruleInt64NotInferiorTo.validate" + if r.value < r.lowerBound { + return xerror.Invalid( + op, + fmt.Sprintf("'%s' should be > '%d', got '%d'", r.key, r.lowerBound, r.value), + nil, + ) + } + return nil +} + +/* +Int64NotInferiorTo returns a RuleInt64 for +validating that an int64 is not inferior to +given lower bound. +*/ +func Int64NotInferiorTo(lowerBound int64) RuleInt64 { + return &ruleInt64NotInferiorTo{ + &baseRuleInt64{}, + lowerBound, + } +} + +type ruleInt64NotSuperiorTo struct { + *baseRuleInt64 + upperBound int64 +} + +func (r ruleInt64NotSuperiorTo) validate() error { + const op string = "xassert.ruleInt64NotSuperiorTo.validate" + if r.value > r.upperBound { + return xerror.Invalid( + op, + fmt.Sprintf("'%s' should be < '%d', got '%d'", r.key, r.upperBound, r.value), + nil, + ) + } + return nil +} + +/* +Int64NotSuperiorTo returns a RuleInt64 for +validating that an int64 is not superior to +given upper bound. +*/ +func Int64NotSuperiorTo(upperBound int64) RuleInt64 { + return ruleInt64NotSuperiorTo{ + &baseRuleInt64{}, + upperBound, + } +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = RuleInt64(new(ruleInt64NotInferiorTo)) + _ = RuleInt64(new(ruleInt64NotSuperiorTo)) +) diff --git a/internal/pkg/xassert/int64_test.go b/internal/pkg/xassert/int64_test.go new file mode 100644 index 00000000..96d12bc2 --- /dev/null +++ b/internal/pkg/xassert/int64_test.go @@ -0,0 +1,32 @@ +package xassert + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xerrortest" +) + +func TestInt64NotInferiorTo(t *testing.T) { + rule := Int64NotInferiorTo(0) + // should be OK. + rule.with("FOO", 10) + err := rule.validate() + assert.Nil(t, err) + // should not be OK. + rule.with("FOO", -10) + err = rule.validate() + xerrortest.AssertError(t, err) +} + +func TestInt64NotSuperiorTo(t *testing.T) { + rule := Int64NotSuperiorTo(0) + // should be OK. + rule.with("FOO", -10) + err := rule.validate() + assert.Nil(t, err) + // should not be OK. + rule.with("FOO", 10) + err = rule.validate() + xerrortest.AssertError(t, err) +} diff --git a/internal/pkg/xassert/string.go b/internal/pkg/xassert/string.go new file mode 100644 index 00000000..540eee9b --- /dev/null +++ b/internal/pkg/xassert/string.go @@ -0,0 +1,60 @@ +package xassert + +import ( + "fmt" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" +) + +// RuleString is an interface for +// validating a string. +type RuleString interface { + with(key, value string) + validate() error +} + +type baseRuleString struct { + key string + value string +} + +func (r *baseRuleString) with(key, value string) { + r.key = key + r.value = value +} + +type ruleStringOneOf struct { + *baseRuleString + values []string +} + +func (r ruleStringOneOf) validate() error { + const op string = "xassert.ruleStringOneOf.validate" + for _, v := range r.values { + if r.value == v { + return nil + } + } + return xerror.Invalid( + op, + fmt.Sprintf("'%s' should be one of '%v', got '%s'", r.key, r.values, r.value), + nil, + ) +} + +/* +StringOneOf returns a RuleString for +validating that a string is one of given +values. +*/ +func StringOneOf(values []string) RuleString { + return ruleStringOneOf{ + &baseRuleString{}, + values, + } +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = RuleString(new(ruleStringOneOf)) +) diff --git a/internal/pkg/xassert/string_test.go b/internal/pkg/xassert/string_test.go new file mode 100644 index 00000000..4f0c59fa --- /dev/null +++ b/internal/pkg/xassert/string_test.go @@ -0,0 +1,20 @@ +package xassert + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xerrortest" +) + +func TestStringOfOne(t *testing.T) { + rule := StringOneOf([]string{"foo", "bar", "baz"}) + // should be OK. + rule.with("FOO", "foo") + err := rule.validate() + assert.Nil(t, err) + // should not be OK. + rule.with("FOO", "qux") + err = rule.validate() + xerrortest.AssertError(t, err) +} diff --git a/internal/pkg/xassert/xassert.go b/internal/pkg/xassert/xassert.go new file mode 100644 index 00000000..574008ff --- /dev/null +++ b/internal/pkg/xassert/xassert.go @@ -0,0 +1,185 @@ +package xassert + +import ( + "fmt" + "os" + "strconv" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" +) + +/* +String applies validation on a string. + +If string is empty or validation fails, +returns the default value. + +The key is used to identify the value. +*/ +func String(key, value, defaultValue string, rules ...RuleString) (string, error) { + const op string = "xassert.String" + result := defaultValue + if value != "" { + result = value + } + for _, rule := range rules { + rule.with(key, result) + if err := rule.validate(); err != nil { + return defaultValue, xerror.New(op, err) + } + } + return result, nil +} + +/* +StringFromEnv returns the value of given environment +variable or the default value if not found or +validation fails. +*/ +func StringFromEnv(envVar, defaultValue string, rules ...RuleString) (string, error) { + const op string = "xassert.StringFromEnv" + value := os.Getenv(envVar) + result, err := String(envVar, value, defaultValue, rules...) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} + +/* +Int64 tries to convert a string to an int64. + +If string is empty, conversion or validation fails, +returns the default value. + +The key is used to identify the value. +*/ +func Int64(key, value string, defaultValue int64, rules ...RuleInt64) (int64, error) { + const op string = "xassert.Int64" + result := defaultValue + if value != "" { + parsedValue, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return defaultValue, xerror.Invalid( + op, + fmt.Sprintf("'%s' is not an integer, got '%s'", key, value), + err, + ) + } + result = parsedValue + } + for _, rule := range rules { + rule.with(key, result) + if err := rule.validate(); err != nil { + return defaultValue, xerror.New(op, err) + } + } + return result, nil +} + +/* +Int64FromEnv returns the int64 representation of the +value of given environment variable. + +If not found, empty, conversion or validation fails, +returns the default value. +*/ +func Int64FromEnv(envVar string, defaultValue int64, rules ...RuleInt64) (int64, error) { + const op string = "xassert.Int64FromEnv" + value := os.Getenv(envVar) + result, err := Int64(envVar, value, defaultValue, rules...) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} + +/* +Float64 tries to convert a string to a float64. + +If string is empty, conversion or validation fails, +returns the default value. + +The key is used to identify the value. +*/ +func Float64(key, value string, defaultValue float64, rules ...RuleFloat64) (float64, error) { + const op string = "xassert.Float64" + result := defaultValue + if value != "" { + parsedValue, err := strconv.ParseFloat(value, 64) + if err != nil { + return defaultValue, xerror.Invalid( + op, + fmt.Sprintf("'%s' is not a float, got '%s'", key, value), + err, + ) + } + result = parsedValue + } + for _, rule := range rules { + rule.with(key, result) + if err := rule.validate(); err != nil { + return defaultValue, xerror.New(op, err) + } + } + return result, nil +} + +/* +Float64FromEnv returns the float64 representation of the +value of given environment variable. + +If not found, empty, conversion or validation fails, +returns the default value. +*/ +func Float64FromEnv(envVar string, defaultValue float64, rules ...RuleFloat64) (float64, error) { + const op string = "xassert.Float64FromEnv" + value := os.Getenv(envVar) + result, err := Float64(envVar, value, defaultValue, rules...) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} + +/* +Bool tries to convert a string to a boolean. + +If string is empty or conversion fails, returns the +default value. + +The key is used to identify the value. +*/ +func Bool(key, value string, defaultValue bool) (bool, error) { + const op string = "xassert.Bool" + result := defaultValue + if value != "" { + parsedValue, err := strconv.ParseBool(value) + if err != nil { + return defaultValue, xerror.Invalid( + op, + fmt.Sprintf("'%s' is not a boolean, got '%s'", key, value), + err, + ) + } + result = parsedValue + } + return result, nil +} + +/* +BoolFromEnv returns the boolean representation of the +value of given environment variable. + +If not found, empty or conversion fails, returns the +default value. +*/ +func BoolFromEnv(envVar string, defaultValue bool) (bool, error) { + const op string = "xassert.BoolFromEnv" + value := os.Getenv(envVar) + result, err := Bool(envVar, value, defaultValue) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} diff --git a/internal/pkg/xassert/xassert_test.go b/internal/pkg/xassert/xassert_test.go new file mode 100644 index 00000000..607b70c1 --- /dev/null +++ b/internal/pkg/xassert/xassert_test.go @@ -0,0 +1,289 @@ +package xassert + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xerrortest" +) + +func TestString(t *testing.T) { + const ( + defaultValue string = "FOO" + ) + var expected string + rule := StringOneOf([]string{"FOO", "BAR"}) + // empty value, result should be equal + // to the default value. + v, err := String("foo", "", defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + assert.Nil(t, err) + // result should be equal to given value + // as it is one of "FOO" and "BAR". + expected = "FOO" + v, err = String("foo", expected, defaultValue, rule) + assert.Equal(t, expected, v) + assert.Nil(t, err) + // should not be OK as given value is not + // one of "FOO" and "BAR". + v, err = String("foo", "BAZ", defaultValue, rule) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) +} + +func TestStringFromEnv(t *testing.T) { + const ( + envVar string = "FOO" + defaultValue string = "FOO" + ) + var expected string + rule := StringOneOf([]string{"FOO", "BAR"}) + // no environment variable set, + // value should be equal to default value. + v, err := StringFromEnv(envVar, defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + assert.Nil(t, err) + // result should be equal to environment variable + // value as it is one of "FOO" and "BAR". + expected = "BAR" + os.Setenv(envVar, expected) + v, err = StringFromEnv(envVar, defaultValue, rule) + assert.Equal(t, expected, v) + assert.Nil(t, err) + os.Unsetenv(envVar) + // should not be OK as environment variable + // value is not one of "FOO" and "BAR". + os.Setenv(envVar, "BAZ") + v, err = StringFromEnv(envVar, defaultValue, rule) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) + os.Unsetenv(envVar) +} + +func TestInt64(t *testing.T) { + const ( + defaultValue int64 = 10 + ) + var expected int64 + rule := Int64NotInferiorTo(6) + // empty value, result should be equal + // to the default value. + v, err := Int64("foo", "", defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + assert.Nil(t, err) + // result should be equal to given value + // but as integer. + v, err = Int64("foo", "5", defaultValue) + expected = 5 + assert.Equal(t, expected, v) + assert.Nil(t, err) + // should not be OK as given value is not + // a string representation of an integer. + v, err = Int64("foo", "foo", defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) + // should not be OK as given value does not + // validate the rule x >= 6. + v, err = Int64("foo", "5", defaultValue, rule) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) +} + +func TestInt64FromEnv(t *testing.T) { + const ( + envVar string = "FOO" + defaultValue int64 = 10 + ) + var expected int64 + rule := Int64NotInferiorTo(6) + // no environment variable set, + // value should be equal to default value. + v, err := Int64FromEnv(envVar, defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + assert.Nil(t, err) + // result should be equal to environment variable + // value but as integer. + os.Setenv(envVar, "5") + v, err = Int64FromEnv(envVar, defaultValue) + expected = 5 + assert.Equal(t, expected, v) + assert.Nil(t, err) + os.Unsetenv(envVar) + // should not be OK as environment variable + // value is not a string representation of an integer. + os.Setenv(envVar, "foo") + v, err = Int64FromEnv(envVar, defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) + os.Unsetenv(envVar) + // should not be OK as environment variable + // value does not validate the rule x >= 6. + os.Setenv(envVar, "5") + v, err = Int64FromEnv(envVar, defaultValue, rule) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) + os.Unsetenv(envVar) +} + +func TestFloat64(t *testing.T) { + const defaultValue float64 = 10.0 + var expected float64 + rule := Float64NotInferiorTo(6.0) + // empty value, result should be equal + // to the default value. + v, err := Float64("foo", "", defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + assert.Nil(t, err) + // result should be equal to given value + // but as float. + v, err = Float64("foo", "5.5", defaultValue) + expected = 5.5 + assert.Equal(t, expected, v) + assert.Nil(t, err) + // should not be OK as given value is not + // a string representation of a float. + v, err = Float64("foo", "foo", defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) + // should not be OK as given value does not + // validate the rule x >= 6. + v, err = Float64("foo", "5", defaultValue, rule) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) +} + +func TestFloat64FromEnv(t *testing.T) { + const ( + envVar string = "FOO" + defaultValue float64 = 10.0 + ) + var expected float64 + rule := Float64NotInferiorTo(6.0) + // no environment variable set, + // value should be equal to default value. + v, err := Float64FromEnv(envVar, defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + assert.Nil(t, err) + // result should be equal to environment variable + // value but as float. + os.Setenv(envVar, "5.5") + v, err = Float64FromEnv(envVar, defaultValue) + expected = 5.5 + assert.Equal(t, expected, v) + assert.Nil(t, err) + os.Unsetenv(envVar) + // should not be OK as environment variable + // value is not a string representation of a float. + os.Setenv(envVar, "foo") + v, err = Float64FromEnv(envVar, defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) + os.Unsetenv(envVar) + // should not be OK as environment variable + // value does not validate the rule x >= 6. + os.Setenv(envVar, "5") + v, err = Float64FromEnv(envVar, defaultValue, rule) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) + os.Unsetenv(envVar) +} + +func TestBool(t *testing.T) { + const defaultValue bool = true + var expected bool + // empty value, result should be equal + // to the default value. + v, err := Bool("foo", "", defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + assert.Nil(t, err) + // result should be equal to given value + // but as boolean. + v, err = Bool("foo", "1", defaultValue) + expected = true + assert.Equal(t, expected, v) + assert.Nil(t, err) + v, err = Bool("foo", "true", defaultValue) + expected = true + assert.Equal(t, expected, v) + assert.Nil(t, err) + v, err = Bool("foo", "0", defaultValue) + expected = false + assert.Equal(t, expected, v) + assert.Nil(t, err) + v, err = Bool("foo", "false", defaultValue) + expected = false + assert.Equal(t, expected, v) + assert.Nil(t, err) + // should not be OK as given value is not + // a string representation of a boolean. + v, err = Bool("foo", "foo", defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) +} + +func TestBoolFromEnv(t *testing.T) { + const ( + envVar string = "FOO" + defaultValue bool = true + ) + var expected bool + // no environment variable set, + // value should be equal to default value. + v, err := BoolFromEnv(envVar, defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + assert.Nil(t, err) + // result should be equal to environment variable + // value but as boolean. + os.Setenv(envVar, "1") + v, err = BoolFromEnv(envVar, defaultValue) + expected = true + assert.Equal(t, expected, v) + assert.Nil(t, err) + os.Unsetenv(envVar) + os.Setenv(envVar, "true") + v, err = BoolFromEnv(envVar, defaultValue) + expected = true + assert.Equal(t, expected, v) + assert.Nil(t, err) + os.Unsetenv(envVar) + os.Setenv(envVar, "0") + v, err = BoolFromEnv(envVar, defaultValue) + expected = false + assert.Equal(t, expected, v) + assert.Nil(t, err) + os.Unsetenv(envVar) + os.Setenv(envVar, "false") + v, err = BoolFromEnv(envVar, defaultValue) + expected = false + assert.Equal(t, expected, v) + assert.Nil(t, err) + os.Unsetenv(envVar) + // should not be OK as environment variable + // value is not a string representation of a boolean. + os.Setenv(envVar, "foo") + v, err = BoolFromEnv(envVar, defaultValue) + expected = defaultValue + assert.Equal(t, expected, v) + xerrortest.AssertError(t, err) + os.Unsetenv(envVar) +} diff --git a/internal/pkg/xcontext/doc.go b/internal/pkg/xcontext/doc.go new file mode 100644 index 00000000..d6a369d6 --- /dev/null +++ b/internal/pkg/xcontext/doc.go @@ -0,0 +1,3 @@ +// Package xcontext helps managing +// context.Context with timeout. +package xcontext diff --git a/internal/pkg/xcontext/xcontext.go b/internal/pkg/xcontext/xcontext.go new file mode 100644 index 00000000..67a27d16 --- /dev/null +++ b/internal/pkg/xcontext/xcontext.go @@ -0,0 +1,56 @@ +package xcontext + +import ( + "context" + "fmt" + "strings" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" +) + +// WithTimeout creates a context.Context which +// times out after given seconds. +func WithTimeout(logger xlog.Logger, seconds float64) (context.Context, context.CancelFunc) { + const op string = "xcontext.WithTimeout" + logger.DebugfOp(op, "creating context with '%.2fs' of timeout...", seconds) + return context.WithTimeout(context.Background(), xtime.Duration(seconds)) +} + +/* +MustHandleError checks if there is an error +in the given Context. + +If no error, returns the previous error. + +If context.DeadlineExceeded, wraps the previous +error inside an xerror.Error with xerror.TimeoutCode. + +Otherwise wraps the previous error inside an +xerror.Error. + +It panics if no previous error. +*/ +func MustHandleError(ctx context.Context, previousErr error) error { + const op string = "xcontext.MustHandleError" + if previousErr == nil { + panic(fmt.Sprintf("%s: previous error should not be nil", op)) + } + err := ctx.Err() + if err == nil { + // we do not wrap the previous error + // as it should be wrapped by the caller. + return previousErr + } + // context has timed out + if strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { + return xerror.Timeout(op, "context has timed out", previousErr) + } + /* + context has another error: we do not + wrap the error from the Context as the previous + error should contain it. + */ + return xerror.New(op, previousErr) +} diff --git a/internal/pkg/xcontext/xcontext_test.go b/internal/pkg/xcontext/xcontext_test.go new file mode 100644 index 00000000..a0d541ff --- /dev/null +++ b/internal/pkg/xcontext/xcontext_test.go @@ -0,0 +1,43 @@ +package xcontext + +import ( + "errors" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xerrortest" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xlogtest" +) + +func TestMustHandleError(t *testing.T) { + previousErr := errors.New("previous error") + logger := xlogtest.DebugLogger() + // context should not have an error. + ctx, cancel := WithTimeout(logger, 5) + defer cancel() + err := MustHandleError(ctx, previousErr) + assert.Equal(t, previousErr, err) + // should panic. + ctx, cancel = WithTimeout(logger, 5) + defer cancel() + assert.Panics(t, func() { + MustHandleError(ctx, nil) + }) + // context should timed out. + ctx, cancel = WithTimeout(logger, 0.5) + defer cancel() + time.Sleep(xtime.Duration(1)) + err = MustHandleError(ctx, previousErr) + xerr := xerrortest.AssertError(t, err) + assert.Equal(t, xerror.TimeoutCode, xerror.Code(xerr)) + // context should have an error different + // than context.DeadlineExceeded. + ctx, cancel = WithTimeout(logger, 5) + cancel() + err = MustHandleError(ctx, previousErr) + xerr = xerrortest.AssertError(t, err) + assert.Equal(t, xerror.InternalCode, xerror.Code(xerr)) +} diff --git a/internal/pkg/xerror/doc.go b/internal/pkg/xerror/doc.go new file mode 100644 index 00000000..999decf8 --- /dev/null +++ b/internal/pkg/xerror/doc.go @@ -0,0 +1,7 @@ +/* +Package xerror helps standardizing +the errors through the application. + +Credits: https://middlemost.com/failure-is-your-domain/ +*/ +package xerror diff --git a/internal/pkg/xerror/xerror.go b/internal/pkg/xerror/xerror.go new file mode 100644 index 00000000..f1f9c1ee --- /dev/null +++ b/internal/pkg/xerror/xerror.go @@ -0,0 +1,152 @@ +package xerror + +import ( + "bytes" + "fmt" + "strings" +) + +// ErrorCode is machine-readable error code. +type ErrorCode string + +const ( + // InternalCode is an internal error. + InternalCode ErrorCode = "internal" + // InvalidCode occurs when a validation + // failed. + InvalidCode ErrorCode = "invalid" + // TimeoutCode occurs when something + // timed out. + TimeoutCode ErrorCode = "timeout" +) + +// Error defines our standard application +// error. +type Error struct { + code ErrorCode + message string + op string + err error +} + +// Error returns the string representation of the error message. +func (e Error) Error() string { + var buf bytes.Buffer + // if wrapping an error, print its Error() message. + // Otherwise print the error code & message. + if e.err != nil { + buf.WriteString(e.err.Error()) + } else { + if e.code != "" { + fmt.Fprintf(&buf, "<%s> ", e.code) + } + buf.WriteString(e.message) + } + return buf.String() +} + +/* +New returns a xerror.Error. + +Should be used for wrapping an error +at the end of a function. +*/ +func New(op string, previous error) error { + return &Error{ + op: op, + err: previous, + } +} + +/* +Invalid returns a xerror.Error. + +Should be used when an input +is wrong. +*/ +func Invalid(op, message string, previous error) error { + return &Error{ + code: InvalidCode, + message: message, + op: op, + err: previous, + } +} + +/* +Timeout returns a xerror.Error. + +Should be used when a timeout occurs. +*/ +func Timeout(op, message string, previous error) error { + return &Error{ + code: TimeoutCode, + message: message, + op: op, + err: previous, + } +} + +// Code returns the code of the root error, if available. +// Otherwise returns InternalCode. +func Code(err error) ErrorCode { + if err == nil { + return "" + } + e, ok := err.(*Error) + if ok && e.code != "" { + return e.code + } + if ok && e.err != nil { + return Code(e.err) + } + return InternalCode +} + +const defaultMessage string = "an internal error has occurred: please contact technical support" + +// Message returns the human-readable message of the error, if available. +// Otherwise returns a generic error message. +func Message(err error) string { + if err == nil { + return "" + } + e, ok := err.(*Error) + if ok && e.message != "" { + return e.message + } + if ok && e.err != nil { + return Message(e.err) + } + return defaultMessage +} + +// Op returns the logical operation of the error, if available. +// Otherwise returns an empty string. +func Op(err error) string { + if err == nil { + return "" + } + e, ok := err.(*Error) + if !ok { + return "" + } + var buf bytes.Buffer + nestedOp := Op(e.err) + if nestedOp != "" { + // we want to avoid having the same op chained. + if e.op != "" && !strings.Contains(nestedOp, e.op) { + fmt.Fprintf(&buf, "%s: %s", e.op, nestedOp) + } else { + fmt.Fprintf(&buf, "%s", nestedOp) + } + } else if e.op != "" { + fmt.Fprintf(&buf, "%s", e.op) + } + return buf.String() +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = error(new(Error)) +) diff --git a/internal/pkg/xerror/xerror_test.go b/internal/pkg/xerror/xerror_test.go new file mode 100644 index 00000000..a3727ccf --- /dev/null +++ b/internal/pkg/xerror/xerror_test.go @@ -0,0 +1,97 @@ +package xerror + +import ( + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +/* +Error 1.0: op = "foo" +Error 1.1: op = "bar" +Error 1.2: code = "invalid", op = "baz", message = "nested error" +Error 1.3: message = "root error" +*/ +func scenario1() error { + rootErr := errors.New("root error") + nestedErr := Invalid("baz", "nested error", rootErr) + wrappingErr := New("bar", nestedErr) + return New("foo", wrappingErr) +} + +/* +Error 2.0: op = "foo" +Error 2.1: op = "bar" +Error 2.2: code = "timeout", op = "bar", message = "nested error" +*/ +func scenario2() error { + nestedErr := Timeout("bar", "nested error", nil) + wrappingErr := New("bar", nestedErr) + return New("foo", wrappingErr) +} + +// Error 3.0: code = "", op = "foo" +func scenario3() error { + return New("foo", nil) +} + +func TestError(t *testing.T) { + // should return the Error 1.3 + // message. + err := scenario1() + assert.Equal(t, "root error", err.Error()) + // should return the Error 2.2 message with + // its code. + err = scenario2() + assert.Equal(t, " nested error", err.Error()) +} + +func TestCode(t *testing.T) { + // should be an empty code if no error. + assert.Equal(t, "", fmt.Sprintf("%s", Code(nil))) + // should be the code of Error 1.2. + err := scenario1() + assert.Equal(t, InvalidCode, Code(err)) + // should be the code of Error 2.2. + err = scenario2() + assert.Equal(t, TimeoutCode, Code(err)) + // should be the default code. + err = scenario3() + assert.Equal(t, InternalCode, Code(err)) + err = errors.New("some error") + assert.Equal(t, InternalCode, Code(err)) +} + +func TestMessage(t *testing.T) { + // should be an empty message if no error. + assert.Equal(t, "", Message(nil)) + // should be the message of Error 1.2. + err := scenario1() + assert.Equal(t, "nested error", Message(err)) + // should be the default message. + err = errors.New("some error") + assert.Equal(t, defaultMessage, Message(err)) +} + +func TestOp(t *testing.T) { + // should be an empty op if no error. + assert.Equal(t, "", Op(nil)) + // should be the chain of op in this order: + // Error 1.0 -> Error 1.1 -> Error 1.2. + err := scenario1() + assert.Equal(t, "foo: bar: baz", Op(err)) + /* + should be the chain of op in this order: + Error 2.0 -> Error 2.1. + + As Error 2.1 and Error 2.2 shares the same + op, Error 2.2 op is not displayed. + */ + err = scenario2() + assert.Equal(t, "foo: bar", Op(err)) + // should be an empty op if not Error. + err = errors.New("some error") + assert.Equal(t, "", Op(err)) +} diff --git a/internal/pkg/xexec/doc.go b/internal/pkg/xexec/doc.go new file mode 100644 index 00000000..e1605a43 --- /dev/null +++ b/internal/pkg/xexec/doc.go @@ -0,0 +1,8 @@ +/* +Package xexec helps creating exec.Cmd +with logging. + +All functions return our standard xerror.Error +in case of error. +*/ +package xexec diff --git a/internal/pkg/xexec/xexec.go b/internal/pkg/xexec/xexec.go new file mode 100644 index 00000000..4b4fec68 --- /dev/null +++ b/internal/pkg/xexec/xexec.go @@ -0,0 +1,99 @@ +package xexec + +import ( + "bufio" + "context" + "fmt" + "io" + "os/exec" + "strings" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +/* +Command is a wrapper around exec.Command. + +If given xlog.Logger has a xlog.DebugLevel, +also logs the output from the command. +*/ +func Command(logger xlog.Logger, binary string, args ...string) (*exec.Cmd, error) { + const op string = "xexec.Command" + cmd := exec.Command(binary, args...) + if err := pipe(logger, cmd); err != nil { + return nil, xerror.New(op, err) + } + return cmd, nil +} + +/* +CommandContext is a wrapper around exec.CommandContext. + +If given xlog.Logger has a xlog.DebugLevel, +also logs the output from the command. +*/ +func CommandContext(ctx context.Context, logger xlog.Logger, binary string, args ...string) (*exec.Cmd, error) { + const op string = "xexec.CommandContext" + cmd := exec.CommandContext(ctx, binary, args...) + if err := pipe(logger, cmd); err != nil { + return nil, xerror.New(op, err) + } + return cmd, nil +} + +// LogBeforeExecute logs a command before its execution. +func LogBeforeExecute(logger xlog.Logger, cmd *exec.Cmd) { + const op string = "xexec.LogBeforeExecute" + logger.DebugfOp(op, "executing command: %s", strings.Join(cmd.Args, " ")) +} + +func pipe(logger xlog.Logger, cmd *exec.Cmd) error { + const op string = "xexec.pipe" + if logger.Level() != xlog.DebugLevel { + return nil + } + // if xlog.DebugLevel, log the output + // from the command. + resolver := func() error { + stdout, err := cmd.StdoutPipe() + if err != nil { + return err + } + stderr, err := cmd.StderrPipe() + if err != nil { + return err + } + go logCommandOutput(logger, stdout, "stdout", cmd) + go logCommandOutput(logger, stderr, "stderr", cmd) + return nil + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func logCommandOutput(logger xlog.Logger, reader io.ReadCloser, outputType string, cmd *exec.Cmd) { + var op string + if len(cmd.Args) >= 2 { + op = fmt.Sprintf("%s.%s.%s", cmd.Args[0], cmd.Args[1], outputType) + } else { + // len(cmd.Args) should always be >= 1. + op = fmt.Sprintf("%s.%s", cmd.Args[0], outputType) + } + r := bufio.NewReader(reader) + defer reader.Close() // nolint: errcheck + for { + line, _, err := r.ReadLine() + if err != nil { + if err != io.EOF { + logger.ErrorOp(op, err) + } + break + } + if len(line) != 0 { + logger.DebugOp(op, string(line)) + } + } +} diff --git a/internal/pkg/xexec/xexec_test.go b/internal/pkg/xexec/xexec_test.go new file mode 100644 index 00000000..caeb03a8 --- /dev/null +++ b/internal/pkg/xexec/xexec_test.go @@ -0,0 +1,39 @@ +package xexec + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xlogtest" +) + +func TestCommand(t *testing.T) { + logger := xlogtest.DebugLogger() + // should pipe command output as + // xlog.Logger has a xlog.DebugLevel. + cmd, err := Command(logger, "echo", "Hello", "World") + assert.Nil(t, err) + LogBeforeExecute(logger, cmd) + // should not pipe command output as + // xlog.Logger has a xlog.InfoLevel. + logger = xlogtest.InfoLogger() + cmd, err = Command(logger, "echo", "Hello", "World") + LogBeforeExecute(logger, cmd) + assert.Nil(t, err) +} + +func TestCommandContext(t *testing.T) { + logger := xlogtest.DebugLogger() + // should pipe command output as + // xlog.Logger has a xlog.DebugLevel. + cmd, err := CommandContext(context.Background(), logger, "echo") + assert.Nil(t, err) + LogBeforeExecute(logger, cmd) + // should not pipe command output as + // xlog.Logger has a xlog.InfoLevel. + logger = xlogtest.InfoLogger() + cmd, err = CommandContext(context.Background(), logger, "echo", "Hello", "World") + LogBeforeExecute(logger, cmd) + assert.Nil(t, err) +} diff --git a/internal/pkg/xlog/doc.go b/internal/pkg/xlog/doc.go new file mode 100644 index 00000000..7aab9e5c --- /dev/null +++ b/internal/pkg/xlog/doc.go @@ -0,0 +1,17 @@ +/* +Package xlog defines a standard logger +for the application. + +It uses structured logging thanks to +https://github.com/sirupsen/logrus. + +All messages have at least two fields: + +A "trace" field which helps to identify +messages belonging to the same context. + +An "op" field which helps to identify +the logical operation associated +with the message. +*/ +package xlog diff --git a/internal/pkg/xlog/xlog.go b/internal/pkg/xlog/xlog.go new file mode 100644 index 00000000..b8aa271a --- /dev/null +++ b/internal/pkg/xlog/xlog.go @@ -0,0 +1,141 @@ +package xlog + +import ( + "fmt" + "os" + + "github.com/mattn/go-isatty" + "github.com/sirupsen/logrus" +) + +// Level helps setting the severity +// of the messages displayed. +type Level string + +const ( + // DebugLevel is the lowest level. + DebugLevel Level = "DEBUG" + // InfoLevel is the intermediate level. + InfoLevel Level = "INFO" + // ErrorLevel is the highest level. + ErrorLevel Level = "ERROR" +) + +// Logger enforces specific log message formats. +type Logger struct { + entry *logrus.Entry + level Level +} + +// New returns a xlog.Logger. +func New(level Level, trace string) Logger { + l := logrus.New() + l.SetLevel(mustLogrusLevel(level)) + if !isatty.IsTerminal(os.Stdout.Fd()) { + l.SetFormatter(&logrus.JSONFormatter{}) + } + return Logger{ + entry: l.WithField("trace", trace), + level: level, + } +} + +func mustLogrusLevel(level Level) logrus.Level { + const op string = "xlog.mustLogrusLevel" + switch level { + case DebugLevel: + return logrus.DebugLevel + case InfoLevel: + return logrus.InfoLevel + case ErrorLevel: + return logrus.ErrorLevel + default: + panic(fmt.Sprintf("%s: '%s' is not associated with any logrus.Level", op, level)) + } +} + +// Levels returns a slice of string +// with all severities. +func Levels() []string { + return []string{ + string(DebugLevel), + string(InfoLevel), + string(ErrorLevel), + } +} + +/* +MustParseLevel returns the Level corresponding +to given string. + +It panics if no correspondence. +*/ +func MustParseLevel(level string) Level { + const op string = "xlog.MustParseLevel" + switch level { + case string(DebugLevel): + return DebugLevel + case string(InfoLevel): + return InfoLevel + case string(ErrorLevel): + return ErrorLevel + default: + panic(fmt.Sprintf("%s: '%s' is not one of '%v'", op, level, Levels())) + } +} + +// Level returns the current Level. +func (l Logger) Level() Level { + return l.level +} + +// WithFields returns a new xlog.Logger with +// given fields. +func (l Logger) WithFields(fields map[string]interface{}) Logger { + return Logger{ + entry: l.entry.WithFields(fields), + level: l.level, + } +} + +// DebugOp logs a debug message for given +// logical operation. +func (l Logger) DebugOp(op, message string) { + l.entry.WithField("op", op).Debug(message) +} + +// DebugfOp logs a debug message for given +// logical operation and format. +func (l Logger) DebugfOp(op, format string, args ...interface{}) { + l.entry.WithField("op", op).Debugf(format, args...) +} + +// InfoOp logs an info message for given +// logical operation. +func (l Logger) InfoOp(op, message string) { + l.entry.WithField("op", op).Info(message) +} + +// InfofOp logs an info message for given +// logical operation and format. +func (l Logger) InfofOp(op, format string, args ...interface{}) { + l.entry.WithField("op", op).Infof(format, args...) +} + +// ErrorOp logs an error for given +// logical operation. +func (l Logger) ErrorOp(op string, err error) { + l.entry.WithField("op", op).Error(err.Error()) +} + +// ErrorfOp logs an error message for given +// logical operation and format. +func (l Logger) ErrorfOp(op, format string, args ...interface{}) { + l.entry.WithField("op", op).Errorf(format, args...) +} + +// FatalOp logs an error for given +// logical operation and exit 1. +func (l Logger) FatalOp(op string, err error) { + l.entry.WithField("op", op).Fatal(err.Error()) +} diff --git a/internal/pkg/xrand/doc.go b/internal/pkg/xrand/doc.go new file mode 100644 index 00000000..672af2b3 --- /dev/null +++ b/internal/pkg/xrand/doc.go @@ -0,0 +1,3 @@ +// Package xrand helps generating +// random strings. +package xrand diff --git a/internal/pkg/random/random.go b/internal/pkg/xrand/xrand.go similarity index 89% rename from internal/pkg/random/random.go rename to internal/pkg/xrand/xrand.go index 07556b5b..bdac8fab 100644 --- a/internal/pkg/random/random.go +++ b/internal/pkg/xrand/xrand.go @@ -1,4 +1,4 @@ -package random +package xrand import ( "github.com/labstack/gommon/random" diff --git a/internal/pkg/random/random_test.go b/internal/pkg/xrand/xrand_test.go similarity index 97% rename from internal/pkg/random/random_test.go rename to internal/pkg/xrand/xrand_test.go index aaf94f17..e5880f99 100644 --- a/internal/pkg/random/random_test.go +++ b/internal/pkg/xrand/xrand_test.go @@ -1,4 +1,4 @@ -package random +package xrand import ( "testing" diff --git a/internal/pkg/xtime/doc.go b/internal/pkg/xtime/doc.go new file mode 100644 index 00000000..2dbfa55a --- /dev/null +++ b/internal/pkg/xtime/doc.go @@ -0,0 +1,6 @@ +/* +Package xtime helps generating +time.Duration from seconds represented +as float64. +*/ +package xtime diff --git a/internal/pkg/xtime/xtime.go b/internal/pkg/xtime/xtime.go new file mode 100644 index 00000000..c0af3bdb --- /dev/null +++ b/internal/pkg/xtime/xtime.go @@ -0,0 +1,10 @@ +package xtime + +import ( + "time" +) + +// Duration creates a time.Duration from seconds. +func Duration(seconds float64) time.Duration { + return time.Duration(1000*seconds) * time.Millisecond +} diff --git a/internal/pkg/xtime/xtime_test.go b/internal/pkg/xtime/xtime_test.go new file mode 100644 index 00000000..67fee437 --- /dev/null +++ b/internal/pkg/xtime/xtime_test.go @@ -0,0 +1,14 @@ +package xtime + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestDuration(t *testing.T) { + expected := time.Duration(1500) * time.Millisecond + result := Duration(1.5) + assert.Equal(t, expected.String(), result.String()) +} diff --git a/scripts/publish.sh b/scripts/publish.sh index 966cf8f9..ed7a5e9b 100755 --- a/scripts/publish.sh +++ b/scripts/publish.sh @@ -18,9 +18,7 @@ if [ $VERSION_LENGTH -ne 3 ]; then exit 1 fi -docker build -t thecodingmachine/gotenberg:base -f build/base/Dockerfile . docker build \ - --build-arg GOLANG_VERSION=${GOLANG_VERSION} \ --build-arg VERSION=${VERSION} \ -t thecodingmachine/gotenberg:latest \ -t thecodingmachine/gotenberg:${SEMVER[0]} \ diff --git a/test/cmd/pm2/pm2.go b/test/cmd/pm2/pm2.go new file mode 100644 index 00000000..525fc6e0 --- /dev/null +++ b/test/cmd/pm2/pm2.go @@ -0,0 +1,18 @@ +package main + +import ( + "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xlogtest" +) + +func main() { + logger := xlogtest.DebugLogger() + process := pm2.NewChromeProcess(logger) + if err := process.Start(); err != nil { + panic(err) + } + process = pm2.NewUnoconvProcess(logger) + if err := process.Start(); err != nil { + panic(err) + } +} diff --git a/test/doc.go b/test/doc.go new file mode 100644 index 00000000..edc5a4d1 --- /dev/null +++ b/test/doc.go @@ -0,0 +1,3 @@ +// Package test contains useful +// functions used across tests. +package test diff --git a/test/internalpkg/xerrortest/doc.go b/test/internalpkg/xerrortest/doc.go new file mode 100644 index 00000000..cc1f7ef9 --- /dev/null +++ b/test/internalpkg/xerrortest/doc.go @@ -0,0 +1,6 @@ +/* +Package xerrortest contains useful +functions for tests related +to xerror package. +*/ +package xerrortest diff --git a/test/internalpkg/xerrortest/xerrortest.go b/test/internalpkg/xerrortest/xerrortest.go new file mode 100644 index 00000000..f59b4265 --- /dev/null +++ b/test/internalpkg/xerrortest/xerrortest.go @@ -0,0 +1,18 @@ +package xerrortest + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" +) + +// AssertError validates that given error +// is of an instance of xerror.Error. +// If so, returns the instance of xerror.Error. +func AssertError(t *testing.T, err error) *xerror.Error { + assert.NotNil(t, err) + standardized, ok := err.(*xerror.Error) + assert.Equal(t, true, ok) + return standardized +} diff --git a/test/internalpkg/xlogtest/doc.go b/test/internalpkg/xlogtest/doc.go new file mode 100644 index 00000000..5450edfe --- /dev/null +++ b/test/internalpkg/xlogtest/doc.go @@ -0,0 +1,6 @@ +/* +Package xlogtest contains useful +functions for tests related +to xlog package. +*/ +package xlogtest diff --git a/test/internalpkg/xlogtest/xlogtest.go b/test/internalpkg/xlogtest/xlogtest.go new file mode 100644 index 00000000..f720c604 --- /dev/null +++ b/test/internalpkg/xlogtest/xlogtest.go @@ -0,0 +1,23 @@ +package xlogtest + +import ( + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +// DebugLogger creates a xlog.Logger +// with xlog.DebugLevel for our tests. +func DebugLogger() xlog.Logger { + return xlog.New(xlog.DebugLevel, "tests") +} + +// InfoLogger creates a xlog.Logger +// with xlog.InfoLevel for our tests. +func InfoLogger() xlog.Logger { + return xlog.New(xlog.DebugLevel, "tests") +} + +// ErrorLogger creates a xlog.Logger +// with xlog.ErrorLevel for our tests. +func ErrorLogger() xlog.Logger { + return xlog.New(xlog.ErrorLevel, "tests") +} diff --git a/test/testfunc.go b/test/testfunc.go index ba597b25..8467f390 100644 --- a/test/testfunc.go +++ b/test/testfunc.go @@ -1,4 +1,3 @@ -// Package test contains useful functions used across tests. package test import ( @@ -14,11 +13,9 @@ import ( "runtime" "testing" - "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/thecodingmachine/gotenberg/internal/pkg/logger" - "github.com/thecodingmachine/gotenberg/internal/pkg/standarderror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "golang.org/x/sync/errgroup" ) @@ -55,21 +52,16 @@ func AssertConcurrent(t *testing.T, fn func() error, amount int) { assert.NoError(t, err) } -// RequireStandardError validates that given error -// is of an instance of standarderror.Error. -// If so, returns the instance of standarderror.Error. -func RequireStandardError(t *testing.T, err error) *standarderror.Error { - standardized, ok := err.(*standarderror.Error) - require.Equal(t, true, ok) +// AssertStandardError validates that given error +// is of an instance of xerror.Error. +// If so, returns the instance of xerror.Error. +func AssertStandardError(t *testing.T, err error) *xerror.Error { + assert.NotNil(t, err) + standardized, ok := err.(*xerror.Error) + assert.Equal(t, true, ok) return standardized } -// CreateTestLogger create a default logger -// for our tests. -func CreateTestLogger() *logger.Logger { - return logger.New(logrus.DebugLevel, "tests") -} - // HTMLTestMultipartForm returns the body // for a multipate/form-data request with all // files under "html" folder. From 64021252338caabe76740d0e547a7532ae0a1cfd Mon Sep 17 00:00:00 2001 From: Vladyslav Baidak Date: Tue, 23 Jul 2019 15:06:33 +0300 Subject: [PATCH 026/107] Inconsistent text rendering in headless mode --- internal/pkg/pm2/chrome.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go index dfcdc1f9..acf8950d 100644 --- a/internal/pkg/pm2/chrome.go +++ b/internal/pkg/pm2/chrome.go @@ -35,6 +35,7 @@ func (p *chrome) args() []string { return []string{ "--no-sandbox", "--headless", + "--font-render-hinting=medium", "--remote-debugging-port=9222", "--disable-gpu", "--disable-translate", From 0d827e490ee18de4f7bf310762c39ce38f2688e1 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 23 Jul 2019 14:25:31 +0200 Subject: [PATCH 027/107] using (again) Golang binaries from official Docker image instead of standard install without checkum + added a TODO for healtheck --- Makefile | 2 +- build/workspace/Dockerfile | 10 +++++----- internal/app/xhttp/handler.go | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 3a72b36e..401c7088 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -GOLANG_VERSION=1.12.7 +GOLANG_VERSION=1.12 VERSION=snapshot DOCKER_USER= DOCKER_PASSWORD= diff --git a/build/workspace/Dockerfile b/build/workspace/Dockerfile index 2ae20d7e..ecf13478 100644 --- a/build/workspace/Dockerfile +++ b/build/workspace/Dockerfile @@ -1,7 +1,9 @@ -FROM thecodingmachine/gotenberg:base - ARG GOLANG_VERSION +FROM golang:${GOLANG_VERSION}-stretch as golang + +FROM thecodingmachine/gotenberg:base + # |-------------------------------------------------------------------------- # | Common libraries # |-------------------------------------------------------------------------- @@ -25,9 +27,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # | Installs Golang. # | -RUN wget https://dl.google.com/go/go${GOLANG_VERSION}.linux-amd64.tar.gz &&\ - tar -xvf go${GOLANG_VERSION}.linux-amd64.tar.gz &&\ - mv go /usr/local +COPY --from=golang /usr/local/go /usr/local/go ENV GOPATH /gotenberg/go ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH diff --git a/internal/app/xhttp/handler.go b/internal/app/xhttp/handler.go index 52152fcc..ebd38499 100644 --- a/internal/app/xhttp/handler.go +++ b/internal/app/xhttp/handler.go @@ -31,6 +31,7 @@ func pingHandler(c echo.Context) error { if err := ctx.ProcessesHealthcheck(); err != nil { return xerror.New(op, err) } + // TODO return processes info return nil } From c7d9e24c0058f90ec375aab36344c7a6b3520ea7 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 23 Jul 2019 15:11:37 +0200 Subject: [PATCH 028/107] now using Gateway timeout status code in case of timeout --- internal/app/xhttp/middleware.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/app/xhttp/middleware.go b/internal/app/xhttp/middleware.go index 3d0dd6be..72552a88 100644 --- a/internal/app/xhttp/middleware.go +++ b/internal/app/xhttp/middleware.go @@ -115,8 +115,7 @@ func errorMiddleware() echo.MiddlewareFunc { case xerror.InvalidCode: httpErr = echo.NewHTTPError(http.StatusBadRequest, errMessage) case xerror.TimeoutCode: - // TODO status - httpErr = echo.NewHTTPError(http.StatusBadGateway, errMessage) + httpErr = echo.NewHTTPError(http.StatusGatewayTimeout, errMessage) default: httpErr = echo.NewHTTPError(http.StatusInternalServerError, errMessage) } From 0b2312a407fee12c02fff801893f2014b5c352a6 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 23 Jul 2019 16:25:55 +0200 Subject: [PATCH 029/107] better logical operation for xexec command output --- internal/pkg/xexec/xexec.go | 12 ++++++------ internal/pkg/xexec/xexec_test.go | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/pkg/xexec/xexec.go b/internal/pkg/xexec/xexec.go index 4b4fec68..604bb8d7 100644 --- a/internal/pkg/xexec/xexec.go +++ b/internal/pkg/xexec/xexec.go @@ -2,6 +2,7 @@ package xexec import ( "bufio" + "bytes" "context" "fmt" "io" @@ -75,13 +76,12 @@ func pipe(logger xlog.Logger, cmd *exec.Cmd) error { } func logCommandOutput(logger xlog.Logger, reader io.ReadCloser, outputType string, cmd *exec.Cmd) { - var op string - if len(cmd.Args) >= 2 { - op = fmt.Sprintf("%s.%s.%s", cmd.Args[0], cmd.Args[1], outputType) - } else { - // len(cmd.Args) should always be >= 1. - op = fmt.Sprintf("%s.%s", cmd.Args[0], outputType) + var buf bytes.Buffer + buf.WriteString(fmt.Sprintf("%s", outputType)) + for _, arg := range cmd.Args { + buf.WriteString(fmt.Sprintf(".%s", arg)) } + op := buf.String() r := bufio.NewReader(reader) defer reader.Close() // nolint: errcheck for { diff --git a/internal/pkg/xexec/xexec_test.go b/internal/pkg/xexec/xexec_test.go index caeb03a8..b52b796a 100644 --- a/internal/pkg/xexec/xexec_test.go +++ b/internal/pkg/xexec/xexec_test.go @@ -27,7 +27,7 @@ func TestCommandContext(t *testing.T) { logger := xlogtest.DebugLogger() // should pipe command output as // xlog.Logger has a xlog.DebugLevel. - cmd, err := CommandContext(context.Background(), logger, "echo") + cmd, err := CommandContext(context.Background(), logger, "echo", "Hello", "World") assert.Nil(t, err) LogBeforeExecute(logger, cmd) // should not pipe command output as From a524521fdb3bd92e46f257730eaacf855578025e Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 23 Jul 2019 16:40:39 +0200 Subject: [PATCH 030/107] improving lock mechanism for office conversion: now check if context has timeout when trying to acquire the lock + office printer test --- internal/pkg/printer/merge.go | 2 +- internal/pkg/printer/office.go | 28 ++++++---- internal/pkg/printer/office_test.go | 59 +++++++++++++++++++++ test/internalpkg/printertest/doc.go | 6 +++ test/internalpkg/printertest/printertest.go | 35 ++++++++++++ 5 files changed, 119 insertions(+), 11 deletions(-) create mode 100644 internal/pkg/printer/office_test.go create mode 100644 test/internalpkg/printertest/doc.go create mode 100644 test/internalpkg/printertest/printertest.go diff --git a/internal/pkg/printer/merge.go b/internal/pkg/printer/merge.go index fd350f38..d9fd87ad 100644 --- a/internal/pkg/printer/merge.go +++ b/internal/pkg/printer/merge.go @@ -34,13 +34,13 @@ func NewMergePrinter(logger xlog.Logger, fpaths []string, opts MergePrinterOptio func (p mergePrinter) Print(destination string) error { const op string = "printer.mergePrinter.Print" - logOptions(p.logger, p.opts) /* context.Context may be providen from an officePrinter which needs to merge its result files. */ if p.ctx == nil { + logOptions(p.logger, p.opts) ctx, cancel := xcontext.WithTimeout(p.logger, p.opts.WaitTimeout) defer cancel() p.ctx = ctx diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index 9ed66c0e..fb0d8f27 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -5,7 +5,6 @@ import ( "fmt" "os" "path/filepath" - "sync" "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" @@ -63,6 +62,7 @@ func (p officePrinter) Print(destination string) error { return nil } m := mergePrinter{ + logger: p.logger, ctx: ctx, fpaths: fpaths, } @@ -78,15 +78,10 @@ func (p officePrinter) Print(destination string) error { } // nolint: gochecknoglobals -var mu sync.Mutex +var lock = make(chan struct{}, 1) func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, opts OfficePrinterOptions) error { const op string = "printer.unoconv" - // TODO check if timeout while waiting for the lock. - logger.DebugOp(op, "waiting lock to be released...") - mu.Lock() - defer mu.Unlock() - logger.DebugOp(op, "lock released") resolver := func() error { args := []string{ "--format", @@ -108,10 +103,23 @@ func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, xexec.LogBeforeExecute(logger, cmd) return cmd.Run() } - if err := resolver(); err != nil { - return xerror.New(op, err) + logger.DebugOp(op, "waiting lock to be acquired...") + select { + case lock <- struct{}{}: + // lock acquired. + logger.DebugOp(op, "lock acquired") + if err := resolver(); err != nil { + <-lock // we release the lock. + return xerror.New(op, err) + } + <-lock // we release the lock. + return nil + case <-ctx.Done(): + // failed to acquire lock before + // deadline. + logger.DebugOp(op, "failed to acquire lock before context.Context deadline") + return xerror.New(op, ctx.Err()) } - return nil } // Compile-time checks to ensure type implements desired interfaces. diff --git a/internal/pkg/printer/office_test.go b/internal/pkg/printer/office_test.go new file mode 100644 index 00000000..836fe0d2 --- /dev/null +++ b/internal/pkg/printer/office_test.go @@ -0,0 +1,59 @@ +package printer + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/test/internalpkg/printertest" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xerrortest" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xlogtest" +) + +func TestOfficePrinter(t *testing.T) { + var ( + logger xlog.Logger = xlogtest.DebugLogger() + fpaths []string = printertest.OfficeFpaths(t) + opts OfficePrinterOptions + dest string + p Printer + err error + ) + // default options. + opts = OfficePrinterOptions{ + WaitTimeout: 10.0, + Landscape: false, + } + p = NewOfficePrinter(logger, fpaths, opts) + dest = printertest.GenerateDestination() + err = p.Print(dest) + assert.Nil(t, err) + err = os.RemoveAll(dest) + assert.Nil(t, err) + // options with landscape. + opts = OfficePrinterOptions{ + WaitTimeout: 10.0, + Landscape: true, + } + p = NewOfficePrinter(logger, fpaths, opts) + dest = printertest.GenerateDestination() + err = p.Print(dest) + assert.Nil(t, err) + err = os.RemoveAll(dest) + assert.Nil(t, err) + // should not be OK as context.Context + // should timeout. + opts = OfficePrinterOptions{ + WaitTimeout: 1.0, + Landscape: true, + } + p = NewOfficePrinter(logger, fpaths, opts) + dest = printertest.GenerateDestination() + err = p.Print(dest) + xerrortest.AssertError(t, err) + assert.Equal(t, xerror.TimeoutCode, xerror.Code(err)) + err = os.RemoveAll(dest) + assert.Nil(t, err) +} diff --git a/test/internalpkg/printertest/doc.go b/test/internalpkg/printertest/doc.go new file mode 100644 index 00000000..8b10544a --- /dev/null +++ b/test/internalpkg/printertest/doc.go @@ -0,0 +1,6 @@ +/* +Package printertest contains useful +functions for tests related +to printer package. +*/ +package printertest diff --git a/test/internalpkg/printertest/printertest.go b/test/internalpkg/printertest/printertest.go new file mode 100644 index 00000000..9c909856 --- /dev/null +++ b/test/internalpkg/printertest/printertest.go @@ -0,0 +1,35 @@ +package printertest + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" +) + +const testdataDirectoryPath string = "/gotenberg/tests/test/testdata" + +// GenerateDestination simply generates +// a path for a resulting PDF file. +func GenerateDestination() string { + return fmt.Sprintf("/tmp/%s.pdf", xrand.Get()) +} + +// OfficeFpaths return the paths +// of the Office documents used in tests. +func OfficeFpaths(t *testing.T) []string { + return []string{ + fpath(t, "office", "document.docx"), + fpath(t, "office", "document.rtf"), + fpath(t, "office", "document.txt"), + } +} + +func fpath(t *testing.T, kind, filename string) string { + require.NotEmpty(t, kind) + require.NotEmpty(t, filename) + fpath := fmt.Sprintf("%s/%s/%s", testdataDirectoryPath, kind, filename) + require.FileExists(t, fpath) + return fpath +} From 08e7a2c0656a96ac6a72d00dd90124ae840ce883 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 23 Jul 2019 16:40:54 +0200 Subject: [PATCH 031/107] fixing lint issue in xexec package --- internal/pkg/xexec/xexec.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/pkg/xexec/xexec.go b/internal/pkg/xexec/xexec.go index 604bb8d7..b67d7b5a 100644 --- a/internal/pkg/xexec/xexec.go +++ b/internal/pkg/xexec/xexec.go @@ -77,7 +77,7 @@ func pipe(logger xlog.Logger, cmd *exec.Cmd) error { func logCommandOutput(logger xlog.Logger, reader io.ReadCloser, outputType string, cmd *exec.Cmd) { var buf bytes.Buffer - buf.WriteString(fmt.Sprintf("%s", outputType)) + buf.WriteString(outputType) for _, arg := range cmd.Args { buf.WriteString(fmt.Sprintf(".%s", arg)) } From 5feff0d0ec1bbc169550ffad5cfd1f4904b8502e Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 23 Jul 2019 16:50:24 +0200 Subject: [PATCH 032/107] adding merge printer tests --- internal/pkg/printer/merge_test.go | 46 +++++++++++++++++++++ test/internalpkg/printertest/printertest.go | 14 +++++++ 2 files changed, 60 insertions(+) create mode 100644 internal/pkg/printer/merge_test.go diff --git a/internal/pkg/printer/merge_test.go b/internal/pkg/printer/merge_test.go new file mode 100644 index 00000000..94b6136f --- /dev/null +++ b/internal/pkg/printer/merge_test.go @@ -0,0 +1,46 @@ +package printer + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/test/internalpkg/printertest" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xerrortest" + "github.com/thecodingmachine/gotenberg/test/internalpkg/xlogtest" +) + +func TestMergePrinter(t *testing.T) { + var ( + logger xlog.Logger = xlogtest.DebugLogger() + fpaths []string = printertest.MergeFpaths(t) + opts MergePrinterOptions + dest string + p Printer + err error + ) + // default options. + opts = MergePrinterOptions{ + WaitTimeout: 10.0, + } + p = NewMergePrinter(logger, fpaths, opts) + dest = printertest.GenerateDestination() + err = p.Print(dest) + assert.Nil(t, err) + err = os.RemoveAll(dest) + assert.Nil(t, err) + // should not be OK as context.Context + // should timeout. + opts = MergePrinterOptions{ + WaitTimeout: 0.1, + } + p = NewMergePrinter(logger, fpaths, opts) + dest = printertest.GenerateDestination() + err = p.Print(dest) + xerrortest.AssertError(t, err) + assert.Equal(t, xerror.TimeoutCode, xerror.Code(err)) + err = os.RemoveAll(dest) + assert.Nil(t, err) +} diff --git a/test/internalpkg/printertest/printertest.go b/test/internalpkg/printertest/printertest.go index 9c909856..bfa2a92f 100644 --- a/test/internalpkg/printertest/printertest.go +++ b/test/internalpkg/printertest/printertest.go @@ -8,6 +8,11 @@ import ( "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" ) +/* +testdataDirectoryPath should be +the absolute of the testdata INSIDE +the Docker image. +*/ const testdataDirectoryPath string = "/gotenberg/tests/test/testdata" // GenerateDestination simply generates @@ -16,6 +21,15 @@ func GenerateDestination() string { return fmt.Sprintf("/tmp/%s.pdf", xrand.Get()) } +// MergeFpaths return the paths +// of the PDF files used in tests. +func MergeFpaths(t *testing.T) []string { + return []string{ + fpath(t, "pdf", "gotenberg.pdf"), + fpath(t, "pdf", "gotenberg_bis.pdf"), + } +} + // OfficeFpaths return the paths // of the Office documents used in tests. func OfficeFpaths(t *testing.T) []string { From ad4d87a138f43d8824cb0cabd5e4929ae07715d8 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 23 Jul 2019 16:59:32 +0200 Subject: [PATCH 033/107] improving context timeout tests for office and merge printers + test with only one file to convert for the office printer --- internal/pkg/printer/merge_test.go | 2 +- internal/pkg/printer/office_test.go | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/internal/pkg/printer/merge_test.go b/internal/pkg/printer/merge_test.go index 94b6136f..7f18a1e4 100644 --- a/internal/pkg/printer/merge_test.go +++ b/internal/pkg/printer/merge_test.go @@ -34,7 +34,7 @@ func TestMergePrinter(t *testing.T) { // should not be OK as context.Context // should timeout. opts = MergePrinterOptions{ - WaitTimeout: 0.1, + WaitTimeout: 0.0, } p = NewMergePrinter(logger, fpaths, opts) dest = printertest.GenerateDestination() diff --git a/internal/pkg/printer/office_test.go b/internal/pkg/printer/office_test.go index 836fe0d2..d2449dd8 100644 --- a/internal/pkg/printer/office_test.go +++ b/internal/pkg/printer/office_test.go @@ -32,6 +32,17 @@ func TestOfficePrinter(t *testing.T) { assert.Nil(t, err) err = os.RemoveAll(dest) assert.Nil(t, err) + // using one file. + opts = OfficePrinterOptions{ + WaitTimeout: 10.0, + Landscape: false, + } + p = NewOfficePrinter(logger, []string{fpaths[0]}, opts) + dest = printertest.GenerateDestination() + err = p.Print(dest) + assert.Nil(t, err) + err = os.RemoveAll(dest) + assert.Nil(t, err) // options with landscape. opts = OfficePrinterOptions{ WaitTimeout: 10.0, @@ -46,7 +57,7 @@ func TestOfficePrinter(t *testing.T) { // should not be OK as context.Context // should timeout. opts = OfficePrinterOptions{ - WaitTimeout: 1.0, + WaitTimeout: 0.0, Landscape: true, } p = NewOfficePrinter(logger, fpaths, opts) From 84c1175379a9d12968e7f1d2f297f7812d22b055 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 23 Jul 2019 17:06:30 +0200 Subject: [PATCH 034/107] better debug logs for Markdown printer --- internal/pkg/printer/markdown.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/pkg/printer/markdown.go b/internal/pkg/printer/markdown.go index 2332db4d..2b6e9ade 100644 --- a/internal/pkg/printer/markdown.go +++ b/internal/pkg/printer/markdown.go @@ -28,12 +28,14 @@ func NewMarkdownPrinter(logger xlog.Logger, fpath string, opts ChromePrinterOpti } dirPath := filepath.Dir(fpath) data := &templateData{DirPath: dirPath} + logger.DebugOp(op, "converting Markdown files to HTML...") var buffer bytes.Buffer if err := tmpl.Execute(&buffer, data); err != nil { return "", err } baseFilename := xrand.Get() dst := fmt.Sprintf("%s/%s.html", dirPath, baseFilename) + logger.DebugOp(op, "writing the HTML from previous conversion into new file...") if err := ioutil.WriteFile(dst, buffer.Bytes(), 0644); err != nil { return "", err } From 3ee4540f7d198ace8b78a34d6b7b2c038179a46c Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Wed, 24 Jul 2019 10:20:36 +0200 Subject: [PATCH 035/107] fixing method HasResource --- internal/app/xhttp/pkg/context/context.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/internal/app/xhttp/pkg/context/context.go b/internal/app/xhttp/pkg/context/context.go index cf49d205..25047b16 100644 --- a/internal/app/xhttp/pkg/context/context.go +++ b/internal/app/xhttp/pkg/context/context.go @@ -3,6 +3,7 @@ package context import ( "fmt" "net/http" + "reflect" "strconv" "time" @@ -124,6 +125,12 @@ func (ctx *Context) WithResource(directoryName string) error { return nil } +// HasResource returns true if the Context +// has a resource.Resource. +func (ctx Context) HasResource() bool { + return !reflect.DeepEqual(ctx.resource, resource.Resource{}) +} + /* MustResource returns the resource.Resource associated with the Context. @@ -138,12 +145,6 @@ func (ctx Context) MustResource() resource.Resource { return ctx.resource } -// HasResource returns true if the Context -// has a resource.Resource. -func (ctx Context) HasResource() bool { - return &ctx.resource != nil -} - /* LogRequestResult logs the result of a request. This method should only be used by a middleware! From 2be9ae7868965c3ca01d4e1d889671eb4b73eae8 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Wed, 24 Jul 2019 10:58:51 +0200 Subject: [PATCH 036/107] updating dependencies --- go.mod | 7 ++++--- go.sum | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 12672302..0f1102b9 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/labstack/echo/v4 v4.1.6 github.com/labstack/gommon v0.2.9 - github.com/mafredri/cdp v0.23.4 + github.com/mafredri/cdp v0.24.2 github.com/mattn/go-isatty v0.0.8 github.com/microcosm-cc/bluemonday v1.0.2 github.com/russross/blackfriday/v2 v2.0.1 @@ -16,7 +16,8 @@ require ( github.com/sirupsen/logrus v1.4.2 github.com/stretchr/testify v1.3.0 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 // indirect - golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect + golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 // indirect golang.org/x/sync v0.0.0-20190423024810-112230192c58 - golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect + golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect + golang.org/x/tools v0.0.0-20190723021737-8bb11ff117ca // indirect ) diff --git a/go.sum b/go.sum index ececb92e..cdc4a2ea 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,7 @@ github.com/labstack/gommon v0.2.9 h1:heVeuAYtevIQVYkGj6A41dtfT91LrvFG220lavpWhrU github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4= github.com/mafredri/cdp v0.23.4 h1:ffp4qq6slfCL4rFWBDeRHapkLE776gER4tX5Z3LS8CY= github.com/mafredri/cdp v0.23.4/go.mod h1:hgdiA0yp1uqhSaDOHJWPgXpMbh+LAfUdD9vbN2AM8gE= +github.com/mafredri/cdp v0.24.2/go.mod h1:hgdiA0yp1uqhSaDOHJWPgXpMbh+LAfUdD9vbN2AM8gE= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= @@ -49,8 +50,10 @@ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190607181551-461777fb6f67/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -61,8 +64,10 @@ golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190609082536-301114b31cce/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190608022120-eacb66d2a7c3/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190723021737-8bb11ff117ca/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= From 758c3be3c51df555ebb8b90e433ca797617c7ebe Mon Sep 17 00:00:00 2001 From: Vladyslav Baidak Date: Wed, 24 Jul 2019 12:52:04 +0300 Subject: [PATCH 037/107] Added Noto Emoji Font --- build/base/Dockerfile | 3 +++ build/base/NotoColorEmoji.ttf | Bin 0 -> 7297112 bytes 2 files changed, 3 insertions(+) create mode 100644 build/base/NotoColorEmoji.ttf diff --git a/build/base/Dockerfile b/build/base/Dockerfile index 102f6873..ade10cf1 100644 --- a/build/base/Dockerfile +++ b/build/base/Dockerfile @@ -90,4 +90,7 @@ RUN apt-get install -y \ fonts-ipafont-gothic \ fonts-unfonts-core +COPY build/base/NotoColorEmoji.ttf /usr/share/fonts/ + COPY build/base/fonts.conf /etc/fonts/conf.d/100-gotenberg.conf + diff --git a/build/base/NotoColorEmoji.ttf b/build/base/NotoColorEmoji.ttf new file mode 100644 index 0000000000000000000000000000000000000000..69cf21a1a9bf46e1194ba280a08f44ba509b3975 GIT binary patch literal 7297112 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�$Ea_Gty8L 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%0APoURsE2mqhvY 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 z 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�TJ& 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�pa}NCN!pc7aI1)lZ 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%0AkcK%fCivI1A7A@IJ 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

X$pHNa!vcg;l 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 )B98heHKT&|D{w5jdC zHju#6L~m^w$bjOnZ;7a7-M!RrIbjH|fiFPp);%&D}cjxjU5IYWZ=GvW0kzx5+ts1s(eXz{;F%6=5 z{yzUv!qo~E=#qlnXTymr$eRrz{3JQ`paU3LsFdb;)VX5WY?pwo9k&%9%e^?@fwwni zZZ`n2gv3ui%|ryUz<|Qw z@Cy~G(RcKL`(vqJX{cqRVe*iQ#SFhiy2^9(N5xsw<0=C{VFOacsBA|cIEkblF~_;_ zu=t$CFr(v;#ov}~HX8O+=5gbpFtIETNks?YoP@XEcPFV1(vYyoQa(hG~fjI!t zot%FB9k`3~pCl*`b$m*URzg@Pqe>{EeuERb>=pe){TQ`=f!#4IdMfJnB-peDj5XMz z@c70xggg3dM_?LV0-_2H6<%*$x|L`}GinK(pHd$@*|=j$EOwUr96JBy2)S~yo})W6ilAqNrm+G2*nqDS@f%CXVMo>!lzgzlo!3490^i6T|a zwNnpa8UkCup3$ihELOD2gkgz8AD@r>W+ZjSfG6owTr5Ga_WP=3Z!M6tV3tVKn89b) zV3%_;8XdXw;`dm#wJrO+po$RuTGvR)*k0a_{&%54fg8k??+7DSzcJu`${n0gGhxN# zFVc!_c^Y?$B@Y>x-(hM{%t!nj>&JWjuto7$ZV9(##3g_$gN@2m;~Gh$3KJaF|A8I_ z^gL-rEIn^6ixZ*GD?yE}7vVI3v`w4FNLVdcQ2_mkN_vs~Q2RIC<^GhQUSU69Vz{-(r-pXYD64i1d`O92@UT}bu+G}dzyT!wGTC+Ltl_Z@Uz%llUGU@X1J*l zh*hP4*f4|82PDS1R~^QKvSz*^ArMQlx?{4&V$9W>CmhrmAFT_nZ~>sTc05fIIk?1y zQ$IvlCfTgje}IR<(G^A{DAr`xlvmY%HvucZP~`Cm02}^s2Z+jqJ{Nd2vd^N`XpRbt zqdGN(Dx%4wDX+tdhbCKBVZF*Bdin$p%iQ1UF7IwrcBXst>kZr>+N@oD$*V+SQ<~+C z5Q5ztv86RqP16FW(lcy-yG!?PYmS4~kF?bPn*{;PH~%LK0?hwe5D071ifGh@g7I&e z;)bz2P%oBm-$flVrCqY+J@S=2OXYnlRXi$Wy~;jWXA1e2eYQybXq_r*o-70f^&u6y zp*1?%5v=~D8W9b8Q2Hs81b(+7S+8nYpIQaKdc}Z-e_UHyHG^t2psNbdr?^%~1U0FK zwtR_f*N*PcjqTEp>o$b?xFq(OKojJ*SCMzgoRneqd zQj;|l-9wMGK5Lyw_R<+os0?+BNf|Jks|FR73i^B(T54ijYGhsN5?$)}xYWiw+{{~7 z!JbeiyU@tC)GfX{2wv(D@92~$s8?)h;a#kzS*)U7tYv_99(onp>i3kw<(%Zpn#{|p zeCe4)8zZBA;#oN z4(QWgcD_7KzI&eMzgSj#-PL^E(}uQM?vs1n*IR04e?2gG8fShzGi>RU z==i*iHamm9Y_0#`bTF%KO!vlLtUKB4YXHQ~dxeTQyb#5Ozq)_Y#(&Dc#Xl(d2NV`3 zLLg87>W?%2EjOwmW#>>PVnZlo2igw*qf{*Urzq0L-q7Fpw;D9g^8ZMGHRu0g>Kt(65f$QF>W zrLJ#4lqSZ4Rd-d-=gwd*pGuVq&}MCm!!?pux_;Y<6OM@=LSjVBO2~VukKjn%e({}^>HS68ep(QFJ;l_ zTpSSV=gKI9yyeEXkWs*?>I(?KgAY$f;hSstn7v008FqbBh8pYi-NWzRbVu|NP6>Ww zdOCJ^BrJ6(*AQK0(TNI|B@C;Ur9cWvwl=bV$c>lY4?7GC2F0%<3j-{XJRmz`w;MmO z)C6PL;!V#$Or&V*l1?S-A3Hq~Aq=|%4uylA<$MW4CNDm&`ViED=V#I7hyCM7F}|Q) zEYaomd3(FB34_=VYkH$8DVOiNEj{@x;oui!nT}E9PkXTW3KXy~(m9oi@r2B&p>}~~ z_pp37ph;#4&Zr9lcB_87bzv~Bwz<5YoJ5H^JnV(Q8B4q=0#*=MwLd#lFTN&eA$P5G zr=>vxw5Y~OyWCBZ61$~EI+W2AT-`v5)bGHAL%oL(zK5wy%DVKlZ(OK}h3#NF*oBZ!y_i$@=Sl2Mq*d}PB4oo9q$P47)P04a>UEDgUbYScEm+Xz3PpJmm!^e5rFz}27{OBUO zoBV4xtJ^FgCJN&#CitU5Y4p<8YN@gD=ybXwD9uEUo1N+QfUv-L5oGT*RkK?o=>}@7 zxLrZKQ}>H}I8*N5za(zVT_NXEz+DbY%W}nPp{PRI3s3HdSZzZCEQ!lp2A6F0>JSM& ze<0@Ohvuapf=$*8#pfD-w}g-DyUMbTZfYS1z16=E)DGDt7KU^9Amr%sr-> zsmkEfdHgKL)$z>>663@8?hGjIbY=v~<1$TvT_{sI9S$@#u#KK2`c!?CGnpmeHoTjc z$D8y48|BXt#8rFeqg-^r2bZk+R0`YxGFl#b6>0QF z7MZ>yxnwEB)@SKd`WS>CmCP{<>T=T*Vk2lnG$4fBL-=|KxA2`*mgRj+cGRI{Y#31{RS_g4Akf?t z^W6UdvTKf0Zk3;>U!fSHuR(Vt*Iw}b6=tz9IFLk?Sv6A5#_bIoQruJw>Ab_G(71rSuFN-hHCe!`dS}q z>wKw2{+S#J2g2Ipn-?F4lh_|ulQE;0$3jIJIV$D-gg88X9nC8yJisP`79tWxg3?aC zTU^`U59gQ2;DX;%D;$iikT(U3YU*#lCbcB*49}#47wV{zyjB}<1E3Yj^oA#7=pC{L zdDuZ@+85-Vz3fc=d1 zKy7r0eF>mqA8P-cj9f9=(mc2w-k|N@kMuvem>8y|K7wqdm7_UDlA97LkAHGf5Qnhl zw1`XD;Uby4tcDK{fluQp=m_RrbvJnlh6(WR&{=4DvxrBe1dKgD{7_N`BU!epA?8D) zQE$bc*HRZuicnHEH)s3%e6x!d_i#rIVOOR3lWKDh7#7XyZ!hi1J3aNFAV+B$co(L2 z<)lGHIW?Xw9e(kFv315~OzcF(2=Ve9`*}@Heg|nkpP1jUjoMg(`n>*kSy$VCQTL zfe@5Ijmv5Xe4VR=oV-hSQY`dX7(s(YfX!gaGeQzQCjS?-~KM?C`?AA!2tC-FRW`p5+}4 z$qNnmgpU=N2gg1~cH3Qu9{}4bE<&VMOcB$NUHSNNN6G?5b}~*whJ3mhLR5(e=CSjB zsfRfXU=7U5jYRK`et{qY`Eg~&+L6gM<*r8#!6(%5+c*6oKu7 zx|Q&+UwLtppwXp;W8=1M|K8+K^6adlsc#xN4_A@+DXMwTq2g%*dza;E5zs1JN%2CA zLYHF}-Mh)l-AUD{ImRHhztOD%TS^ue$BV*f_~3{E2(}v_>hG}m21z;!H*RcWu*?d%AwRE_#Gdv zbiO}8LCUdKaO}xR#R`9%*@ql#TIp6fa_O@gX7n+2c>qdM1kYzChpMMMBIvb_)u3H6ntm$BXX-E7L^fQXM+$K zC}fH_dymrT9pl1+(817k_UFb0oQJQj-SsSaHCQW!M7=eRJ+oYjuO4c!@;Mj1duJB> z&h`T?>``7Iz9C2qEG!XXlB!z~u;rzMTrjHWYv7yH$LdJ#jdT^Rw+mPFXqd(L^gm^T(=CvE zh{c|W@#3N)zb;*6UZNo&FZ$?t6_Nv?`*&XS&_KekIwCMQs!@p@CvySaFHV#edQIni;{42UU_B2c;lh(_-FtP($d`uaI8xmU0K zTqs*FJp+jlR8LANU`xY=Wo@d;fA^y3* z=$z5Rh)p<+oIF!KfrW+%kwz6~Qa{;PIQV`5-kF1!x5d%5h0sJv6c*=*KtLJq6-Jj0 zM9XJ9!Up?hhU4(QS%-fp3L7zxRUkxc<_k5?T+J#?X^{HbJ+Sbe#=qOqY04d>kufA0_-d+NfzMU~5ZcupG@3TwK1T=~ z>;((+>rovuWj(j;4HxFJvfg40VY zTo{(p!_n<1Xl*2C)E^nb2&%>7iuY3V@BaPf^LfHui=v3^o1dlqXilo>Re5KhD{4QL zsJi7J6KJ9(Ay=ZcEv&Bcq*bP^0l&Rh{@+2ypZ_P2(f>b?ab>=EWv&=%LAgAWw=!EW zI~erWnsTlXs$ZIg>Wj~gn(r>Uj`tcimy4HvhCt0EA@>8X_x+3GDX(`uFV`JQlNk%6 zNwWifFE^dfS8Xr1-M6QWyX)0wyTyxR$4|q-Y`raMp-yY;H zk48*(y4>z(&kuOa4R}s>x!>$%-t43=40=s=xLj|i%ny34{O}oTb-db4*q-tqZ*{m_ zkDaTgT5SN%RZ(?jk}lN(Hzs_c`Fu6iLJe@XigKosYPy0F>IO4jLOxndK2ku|pG!7Y zLa{dLH(y1ySVIM^Igm@*lSMjItFbiTxl}_nUP`fC4_vCF`qc#7ZKpo&rTN`MbJ$I@ z-$^rDMYUW<^{1cqZVYt&6Ld8Kx)=tX57C|u(C&3m&(?FFZ$u8%+b`EsJx1e&D`^y+MA=^(``n( zvjN9Tp;y~c4+pVJ!=C$dK_@F=i^HCGd$BXU?hAvSc50lx^-hXHY)d2F4+rrJ{kC&$ zinC3kGu3o;3B;ArM9nG0O(}ner6ZkWriSHVH(;X$cr(Uyx1>1>9gsH7`wctj7az0v!!{sPbl%@!zXVHRcS^cX;7nB-#UcDO1#kY_JCZ z1$x-f&tJn&U+TYS|D=DwCzOfcKV${05Iacq`QIzPknCP)@fSiudj4jt;C}-9{?8Wk zMiR6YG~Gcz|GCTmFdY2Vi~P<0C*47bfT1Uo|53z1Hm9h+V(9<(`qh7gvu?fk-Vc_4Yfc*(jy3;;jaeA(Ak*#5-Zu zuL+FsD40^)uAwEi!svi6yvXqdlwUO_b{GLYt-?RUfoTJCzgA813f|2I1KH39V9m0D zpHob{CRBCrV5KofSiipPUV*K)T0~DOOf^shgk@mTISID zaLeZdW~$gSRFK8|XBjTbV|Q$uMrG6mZbxXE?7t3o)JNRla$P85A+We}pT%8DG&rwGRk+AD?mFH}KyFYUfd1h?ECxAsGh-TCsvG zZs2C9Vy3>C=FayTuTXvI?T-`9o!>HEpla?tNSk{j>f3&IUpLk{HwP~ z6HRPCq3eNa3%^GzSDU%L_q>j-E9&LCxeh*G`lt8gwYKGc?!KZC?xhBssc*WKk89n8 z&@zZasfF{540pD-@o@1H;zeUFwQh=myGw;!EL?Bj3i7WI{(wd#-fsRqDRGz}nje>$ zU=*>tLUYzq$gfJbJmUgW+U_Q?lS9fWD&R9}XQBhV^T3OEc zuJXOv=2^LSB({ZP4{c+qfKYKxQ)^*eV_9WqCxsa52Yz#!Ottn*92E06?%H zzG4T@J>1cP`Yaof#0G?3)>h$Ztbctsrl5LHu~G2(T%TrpQC3ey1p-)(Ow`I$L&71& zeHXtr_Z}x$ORc8NAd+C2Lb28MW_w7@DR3QmV;Gi{DZH#wgv;^vk7-83qx|!4uZtu_ zN6~q1{W=3Tuk6M)=V@~MGP_5r3|td+IM+8!licPv;ZiXH-`--V?9ArlZEmfoc_Bw3 zQ(<^PZEM*TzqH~LG$`7NWgDoM3Q{DG9o_a5IAv>j|Ta-lS=Gm01du)*&o=nCV zlWE9fW1BT5?1gQ;#%sb@R=)iWoE)<~sozOr^{bmT|M(4BDlF6Y$NpSp#&mQ1!5{aP zbl;HJ4kfZBn8Z!-;_+Aa6i?aa6~-)^pJEsPR<8eGPX!&$cZIO=R3yTEqDm|@v@2PS z5gvq1+cfW-@8tNW(*z2j(QO}(ueod7xI=b=A|b^wcF%}=3q;J*KW(GTimFQON3dh! z$4bb*>TLoYOEdXzbVfSaIl3pk+I9KD73^53`l~q=?{5Mir$h0?+~{vv!s7?1`MMh# zIy#;Mek9eNvE{FmzwQB9F3wKkKDgR>BWMNE`qog?(u!~=Q2}8D4Ae6cMt`+m? zyI{#s5JJtS7HS)Gau)VA{r+-v6ehC57fMnR3U+Y6c)t#Z^mXmv(S}mvOrK!^S!$Y* zFqeLdm2hjg9QFmGv+ApQQGG^WgDtt=L>Jz@xTI#$%8$j~sAzRUCD*%c1n z;bdJ`o2Jb~YIBN0SUJ(daQmLSvsqUK4*DZU8EIpB>^`H+`ecAK(Dwsv{{2L}oJexZ z#eLs0Ee~7FU4a8N^5Gk>{2Mqj#YA8q4YhVGUF!bsZ{F|m0LD|(@28q&=8c5X(zE05G6%+XJYKxe_CAH}9QL3|Da>0~OM5uZjyFg`qgp;T$zM>C0%2-d&?1gVep zfo|x|S-M2yJS#_G^t?*B%RyS;$TXzAHmdv60c*i|5 z!pq->&yO<+MLG%4>&_aYZ`v0V*%Zbj6c+aW z$|@e1m*hCUOc{Cfc%xV{ybq@mqlPSOZ{uOn$?cCiUuTKyQT{-Km96?T5`CVr(2wFC9h2 zT^CmL)}O)7zmc@+VskoO&JV>r+DSi3v1D+J3uj`3xgpf`n`Y@qiIe7WarMYmN9u2> z6?s+Q_7zD|fI1?MKgFrf0Gxn({* z1tH#vK}j;F5};ZhUI>P!hCo4@VC&|<%`o(ZbL&VJTB$XZwKk2g3+t5v_SiX z%!S&vyG2^qEma<0aVw*EH8c|0zF-3V@3k15#dX6GbDmG zKe*(R|4=sYMDX#05|)OXVr#Nge2KeP=f&lnqopnB6PiF3)No7v6Qm*zCUHz>_$cx3 z*GwKsZ$m+6>rR}~O=Y!-bn=lvS6A}Yh$+~&Kct#Ey5DhEMq9$vlOK;zg z0>Pw?PTED)XM=;6ozFuUxexnH4l)uJS{Yqj7(NO~N8ac9#mHPotzPY&>@@=*T!4-0 zMUO@uuOzgeM)ymr%?A%nxdwU7Q~*r+DPpa@A-?CHmLF>0Zq4W1HuaNtpK&ft;?p@% zrDJVb?S67mRNZ*{7*3jbh7w|un@z|I%hO|>PG>Aj#^6l5Uhand3e=ayV+{+t@0DLw z{ZZ~DcZ74WQ1iXP%FR-I6fqy*i_6Kx*EC}!RKVyT+qNUmM z?e5vfQ831+2A)iNB0T2h;>)OE^kGSTh&MhW#SN#scMg~GS(myB5BQFxBXPchv%Gs~ zh;^*3=}N^z2lMz_>2N4fy~d~}RwZG^MbLt^Q2>T@h=e|v7-2=;?b0n)uzCfoA1+OQ zT)PEEk*(76aHk7IF{E}!LLRd90F4i<^gV>Eg8v&xOW^T;0%`vnz{kkst+@l=Cl@eR z0JmTOzedyt%_wfo2w_fNE>sfHRKnY|{mOJLQ-r}_ut>0AK%+`bm!4I+ zv`HebLbRAmj(kY-7qg^~;t@i!k-|{3Wv6Tviwr^ObaCr65vW15XO*mNhMY~NtX+|i za+Zuvvb;;Vn0DSL)mVuyi83yQQijDUP_8}83U#BjPY$)(7T;Clnk?fQ%^mVJJ(>*7 za<~IJOract&@EP-IQj4%%iK|ijA3iyZ~1W-HT28!Qg-Ju9r$&4}W<1VHOr|2_CSX!qIXbA)MhX~e{2|wrxy=MS!t`T`^~Y={ zu_$M7fCfvhI&OqAsg)$~t1#IQ3#?~Lz`PY|hP`l}n{>1>SC208o+VtpE~>LEl?j+6 z$((oB5&6Xp<~0Q2E(xX7Q~Wgm?#dB%%mmI$0ca*l9%dr&nvU>Vh9 zK?X@7odmD-Sf|n075++Hk)l=K-u?;1dQC!rq@qJ&P$0d;kTI&wO!}WuTz&qm<6bmV z!3<-LL>-Rw&-O6I4qT8-tYmpK4{^M;P#|Q4{Gx`cE>vaVJMU{L+JzUwi5vXuchp`> z;#NhtAr%;N5z>j&k9&no^`3l(ZYbG$z*AkohB{2C63S&6>4O1aUKb8hfU_5j`w)h* z;)Fh`3%eCd0m;R#F`%2)?lp zNxTM?zbZW>0X<0#_rwBl?1gmVL0~CC^%6n)l0<(UL;EL?43f@ulfwC$BXW}^aT3XV z97g>op36m<8QOf<8iAh&hZg#`^YX9pH5So8Y3Km^Dnz^ka$*j8G`su*k%T}BMxoHP z4T`Ie;GjYl)@NYGzgTmWY6hIsy40h*r~ z{g3!x;=R9$#pC~_{{K;eMke~dr~hU34RruLD{&+h0swG0{)4z@f=B{c(ZO4rio@SC z&$_o-+nfgH34KnCJAEx1_5vaTC`gP#ys2BZ z@3dQ}-hz-+RPl#@^hQb#3$`Z2ccRVYbIQ{;zNZ~M{lz9B%5HF)X`Q8j|AE8Ugc~K- z_FKH%=O)bKcz60G@&ujaS!|R$(->x{&z~uSxG)TVi45Eh-Sh9U3-j2gzZa!c%+;f#m>R8YJgZw{HFN`;?uz~L#nqkAE=Z)nT0TV ze3cf9K!W*>p{W1Q?Ont+20W~@2lg2j;vO=}h^cR(u^mBV%_;?^q*!rF=5)zhV)T`~ zY2OwL7JOKc!blzsvz}tK6b-u6fOgZoF?-sKlVDT~3Bp6Vd~hr|b)M2*1IiFx_MIe+ zw~w$19A4jM{vvTQ2>8Pg6LT6^w=zHxohakh-K|}f15a9&{?+!OBF{KaDYWc}#vT4c zf<)?<$^FIPd<#^3a|E)B>DRt9Gn4IbApL=n%%Ato z|8+e-eu9{qh$%$?4Sp{DOZ~`Gj{TR$QrPD~0Vio?TStIEm=cmIK@4mSJZr*Dk zwYp?x|8QW^#6)xB#C6Ekb}O(9ghk#+g7$eu0Aa24Eu*|W;9DMzWHd)6l0G(A90a9K>pa2k%W?c(Bv11O9Hr9-Ncdlj$B`osB zX^5IUv&1)6c$g7H^2Ue^H~u7%hIV$<@uc5xDR9RIeJ1k0m6q^Lto8^$ajPLW$V|## znBV41g1S`sqyKn`a#;@J)jM%bc5X6^QhdsG8_E1=5z;ULWu_!v0X_V*AF1;>qMw$l z&w{CMJ!xQ2`lkK*QBf#L6F+L>2-;<{(vef}7RcHj0t3jrEv70S1r4QKi-JU*wbvP; z5iXgs(4>yHgr!`^vQ=0@W&3+M-;xjJ{qk*S!xFKNNqDW0t)=1MEn^6Rn}#uWY8OPw z_8(_l5JM=i;E&Dpw)Q!^1?hmh7}W+NDs_47rP48Fumyy&>IblA4buim7_!CVV304D z{z%^@r+hKxw&m516Y^T7_8kxxj&<*35Eg#6&I}?adxz%!8I8@Z*B7pphvGpbAtcuN z2;J@jGNxYDnZ5$$NXfiRqA`BN_T#pweSdU9!l~ECm|s=OX4_U~g~p3KyI{)Jak1w; zRB}QY*ZOyu!M3dG>-`3&&V>6RR6dVs@zh8%_LDmMDSE{fMgoFDLfwk?GcK$;>v|qu zUS3b*xIZK!)F(>I+E+vlY9pb3V_|rp@R8aox@JoqXt^|la@6h{U#vH51-c}pR9V#O48Y+ z^2MsVbzYA$6SwAJZnI%>g;A6r8^ROIR^YsToiE?ke|NsDGuf|AA8Ydp$BWv;RA8O1 zdzF{ByWAkc=Upi;ozKTjuSXP1*zZT{p7ogz9T<(U1^OGqkO+URhcTXws?S03v@dAB z+h%G!S$4T`7d*g%7tOT|jJ)(b`NjxlH>vq$gg{OCNuSsEdi~?~j}O(lJSNdIaZonZ zON`bB&a^G4ugW{DpL?j{4!NBAsm{m)W09 zgLi+8@*Xot`){9;6^Hz}g^k5l*3LO6m<^a;ZdhL~+4 zO@CWo%NHTj}B{U36knPz8EYfHLR+K=|~Ks?Knr z85)84$IY!o%_=Q22xD;jIGpy$qmCBA5{B7K6RuDhvV&yV{CTa-T}wy;eeiy1)>o=& zRUbtT!#2 zB5&+CN>_9ylcvLc;UB!l4JoR2jM+~rP`S>zr=lWq-@7zz4A%UP`BwAVaFz%H6iIF(>7JFZ9K3Ai0l7{c4fc)SJK zG|P}|56<8gdx_`7iwU4>dGUh36l&Cj2eTW3i2bD!ga-<5ar;?i*(H&!MC{mi8+NB2 zxprT!CnhH3o{3quPP_n@(V7v>2X(#jKch2!r>5w^4mBm{m$1*pQj*`3^SnkgZ)O3o zAk>lRo8<|&#>>tFi)jvguqg8oA&P8*?@cYj#|MR3C1@#gUK|Y_%ebNkLwAK2``l;g_DXEsw>1~fN zJjEk}O?N(M;&w(UEnP?*>gMeSv;O0bfY z=g;wyhLMgQiDC>DOc7sVC3F%sJYxi+yVk4G%K-$TbpWhT!}6XlS5=&lmtPM z3HdutzSVbBowq-MXC-iX8oeW(FU1OXXyM^)1_(&~48J)lbI3eX6kJ=)8n0wJwrW$ABN?_`j@jtFBYmsk znv)IvX#~lG@o974D8v+AqRb*~Fz>tKJGwyKz0Y8yPt5pR{={Z+l& zHmJPI=x5{TVZ2YgQ`MxIy{#3}Y;zM;f_Rx`e%08^s$)dWdYl{{0FV1XY6uim%=lVA z6#gZ)>{qGZ*Uk<0y^oM*hqFDj#p;-7=Z`83Q*!jPbA&@OAEG3T#+2ivLTd$s<5DI% zX5)zhJEqk|K{C2MTehp-hxSt289!7kPFop zwku?F+NLw{3MjC*&wq11RCm8VW_-i`F^sid0&g$jabFTxubkhCwK57D2AXaF;Y^3) zJX4d+m*H0u7vZ3cfa1Qe(QePf1>*My`znPQR&F!Q@NLRUvw`vNdXK<$q%^e zze`s~%@d42xop*ng6*FB;|KYM*WJ#Yo|pTLAO9WlVN=stHPCV0Dzc7ciH(BJnRMJH zbHQ<;)FfJzT+cI#7e6*mX?~r-d&UB(W+&|pDyr-MMcP|OMfJ7q<1=(Kq%=c=bO=K! z-BL;_jevBCfJn#CLrQmdNOyM$h_rOK2#7l0qo3z_YrTKGzxCVe%s%(N_dff?aMog9 zbKloh)E|=`y(L;Nx+jm1hkO@*)W@lNG`f>qbS{b_O@p>X|R| zfJ5rUZmG2R;2?4nYcNT{9T2NW^g*yu0_Z3+o}EP?)yn6qOr^Btw^~=KFXK+Z(Qkt*f;KAs7Bznd2fpa}r!V1opSO6!ZX|!H=hEq2sEo7SmpHN%%4X zIrz6ZOk)_Og{0P|s3gj}epG_lInCZ({rY;pc2@46?0H8v8pC=DsL`45+V0jP2W%S* zdG{uorE|mWo7N%~Guyv=iG?T#-|smojh-#qv)|m_`kzX3GMT-DJ`x>I+4aHRy&@IN zYya@&*V-Vh=3a#+7Ef%9?;WnZl%?OK74KDc@pCr!Sf5uPw|ok3cX2t!Q!bnzXRBsd zJ2JK7dxo>Q_R+F&pU7?J3pVLSG<3ei2X+9=F55yJyq7_j!KACRCZvPg9zg? z<5x^yKel6kEh^DL^I(bJ@E>zmase@x)3+6`g9Kv222xK1o$u$;+I=6;)_Mj-p6}lf z;Lh^$G1TyXWaymwT7|c>kKq+ffq<7zSqVl4gdYwvk}gILrOuy;t0T{&dQs^v1n1S+ zYo0#DJcV2p5RuD;!N;4qMS5qb847P_-=FdA!AHY|e~~@(k9VCvy4K>rTo|{!+%=P7 z?rRoGU*!IF!!8Pcq4Ab2q=hL4XNmM7ntE_pM_U!vpu7MFi3nKY6LxZZ zF{=2tfiboFfTJiLj(nl>e1g0S(x>ChOQu%4G>1y0==I?|v+C~oaw8kNQUT4!N?%95 z>5p-Hns%~}FRkT!h%%4-x8yrd{KyTWKD=VFKUq@tl zf^lo~MI^J-4j3p0(MT9+kxA%nBy3JjTNnoltuMNp{ zJ}Jv#BY(wY7%garvisJ0TDv#_+|tdIc;vV?h~YZ&ZGnsnv}6{^**CL^q`0e+-j9=) z>Wt)Y;=hxp~jRa$)188>=R8H=)1`39d;uHuFF^xE&eJ1SmKF4s9(7pB;oqOe05 zefEM!7a1r*bWA}1EcD*B!FFu$D7iD_tc9d6S}>U=ljp++noP!$`OimWUWj4V5zo=N z!rD>&c86*CnPiyrYIqtYMh|hd$y-WQJiBic-gEB<2W{x)bnlawJUCjG1^F%I55Aso zW}s?hQy%5PruDOA#y+rf@+mJ@CbvF~boa#D^FsX8i!&&>Gp z!X!2H%EL2(2Z>V%F-F1t2lz_a1pjN&fnEcV0&=?#tA8U$>g$vqg;r z@0_vc@nL~v{}&9Fgy#PX1`AL)c;#sU3M=pOv<)J83?q5162yT-6UQ_;AS=Z?SJNZ= zDZn{l5XJK+k0eJOKvsiGUxZhh0SO|27E4H(QACx6OQuqEjipPW?AtPV-kS$3au>HrMHR5D0No|)8GmPUk5~Gl(K{FB|aaCjW)@F-% zNa>`)ti^$4@tD$99vb$N-&Ktb&~8E0**L4S=tgkbDKNNdGX&~#+RD%Z_G>wMVE%G^ zyiOF990Gy{5GWHu*n@{VL_#z~1Q{YBt|1|=2Z5?Upb{`B8w?JWBr*149j16NL`E_M zA!rA(GQi+Q5a~1&1EDt z)S&DIfqFooE)ZxG1o{L9&w;^HAkYK|Gz{EBfJ2V?xQ+$+ym^TWq)E2H;5{&S z0}TEO1~=p4HbWpw9IPjg1WsT=M;vTN?94~Zj7JRghji2*S*f}>X!lW3n~90*NlCNt z@J>X9Pb5T69*gP;;IBaN_c1W0L7--Q{AN7w4A7 z7gnag!@00Azp%ADq^8^ggD>o@E*xzxU2QMj?JqqX47WD30 zi0?PJ{|tn12m>AX)_|=H1mdK88U?&N|A?qd@j*00`v2gRJ6-T>U^fL|q`%Pn`xt8Lj)bBG*UHs`;G#8`n((GTZ-j0Ojak z$n4+9r~fkJKfQlyASLL(m9GER`p?FHL^u80mHh|i{ZnH9+5M^i3)1?p-s=DC{0|Gd zKE;h2o&*9B%>E06oemeJ zSlFTM8}O-6Ig8q6vkG3QWt{dPd6@7@SAIfx@C25ZICP{yn#|HWq7YtGAh`Ha`0OhM z7by6FEH}c2);!HBUQ0}(H>K*`{kj!FU8;vODe+ZL9zM3XRAXaQ>FYsZp?O!<;<~3| zC^5Z0&U?IA{cUZN6fb7BzM%H~{{1_kMx}robyO=%t`+**$T1Bx^IY(ii)QJl;ZwNm zr!+ce=II$6Y$&s%Y+j#YTqU`xia5T8M4NLXJF9Yi+~iL^ipdB2An!-!F+C*WU7UFOQDN}c?V|=th<)Xx;8e{G;|KB|BnFkb)wL}_7OromlgF=UF^9z* zBOFD)DwQE5C_zI|b;+Esfx@K6{%GXRuQH8T9e2mp;gBE9i+!B}gl#{WNn9@8`=B>Gb~WqZrdTF};|zU& zP#o5D6B`>lHC26kw|19vxl(hQ-{iQ>pYBSxkuq}{}W2Yb8&>$*Wx|Z%2 zw_x&E+udin(L-Y@RBU~fmEUhDC!w_T4qq&2WJM8MQ-A1~9(8!ZiIiJ=@|3clwk&dS z)0y1w*N=g$w9ShHb~CB11dxHb zaP7jPav{S^U8iY^rz(P(lM=9x`W3q66Y4Vs$Dkl7CE7_}0uEE9(K}w7!`QLPE6?}8 zK}vyX2<6fuL5dA5UfU3Jp@*Scq!i}-?3k+Oi^bt1Ery7qyZSo)Fj3d08+mOGRw zoJCzl4|}HkeL30E=YuLNb1+Uo62#X zYX?g4VllILX6+53_U5$@u{HUq3$rxjSK)n-#jhUz{Bb-^K|#U%FXQ9JH3I-&2IlT~ zTG~mR^_Ka&*ik5Y*YJ2*>FJt>AEpJ0+w=Hzk%25sKh$jo7@Z^r20Mrd4+Fp=VWhph z{@}Qp71+Dy~=J@e)s09yo7Hgi>{b(^D2|XnxCwuVVK@SuGWp-0xEWAnP zUTko^tGi!5Q{96z+h+i53I@Qhura)dAc_KZ-s+OXGWKD7l!AwQGY7N9ajN>2E65+TDjdw&&Txo9j>W(%t43h z)Jiovy)u@J=d0rKxY+wX=+C4m3dQ7;nps*}3hj;EElNwyW27Ixm{)D0Qvj}COm&W$ z)Z#L(f!}TKu{Ob|G@i^yade8B#3oW5J#pw+2PWc-^`+S!NRH*gyRRFips&%wM(r>} z^=&Y!D@Z|?=X%{GNsyvCPr^7+HO)vRoWC! zG;oxG!l>^3B{(8}rNy0rEQp)4ZQHRlPHxk-UCZseL4eOdOfLV%OIIlZ^KaKT zH-tIo`Go8Q%JR~_j^~r|Q3)6Ex9w&VHBZBFdi@ji#Av!f13Ax712^NhLxY<5PdG-V zjh=>k_jUH9d`KOv%lI~%g7_FIghBK4YYt5g1s$CkJ|SvI9zt${NV!gxajQM9lb<0j zv7-KN7_<#SBeFkLM$+9RFVY8KJAnGPShV2r4 zz>LX1_z|AREQA>kWjV))FA+JWCL#7uX@1<`5~?MCqz$3ka{XC^PKxNxRF4bhXmOX` zEL(Ff;%BC*TKgzaWnzd=^d>YAT5|r%(jAYcOB@&pWs6}}Qa=AKe-ZjVA1dx1pYrkW z0o$q0j~8NYJ#Q4yC}~3Jx^HDwlx+xD%(mbntjx8uqjjmTXGL{p1P}4h1NcLO*xfOA zrHF+IfLjCbOv4GKtH9%EyINq&vFf)#JE|j{% zVe4#NPMW!#mC+Z1k3Bnj7ENgR+8!}@`?fv-Nrz=!&aG61Dr5Is1LCJoGNlv`Qy`=xG)LD}00Ei9t}-i1*+z z*s6{dMZo&E@0nutSdv_*1b_F%!g?CrTf6J`c8&vGBYx=;*1r{s9&LLwaqwrG_+Fa( zy~oZoF#&JPSQQa&Uo}e?q4skrIMiWcVQXsk!)s#;IvZk-`BXV?h^}T{&_BUCh0js1 zMkUI<6*6THTbveRWOLfX3_h@S{)2Laa=T_8N@W5$<30d(|r7S>Xgk2eyy~`d>Q|(!{ zQ5)KMJNamkG8+D*oP20q1C=DcUXECZU;-RYcir6^NVTQm{SYgI^6l-Twk!OjiaJpI zhwwzXDep}JE$1I6=yFaE`1f&PIt_<$-Xhi>+KNPH`HSS&Kg7UYX= zD^D0k!6Yb$7FY6vKyRNi(!0}kp`Mcf`yHE(W6zGfzmUH_dA~nR>G1=?FmYL*z%Ms= zM+0R>s%P@b@Vqk;!yhndygsuvsA_iB{3gwy32!cv+VV6!<(3{ z+~+E3);=(KeZGpmdEclpfvZ=!A!snks~5C1LNc1$uLkLwzvuS6%r1~w#h|6%RjtldUYgah$&^X{ZYt! zZ5)`<`Pqkz`WQ0XRw%ZJwqME+zMFc$YuLOsoLV07>1pyf-gNuxg&40-@IF|~y6UF< zEfr4*YMA=l4+skk0x)}8PK4>3T=x7(`=ytkHcQIigYB6;T&q}rN#3-vG5l^LJzW|& z`=nZ|k+p{m6UHQwt3b?xG0s$vr>SRMu1C36S2L~`96pzIgz@J1=;3g6GjH7epi%|P z4qi+KP+M^AS|xp8F4;~Nua8qA9vz#V6%;yusXC>}j8`RpS}Eo%<<4(MfY#Bvv*!6N zhg9D`fb|p|t}i_pB=(&+j0VD^z*!*-`FPUe`2MG0(KO1qh%@B(Pw5Z=o&lFK0y>CM zly9j0PDPUU^~&T$p|&X)BOC+<%a2pUnTaKnlT=(ZzFEF$-zDMz*j#!*=*9ex)ngPp zatS1%W2mVw%D*4pJ0g|Xx3uhYL(!y7De6cCENOyjUWw_xd(-f8hK5{*=!?|}^h zYZ?m+4^=h1i8wYWhKg1K%Goh4xD;F zhg{l!98~ado0r%#UFzw;BuztIyus*YL zbV9qHoQO1m$*L+={jq!0x|&ZTYe}ikA0`=BbJJlHNkkU% zlyne^gK=G*gT>4*St1N+%H=e}#U_`o^`~hj6a~16O_hF$?-5gb#lrLtHqCEHe>NQ- zY@xTV*F65gzU+%SEAe`oht*uK-X@KY|Ou zuKtk^4sS7t1PEL@00I{?c!LSN!sIW0W&_}72|bp8ka0w>*?L= znLS^#dcWorPQU5f$nD?AAJ{A$+$AKk7P+o_t^tqo~Yv&drzVI_SBygtZ( z5zs(1W4r!>M~#p_QpB^Ss2#s!|BaLVgDUw;0gA+D|JVTJ_1CHf=wPcK{VQlu^KAW3 zuXDzq8v3UK%DO2s$iI3Xxra3E;zK&~-5|T1{SN{6zrq>U|Bm`w{d?~J^!)#@{sTJu z&pD?4F{}U6^Vga}n)n0a5`-xK2Fhl^viu-6+=#O~}hO|reglnK>Nd6llgB!eEij%~C;`ON+|KP`BVjlFQ{ zL^972y%j~U>qzLKl0mu9+|!(HjQFWMRPb9>Q}Y_53^(n z=Vi#xH}2#>;0PFwS**4U=9V>jO7KvpmIOAdAS`DK#34#=zzLl@6wd+?p%I5}F)00a z^l-;`RrMFB913MwS+8Mwim1AFkS`5tELa8{ z)DZDZC~162s10dCa7E}r-a)KkC2R8iXPhK1tWDDae`l->&#W;8QP?wL*DMI*+b|~5 zz?c>>Q+@Af6|`C*qXU2EpUkB*+hxntlQN%OEF8c^_z`*jOm!G{!p>5*l%98GODEsA zp}(5@oKUvNOXW!SBHtNoB(%hRqR}cp7&HvNC8|TOctJFP?(&Y(b-)d;%C)ZS(GKKE zmX~;U`?v3n?Do|=gnlwxm*pZ_N9WPgfJz1NM|k|niFCIx7B}4{5|g;_CQl5J*WeIU zm2M>d%2Y{Osj_bY_^0+aH=@7`XA#x^vHRTek2+$?Ct9eRc0=iTas>7c7)K#2?jK+A zPGI%m8gBW{b4x9#S657ALUpc4>%P2Z>sNmgtj&&AJ$b1k?;Eyo@Xa$!QAv+hX@O3L z;Lt@X8MG`Z@#Fdyje))Ag~VeP-N@MRXSjT}_@f0w(i(Bivrg(X( ztE!wF)m;&ndK0g4`AVx;$kmdXUXPl6+D~a^**2k8wibW6OnK3$kWQQ1)zvSa<~ z^6(`UM~D7Towvv?t2Ji2Z0v!pTa!A?1S{}%nc#1-a0SKaEXjA1D_&Rh?|z1}Wqbcf zwWe>r-cZa@td>;H{i)5qDR_nZ{7!Hygl_EIPuBXU=w(>mX8fl*R|W%6d`KiYZ_6tV zt4cAPtLL_q?iXislg68NN^@ zQ9&WK^i+Ih<1Z8crS;9x>60rp27|6#`>nJF;>j_ry@rKn(RvBnOBshQrL{p6{x-Ia zb7&Owg|@4$<%WjJpA?8cZ+jt9oK2MznFm%^m&Yh$ z9F!yEM_SorhvO>b9{EJjl{7Uq6&H83xO(|oTU!%X`ERcusnceGMoflcX`elx>*%m& z>NPW&kDnum_hI3TG5g9s{y@BuBEr~qPyJ`P#hCcWPhhb)K*G8`U{0n}oYm^un?r9* z5&hFeP3vuUy!8OF^4^Sz<+HgFy09?mP@_)o<@ASWmeYh?ch{>o+1`g)t6e`@!IXM0 zSB%P%P0KreEUhJK)bZjXRA*+@v-5{Ezg-vJP#4~Nr#m1de?cw4+OeHKl06qSF{NCM zb$j}`2uu;1IYhsUtMl{RtSBsdn_oAiWZ=JAsivW+u6oX7cZs`TIw`}4{uuLkpJ{-B z%*;c0Z)#i+`gW}=3_64DWu3LC6WtK{OGUN4Re<`?!Joz>lfv0uH?R1sDc8X-%mA0| zVXb^7#o@qU53^t~t3h)wO=(wAHpOJ@MkxV%0j z&sDEGzPdV09}jIEYGARZl!f5IQgB7#7i;g%I*`BLLG+beA9T%C>kComas+^ZM_K$@o1KrWQoH|CZ^D-_zY*kS$u^(l$&1` zR=#{qL#>rRrrtNDR{T78q=unaI!dEdBRDuYhlPS>LP3?$;aZpKZFw^Dl}YCqD345; ziSm&gUt<3#D_Y$|g-}%V@n>H|xuDZg%{>loA>)@*Ux95tX!d(n=8yejp>Fvs*cBho zf7Vr+xSf{i%He}CnUhoOd!aPxzwht^RuV*qr-Gn{ME+Qqk{8l3$}h;|_VgYoQ&^hp z$_l!fLU^gE3;IyJ-a;XhPM@J3La5@duF|JRm@{<`;Zy=rid={XZYZL!tU{i2-oNpA zWy>B`iXF5vL3;+;2cnHftKD+uhhVwC!MM2 z9>T)mbc(%uabLd?2Z!n2Tgh@y{7j#S>RNq(3a2BRKueG#h{%Bsg4l#;spz78$&K$ds z0s9kwk$=c$WkO4^qqmyE=hWkQnpPEX0ST0bCZ+~)`_{SR$07I2AncXub~}8|%Q9t! zvq!0ZKUXCVoN9NBVHMcQpX9)}@;J2?#m>QaGla~!=x6S;_d5k$10UE>nZ?m}a<09Y z@d>{7ZEDK$3F-pWv>BaE#{52?-ec=;CfsI6K@erJ6vCK6TC&HnHUZq59$W49w*|_X zoD}LI*B2_CdDn%r2ah!&eY@vD7kC$)=ozr~x8n9hwwLG1wQ~N!?3Q4>kF%N}rfxG2 zI8|?1XuQGU?TPK+w~dR+@SVqhu)GCht=QO^0vh6|SMZLBl`eE8(_CFZ1(n8-hs%GV5rdtx}{xPVeS<(CZq!+Va-9 zyXZ~DpyIuTKuh#u*ttqw2+rd~=8l&IP*#cQ^4F!1&0>x^o%j8Sz*+BiBQ1h=mu5hqJLn%t_D9 z=Y_z~<|oI$7^$M8Uf>g3;205+CuvrIFf2slWCLfKsMZmR^`6LI1WLALdey|FXlUfU za3zLZ2x{%~E2B6XuCiapPvYU7u!mH%dN1l*$8sph1Bfd99|Q(?OcRV(-fl?# z@OG+fq3Ugoq55^-DxAW|Zpjb@$IJ1j?*GaJ`>yyp)pZz^Eofu{a>)8KwKUJcp&<~3 zoPN;4|3QSbc+C^4U{v{}z~TOVf)-Ugm!|EeE?T3y%E=roT+`=go$pvV@GwrKxH4XR z@7wa6C)houF@E9Hx_7$n+u51L-utNmM<`3T@=$=Z-&9;UF=>mXGuvW=(^vYN-rz4Y zEpG70_fPTOu_1h#53qA=V|xo^#38u5!sA4~t*&$#=}w(&I*qyR@0EWE*HBRCIGiAt z8X}K{^Po6=4ljc~C+gU&4cTwhj{D-kT`WUWQzdZ)uQU^!>w>yFs#j zK1|JyK$-Q7K58b`;M&4O5lFVsC1}`8_hPGBJi9VVn-&TE zMw2LhpT}Xb2j^C!;$>Q)5x93fnu(<`NK$XO}EXy~%WD=MWeFj0w~f5DTCc^Ia# zmMF@E{VaY$Jr7TUJs|*$^@1U)%q0gN|F(5sP95`EQUFES#k& zk!&XMyt?5JEt2?66L^gg+<;#%;!o2uSpbnmW|<-Y&=K3`3#aDbI~BunD>>5giBhxi z(+Y^vi%8&cxXzxasksEH*|;fLf40(9osN)?RBr+HH$ zkx@pGQA(awK~>sFQ(8mP+)7m2L|Rxz@G3>XIf=P_kfvi8np23^)=Sye{h+0Tq^g#{ zvs$uqjHz>!p}n8FwTrB4f~9Mmxnqbfu8O~ViVZl0cioeo8P4u$j)F$6{#k*(S-##+ z+=KJN19L(nUnGYY#D_kM`qV$E?v@=}lo|c?=H z^xD($C7rpi&p)ke*Y&E-Z|L>S=qzl#{Jd!Z+)mS=-j{9T#)0PzeOim#ri(jfb)9s; z?X(QPY#BCO-g~vQYtcMpI6QB(vTxlqs57%_w{~EgT}$6KV!D2456sXq{Nn48)5ei& z+la~6Lzm6tHyg+98^>}@*y*kHV?VP>q9JgB7e6xG@9x(RK z{66-x?Vkq#cIUYD{zXvt#Os5Lpo5Fx!^@Dv%h0Al{gyW3mNug17D#Q6a$S#Vb(efa zyJSg=Q2xhH_dhwfzfEnw<^gE;TxIAnP+M57$25@`jnXyPX=fbx0BnuKw!Nf}NhxXUBjqeUMne`TlTX z&&SO&x^sSb=CF@4L0FW8DEz5pky&@2E6inz5t8&KSCOH~fnstb{%C6V8MtGdhPVkL z1MU{4kiN&1&ca0A@N1rW@%s=Tn;%mQcR$lYiM(Hle8`8XHKS}T_ugow{{p$ zVapLI&HDyvVFXEhxPAK-k;*iEP@xKy5fY(^QCM}H+;Np3+OqAMVtb{z9iM$7yGFr0 ze>Y_)`AwM|h<7`CZ!vGhYQY&2bz;ykx@)&A{KPFgeQrz4TF(c$-Xg8pt2w++k;k>a zvo{q-ACbqh^)~uJul`Nu7i11v$hZEjaJk;bFQoC)?x)mGWGE7l7ShTh>i3opGbb%K zm-09ow;vFQ^d-6T4SI5sBUXAFt_0F2c3p$R?Qk%HwQVH)I!&pms|v^v$Xfs4t+j)Z zUEC1!I6gULi2Mf`VjA|X&<_tScvbnkw$%xFvRn(bOLedAPzs%&pA$P*Hjlja1E+-nYh4VlGO8VOyAi=qi?7#P?g8$B#* z1PfZICpG+^?2U|^sHAIHpehE$U7#pTtWB9XVLd*!9}0g{s^ zb+qYoQPIS}K;;ST=yzeWXg=XK@p{bW0lYa-#K;D+}%Pr)>OiMqKU&_d&o4R^ZD{ z|A*wNM7T;6WbsfoIQF=USBOY;(Y_jwUe)umd6hyGiW*JQFS5j}$^3E5){3E@u68|n zKC~IS>7e85mqaj$x}|lXx_uFSA{+m_qa|)Eqyd}E)L(mamlpe77{3?$$o{mZ?V4Js znU{(@c^>KOSk;R00A@Ap4odZr^aDP;qi4?m8FsE@IsS`ym{Uw4s_SFCbbJ#BQp7gx z2<3vP8n%`4_ERyzlYyGW_9Yv67Sgzy$V^cc>@7fkQR!0qp_YSidV}r}k19YQ`l^*V zK*Yp|p30XcsYEz^r>%3CIPTAFVNf$mZ#6fIIcZZ}-9VLoRdH*exG`gI9d>vT3UY@i zrr#59gU8~hY1pu-6xVW`K!N;STPu;_H;(n9&oBonIBPtK(@2ziff-2SZ@x~9jo=Ch z&Y}!vaMr=);Li#?e!~tZHA~gzW zs9sLYx#`J=80fFvxVYf`N+`f!yV0iQP?1XJ>MdRwL>-L$rD(i5qC%q_z2}XDv@$t^ z5;uy0rkAph(hvWr&C=~Vv=>bhcA}cP@zPNG<1Z~{ZraK_TyB9}-@vK1P55E$tZ7n@ z=~r7A7?jCHSE8Y1zEESL03R&GgtCLc4yFd-WzUyT{I)EOJPVLEHJ$*J33O+^7iyGF z!jCZoA-qI0+mT`#4zr;4IEi>~B|&#dA%N9C8FxCOBH!uhw@`Ivp1lIrW>R{)kRqBl za;Vt;ohrcRn@dIZV-{w6V+Sw99glSD_q3SR4;obRqhKi* zOV!5&2foC>1_()NZp*wx#j-P9fLCb-5+``EJG>XN)UN3hZW8mJW``Sqju#77#j4_Qav{9~kKFyY{(pb8xRzTX1~v8}~?K z?$HZw(prm2}GqQ|8m#y@fdzyC69FI&s~+x6vrQ+c^b3J%xs&v!q4FfjuU zJ&F_Q^Y@Q`63fPw!sYp*9^hE+cR8p(!;BFYuKzG95y=+lJEp|LGx>`BBa}!fZ#v47 z#?759H3ZsQ3fy8qQ{_*d_^U+(k$KN80;OG=+Xr#SL zv9DbTctWooI!aMSNP;xTNsVb z^P5a{3XgSsjCW#Ge0W#F^x5>g#yG#SV-DXaay6mK1p$&%O!rP94t=#c6{w;jw59jo zB~b$-EU75M4)#TAK9oHazA2TB!0HE~kzP?|(GA5s;|e-5kX@xjlah+#b0w%=P|&D) z$Z#{%`myoz!K5h&1xKyV^xKFHPiefNO^4YL^%|EJbCmc=PTtz*hL<|Vjwcw1S98l> z&f6U(x?!gKH|GMw`kE|yuUEP1#g@%8Q0;tC@_%L&E=-8o2`yQPSC;(<6D@BTNXjs; zZ8$7J#=R)5`20n?P-EeEz~hj76jO= zfV?cgj;^)@ar zwRL=#1)w7w2D~NxHi$ZF;6z!&&iR>^wZ$%l4G#Uu@8?qkm(s$PGQ*d$B9`-_J97g9 z3e*zP4VO|v$8$saBHk{=`Yt5|E+q#q7spMf_$@_vFO?_u=Lc^U#OxNwr_|Vg0X!id zE1B@K$`7}VImqr}WKRjQw-ni5jvTB+4pn~ZD?Vw<+pJ5wtj|Dp6z-(MFN@-kHEGDE z9As-Avb_M=S%e&@K#o-X9y5#%{8R4^PZ;lM} zz6tU`hIk_V-IuJ5k%0Z)73uAC=4HQRroZa(8tG}jZELnUscvk6QqEZhZyRTUEf zxo!W-!Xi}gH!bgq75VaKvAo__RsitH`D6S?0WN$UXaKvJKfY<;b8d!2B9IlYH;`SS;@`!QfU0=+zrlcz z_(ML5(2eKQnjZsYSxWP7{G9g69qQF%mc_+ef2Fc1{Jv@X_C#K%;h~PX(t_A(Sys_O zSsB8qq}n#K2k}YE=`k~*(I6t%A()Cb+G9Q!(9KfRsCwthK&$ZY1f`F z^x(v?iPtcP3MJeP);jubS=4B`BoJgWe&(_4fZcO8372EV-~w-YWu0M4cT>1!5W9X| zd2jd0NbDAc%nI)=i%p8_r(^c;T+gBq!Uz|;k5A^<9~L{I7qzvaDMK^Z%ZDWg|2aZh zdYx>_P|ctmFGmB(YLy!wzs>dM^C9WIpkkCTPCa^SS{PHIRj7;&$9f`dN$n| z(?dCqEQWVnRW#U|Tr+Y4xvR;d!V!lvU(2${7}K>KMs#7+$yrrRdH27vK!NHdus1ho z!w=LCU27d!;3(%i%in2#)JIuWr&2Nt*3%+rcl)3F9#0kntfJ{s|w;K1J@{)+mxi)vPGT`h~l zjb>c!F}YyiJ&Oa;xo-cwCty8~Js36!!C)6t z38IgJN1b)_#)67YXB)+9HAK!}{Fn`R3^C3|o7NHg_yW6CMCv(2TgkOcLsWbB9cijd@ zE-D!=x6KU0UEn(vf))H8f9mFD-#~#uZKY3!PF0WcOnP$p;WF{H0u^$BgbCfNO9I>e zVra6m2zgB*^C{yHxx@MZdWLbkiVovj z@fy~#M^mF}e7>4!=qy9*l!*#G&~yn)Y4a0mn&4)e7WR=5BYv78jc94oL$okd;*xFW zz27}w>Ybamp%_MBtH*4k7cB)}f*uj|x%_P1Z-%CpC4C#~66GGd{%i(?Kc2@gv24jk zeO2VF4aDZ`cAl-;)PW6L51bBstgUok$0~?);uaOYMD*lRVOoIlvO<(g*k}ki48n(a z9}ys=up0`VQ`yBTBzL}0W2_F$?cfWG0h20$N1mq!Co%U&g-V-L$h~?-1w}MK5%{*Y zyx3YjT!C9~eow47>}q+vW-MLj)pONgX>ks5QcFf@X<8h*&p%%rP#$x%q+T7W0r_V__Ecl$pin4< zvwl(zOUBbe=GQ%awNxC;vZwhwC8No51S4t;sZtCT1w84t%2|d3<8Pso40=`6<%iAO zl3(!H+$>4*I2Oy3gQc})Uh0pD$wPmUEFz91Uc?`)aqAT%F7TkLXmv^HxBri|w~UJ8>(ag(cW4L@oCX?#2dB|s z!68_1cL*f72X|>2haf={Ttjg8kOT|C-9rfO(of}o-!tzs>zNNTYrVCqPn~o2scJq@ zEm!aTyEw3Iwb8Pk3t@W4;T9tnOc=m@t_L30ju}#zQS3!?NI~p)$UEVlITs$VR+Zvw zNm)qbXGu}MV{fprfCscl$}pl?U<{8;WKmSbH?N>-6t2oYTvIr)ovnTP*7sJg!(p`) zB?IyGr}3BlldwvExbfV*vqGi!=9a{B<_S7S8cCh9uVVY25;twikgRL7?~e!7GR`-0 z=S7Ra-36z%drFLm7xcpoWa!WyvWew)Q8S5`PZ`1=45|Z-!o?PBKznC7q*AfWqcKgm zbC(^RHAu>aiU%P#R@~Kljky_{Wxk?<_{7oOr3@%HMIbNSf`%_uri6$8$%@_BH0ATg zieOXOp!fa?6UGCNP_Jv&JVsM!TCS=WqEgzV0?)3ATySgKt1^erWm6R2#=O37d-zsV zP~;sE9(Y%B+*Kn%a?95J3ENLF=>~hLoNOC-*HRu#S2u(Zp|qeyJ0y27h4i^`_r4$J zN**aR3fe%OhN)wsNeX$0?#)8XmO6{xg*S$5N-5|*!sg$>O#A{^AJRZv-p!o9+BW9c z8Z}~w!U$!VsPXluU*D(2-~9F6?k%b!!~4;-J3ieTdcJ!C)q++AGzI;|r$*l1dkdHPuIA=p36+e}ESH#}aSZuSx zrNU8ffhV}&w+Q}fKzP-BI-92_UO3uZD=#Z8tLcd6C_Nn-9h4~O9J|pXV>ql&XsvQm zl8%>6PKH$UnJy1ii*7C@D$1@*WaY_SX!?f9YuFc%Fv(U zZdAj1cePzpTl3OK$2bu?BYktxa=q&sjBhPjFA56fg0vD(u3)87rXaVqt7E{jwrfQ} zUIiBVMg#sQV=K=TuQ*yUPy8g-eL@koEI|GzjiBuZ&MAz?3w`o(%qr}tS{{YjSU5R=9ErVk0cTZthOyRX~*wzH2zRiVUi-=AQ3i{7HS zkd&(z0b3;ze!uQxu3gT_u7%RhH%=ruW zydTz~t0=~(Bsa&BDzNx-aR)WjUnqUfzP@i_(U72gTf9wiM; z<5&)@9LW@khg1IAgEFZ8?4GQ~k?Ioby89PV2g)WfcGB=8O&|OKGSvWICl{AH#9I+~ z%8UL&VkT+U+vVM3I<;qDdoa1J{rb1fO&4*xM0t!Pd;WN;b*d~1nj9IM-;J)cPtu|X z(xA{S2AfMUby|ht^~^vKku23=5_D26QohX!{xEIr()bRc>itcIq+g$+H@Vrie_rDM zylv|AYiplkd|OUC31OOQKvf#~0@7rq#9YtJ&VB!`UXp*&m|=t!C(kl+{ZVWS=1{0K zsqGA5*#+XQk=QuOlsn$m!1Is!*rCBPyhn{Odo6QWWhEtBCJgu0`(CzM&ULJ#Vd|P? zS7@P0o~WTWCfTlX>x)f|X!O1%cCN<`Sm-=DsWOvNFT3^iv&;+)@4YWa-$><p*A;oD|KkkiGYlaYYk#wE%sz$#9yzUW!7C)Pl3JlB=q^dV$z!hL4er43cz$ zAknJ3TR*)=frB5w=w8kZ7GKDF628E6g+OIx=Q0fWvldRTtEyjTOK~Qpj#f`;vgd08 zF4dOO+~apErY6p8@aGmZW9@Eq1=U0Mol9a%8zz59fa(n#^hh+aML~&I-z zWLYs&Jtc0{Yu7fZ+FmO;tDcy!VWmIMIxj&*JOfPus01(?dLk{JuEDN{khe^!FfN1WfU8w5+QLcrK-Y`Z{V+x<`~ycm4JfQ81O zC>{U9fhU*He(L52&!1;OXSE6;5j@QlW(*)OzK3MwL-R3R%rPPSstmj>hMLaFoCuzwhdJLiWQ|`WyX?k9kD4SA<`C;P&EaU`DTaNOZRgiOqn4P>h5d$Nbru zprWbdDeEMl^6_=jcNUHz%y63X#*HWxGJ0y-!KeFJx`)%6;j8od@NOs~ zbO?ceEk2y2wt31NASC%-nGq{itIW7G`qvA7nKLu94!_1${Mb(*G(s#C%HVEtiZIGA zG{-tZ`!^$Vt@}HbwF&OtMYy?`2ko z2m6?D3lC5Huzh3W{wTT1Qy&|Rz!l~@P+T~+Dl$wAKuHJvnJHMQ;h%+G_W_VylG zx9CnHmd@in4?WvDRHD}Xt1~F_ef`?Bl`iU7DjG~Qfl(U~soJ<`;L3d78+y0Z!cdYp8u}<=DQuAB2PxKAICEkxt1e&K)VzOGv`WL~MU=2k~yQamE zoe6(^D=KgWboi> z-)%nMdL^VWN|h-q;CV1v{?eWGt>MW=oFSd>><^KvS1n)9yh;F9<4QifNPNDgE%s-I z4~@od93~;`6oFb~Dtzp2@X@Cl=d6FwqYN~I8tz1^^CLdz|2|HQ4WQ9+eco2D8~cdu z^MakntNAqDefY;_+eA%*-T9Y~OW{S$K7})bQaALfW%}h2gUz~_+O546<4yXXn{6@m zIB=^ijjCUrP@Kv2G;iz9Th?C0dNJ)a3PmD3#ag}G_c%g`UTO)r{(94y_z8J?dGUnx zr*!>=4Y&M%qli8t_@5}E|50)mWhoJ9DIRPj6k#rwU@w#CC>v-X5M?P2%qKX=ra8%E zyD0#nLLXJY@;$^v_`RpHRg8df0x!U>0@?&SX-^**P^=bf`%E{UE1*~hK>TOEmeY^n zG>qjkj^{Cl3s@z=%n}9k;yA66g#oSADMQ-kosdy74^SuPStjFJB=@R79QaJ@U9R9; zr2z1-{0lWLGK2zZR3a_J!^}hgDb*uaIkZ7D#!3QkR}U=F_Q`+Yov#kqtOLb-ajkzL zS)nGdNDHxqc2gh(sH}gXSB<7A-PV948~V{8%oLX1XBS;%o@DnIag|VOn=|bE{)-Eu z-XTDb?{5iRtxam9Q?QXh;a89BZdWf2j(AI0fG%Ijm{00wXaAQxz_PT@uK~YxU+t%* zue8CP>u)S7hc2!{Z(c%g%H4HO&>aNZT%m?alxT-#JQebqD zg8(EfXCp8?jmC;t3)<%jN7+OCAT6&vjROKirbpX4HiLr<6NjEdp zLi}+(2n6iFB(T?_{L{z6?4qRXdBXg6XM{B3bUmz3 zLg;Y-v{paw(?LQ0Z+yJ%6pu@2NeamE0OZy?T-47fDBb^nu>e%ocMu4`V6}ljpHNVi zq$GExBzGjmcf>_z`S}1e)n`o1W)Nsx6t*WL^-E4>TSRzMNZ=a_^DlY1eI@xVVWCX{ z{&gPi71k%+gaiXP*d3^-qnMaeXaL3<1%O)t1TFxl^;<>hKuzV~h3Xn7`!bYik)C#e znre=Wbe4qpCqDi(Hr6OHc#@oKp5pNgm}nXo=LaUnAI%qsI-0BOY%5Qgml+w3^mI1( zc-Oc%j|_E>jrC7V3{T9APc2N(tS!#%tk0~>FC1+zogA*;INi9vx%KgQcNMt!M^SletN`WOvCImncJd@FUhhZk!s1Y$U{*cS}Lfwa*4I zh9lY^+235DoG<^lxBQtBq0a;e zr>wk7DR}(ztvWxBo@p@AThbq&DYi5FPwJ2q>Q*!IDv#N(Y2Js6;J@`Cp7J0Qb|p%5 zZGoz%^HBQ{c8T??aC%gS&x!7^b1%0~N4Rb9fHBQ8dRpBiCL7a!NZk9B7#*<9f3 zLWV7}Q}yAM2KgLiFPY&!44c|xq4LaYvXaI=dB!kjk&Vp|U&V?es+^jxLZ;fN<&MXm zmvJ3ZR{4}6D!ythQ9CDUpD`kx{bjt_<*Pj9B8PSk>aWXvFee4+2Uf)a=QSPUtL=O_N02ZW#9MrQX?%uO-R)mPHcQRrRD5)911 zd-7-W9H=@rBVfjnF`jq61q?6a*_}LN0{5<^JQd5MTHm1DK36H939o&v~SW} zmxu3JQla-uH?k?}&G)A#6R!hNUek|tMN55yH%V5m?r|jAf(B{Hj~Gg}oebtiM@Rc7 z_R}0hycQQDq`_2%-`}N%tHjGj_b=sa$T`MXjeqz=4pd9_^4!^#RzQYXf^Ptm_1ApY z?HMpk*~$@!+v3VfVZW-%_9__jR1l=@6wI|xfqbJ4Uu#x1N>1N7sG573Q zyRumll~v^0qS$boPukeqyI5PB3%A1S-UfA5(jsyiwqD~#V9GEK`TUwZVRUO>d?qfQ zlhv$;a>djg+xS7QIa_eQSmWp})k>6W%5c-i_xW&kQmi8Ps>#xmZWz{V-S@b>8ATED zIGmD=;p3a*qidUW(OYt%0Q%LY+&8t($4e%4aEY-~ZFqJz71#aF0B7?erX|GK*7gP^ z!U~YpZdF5;5NvZdLVv~%hYPqQ7H34Fi?MF_lI!{`!~j6(PP2u9fsOWHTp5}s5O6a^M+D77xlOxXk=e%rlLoBu4BIY*^8Zog^v(CyU*za}+ zDvSfj^RHG3eve440PdKTkMAc?vPi_ns`=j1u4^3A7(r1nZSmK3rnsfi^?iJtdZQU0 znnen3HkzTKu)`Ze8nPjt^7%1FYg8+5BZCABi-2_5D_1LADDKdn!%ACcd=Uvn&OWB^ zpne}&iCQg{PD0<56FmQ!Po*KURGkROwFqgM$OG<^?V4eSGzO{`NU6b^J1ff`v_wUjfXzu?zq3OD%XM20-5LcaU7q|)S8mL4zT z342WS+K&>a^@_Hxw3^9Jd%{yXjdByp1v&@GyT|=%Q^i>irAX66tt_YmuF6AIBF7Gp zAXq;1$dPqAFqSz6(u*v@ys<#ld*;hzwS{c~i6m$H<8HwcMil0Bz+l%U_Pr4$+15mb z|Mp_fJGrgA+L{`@{@i`k{h2KKmz_{eWiL*gQaepdt+7GYYtZEM%;^_9KDg!yBT42{ zTP77o1=g$)t>GbG(S!cPWDz=ON=$&sK-wpnZ5O!1TYAyg=~lda#v?3b>@T__#Zs1oZmV#3E2nXA^JNVWW0bJrGCWQu2F+wTzEoAOB zwsh*I#PjLlOONk7mz<+~KK^ZcG(RY=Zu2+0X|iKzXHseuJ0G?vq$%XZEGS;v#iVrq zL9sGdmgK=;EzW|jBn6y^JegHZdP8QDr7+=@3ac(}ts>uy%gQg0Fa^IILe3o8>7D=UdXm7=~@4Q%&D4HnL zG;_MBsi>&95R7t9I;XIEqeo;a`51qHpF0EEvP3u5W+yu0Uo*4g9(zlkuJ-5le8g&} znA|{}nqjc_why53K@1iYOrgR^%$nc2PF;Uolw!hv#ZNa*Q5apvs|_| z*zK+^4FZj#$3;#DhEL8$nlO--kZ^k_EZp?@b6H*KR+P5mU6Hm=$Fdq}U{ga|QxK1e z+io-S$e|3O1~i#Xhc7D{^xQ2BS_O!VcN52#OC8gKQOik>g6OzlN_D<&euH0j62B)t z<@Uam;?ovtJzX92^2LFlyFjzpNn=Z87%)h~igkdBP@2mPB_ijkz@S2!<&-I7?(A>6 zM;W8JTVo^bZQY3Mu;VNQz=N7GW&ZPfaZEG8x@MEB#trtpLh)}H;b z#i=BjEhEiML>uLFj#!SDq2S$%*SOdx46yP>KeU%MAti`#7N`35}#_9;(kLT7!ylZmG<^o2gwhfw7O2#}`$>Z5pe*6pue$9+9 zNR-y3jv&jZn`%Trti@)4`fvQ!5=d{RPJtnseB09Arv($~WaV&Ar7u3JgPs8*O6iY1 z;P^b26NrU`xiBGZg5QU2r`rKxP$Dh>)-@tSOtYl^F$z@$4;qn*keg2Z8o&G%$BiAf zURP?gerGYnzXTO2475$YbLQ1bLU>YXV=2_E(Bos?=Rw%W!=X3RQ;=qotp)K%Gz@IP z*C~p%TM6%FyYW(3Fp(Sk(s{Ar8VGXWosU$h^_yQBTZr&)b0+8%*Q(gJm!t_a7U;QY zlRbhM&xUGUY!%Lk1C>_ZC6KigII^}497tOLL#yOVK%? znu1)=tjoxc)hp_|s_5SZ3=il;s;dUy zjaKOCGK@=pH=)ub>| zU#$TmMUnJCVeP>*%pj%y#qcX__nc_|?@I?e+Siziyj3|8{QKtF7{l+;>oocosU}d2 zT;vNOYVSnD-yg6rC+#LUD1z$EQP#1rw+5^TD1W-j!zRyadru9(rR^rM3MJ66JqPESXc) zi=dD##S84mJ+_tm`lRAKy37A?t_=ZEa@DS^D;LGe0O4A$`gb9+>&p z>)$)nT@|@vLr^w%|G_m4R#8b;+t&K(rK{=djr+LACC$wV3oyvy`ebttLwpulc(QRQ zbZCry_T*~OVfsyA^8?E3uHeEQqKSbK7ZQIu9G!uYe1p(?qUCrz+X zTAWZ| zz)G^$GqIm5>cGYEab?kND(&TJCYvCFGRrUn{XmZ*(yXONbz)1#YNZmN2rZkFFavrj7n4XF%opsL#sXU3^ zE9*)`j(iLcjHayAyxbTv@UZ52B6*0y`HM=9r$WJk$F*a|U$x4VPBD1<^r=Cl>xv_k zW1j`vpEu6Kd)GAPu{QL{67xddR{h%963HPIi84bHH&gr92wI5FX zvSO#{W0W4$?}Xvp3SaZ9tyOlu(>cs6AYR!W!vuUi>z?@SV^C9)Q@{m|U1)OmoZtg* z22!59cmPF+S$<2SS_%AbR57x<|CK6MX%$|Gi3p&dvuE)Kz9dJF#wG9g_2@M7B(vjn~?!p5uh`yD+!2XZUu67sS<(Z z8b76lfdxQxT1ue7K@m{Vg6hiH@q9LQ7eyLW2A%Wj;{^U*%JB64C!iv^sq;I zzXJ03kb&;V5N~9--?^tIn2l50Xk;yS> zc}Bi!tb^uC$n=CXZyn^jC z0xJr&x>1w9QhC-Q&zUC>kGP$S7aL`fbgM7~N%xkgF3K}9wB_;DX8 z=@(McmYm@Ax$ZL=ktIsX5gO`A(WfU;!ebhOLqL>_Y+D`{=OBM9DY!*NHB3f!BrdQD zp_`$kI1=Ie1LGZ3mjSxrX^sHOJ#&Qqs;xkM1f5Qi0p&-@tYVxZ|(VG-G8B zv>H5#HGd_qF5uyh1Zn}hf&p{M_sF^b(7}ND9pC}TR@Px%fB^P)1DE_0{VR6;Z#Iqp zBv$=z&ieP-jDH>fzb6j^ z!{+H0T9G3{x#uV+1S_=em#De zNg==u<*{6BPv~10e+YqEeDU#O8X|&z%x|XbKOU`bM~nW`z}*z3b1ry8B%}x-tK)j>Bt^uTC{~F_vNze}KJ(NbzD((Z6vakWJFjDU zCHIa6ESEc7ngLQVJwNWwpwCT?cg%kmGHmk7qoLZB^uyGEZ9~qt&qdRI9Sbi&tU`=9 zAgS9>PV|0FYh^jC7`X@!c;B&y>48@U9xaAS(wx1(uecOl(yxptNsL$K1Kf82R~Ht1 zDDd8XqhM|@@`Z%Dg;75IhdG{{axl4RIC_kEQmfITY{$l*6Rbani{3bixCFm*T#?^J zy8KsKB;3wsk2jvE=ZU`zHvil^Ay1gARW##B5V>xvDDq!;)Y?6fNzG?WwP}x1_5M_LUy#49YxS;or$u{28$n%|acoUM7(Bjl81g zr^Qrh*{_9#1)=~{MUIQ4Lhr;SWYW8$CnT}o0mS3$AI}#d=PpN)`oAS~jTEBP%8J|o zVG*gJ0AdRgGfQiHZ@onD-NnnZt(05SWRSp(b+7iaS%NmyT*_aS1-GWWW0rOFY3Yrg zW7?YScM`W7e5*6Bb7uU?8`qR+dR-0+m$oGreEeDTo{AX_106#tuk|m;vjeYuxB6E@ z27|lHI{1Wyb*=H)sx^ENs@-t&hMR!Eo_#V-TXqR)>sf=i;&_vnB_+YuTQC-{FplPs za%6odHxV(abT{>x{}FY^fJ~SrEsC{~8|&@nNiwEXc|8>#-fk^N0flrz;UM?8b2&zT zdN8_7NIn=F+l$9;Ca!_^W z!Gtdgs*MYXxNpCU{Iu)A$XPMQMl5PucL#5{qQ=6 zPY#^(0|{n$6(j&{j!3bN_@e;IF`C=K{JD~@^c@a0L|(l1qC&?~<>Z$Q)+?{y_GLXT zZuKKs;P+!w7UQC^D6TM0`G%3=*RRE9=YODM zKX^-i`{5e4y`O@Yv_0=DRps0p z4gQpT=HXW#YEF#oUR+!(N21}-4p}Q38P?)WLnZG$3Y3{pvA(DvUYSbK3=amj2_lNy)8x12i`y&FZ45beQB0uALAauMF z$5*cCh|muo&WMROsKDs>AHz&Ico1koyY{au#uhrnrXq8m%aXvOUeLXGF($Wr^!Y;q zb`&C5kO^u$V3wJA-3YOghi-K1K6cu zcg^}doME3~-fz^&ags!B?RK_z`p$a$3-fIG^n8U8cu#4rzMbQAtwgDqy&AV1s~Ppc z3Mul3zVrC{?b}mM&PeamdyQNcM*D&D)#(ZfWyC<=_9e>tpSpEO*=IX!5j5=YT%$vi zKTdE($RF$J&Flt_y$pge{y>0kCDI8KgX^yYTxPiltCS07^BiZrSDlW^JaLyde%d-@AC=#VG97ii>W==RQ)zwEK9@?tR1@cj36$ z?@2NczD4pczuq2*`TD9OiUmC_lQTNjXXm$k>UJ5kh#~Fcgt7OoSQKUfz*+k>tKF@! z^@brwFVMqgFg(IuYRrRU%gC_2gQ*I8?3(kOUwMicN$?9${zU9O?Yj9jH;KB127g*A z>3{8Z@XAn+VA4~tpSC~;EBCSZ^D0YOk7!?Ru2=rv&M|IZ_dHG_Ri7qQ)dqLh;rJd0 zcuL#}uB=doi=eIq@QduF!LC}SH!vBnMQSsD?5q_I`G4HqcqIDA!z)(dl6R@}G$t}& zkS3|@bW9H*{BJX9XFLtao?Yp>eMlHRmjJw;Li(0A2JvZsfIA63Z8b<3nri7Aq&|?v zk9e#QKaqt)H~FEP14PI4V>P|J!op(w_g8CS4|R19Nd-MB8OD7y$-io+Du}>;@*6kv z<2yKa6SR}K8P(;&U&!NzpkGJdktROv;~k@ULATiD|3pYs06pr}l{jBA6&UuLy#3~E zB(ipi?AiQq9?W58u!xiKjVz?V&sCBxF{rDyo0jNsrHwic9t~fMQ~Y9tLj063O=ccJ zg()pt9y__hD9%U{%_=Ps6!@@nHORkh9@gT0Nk|ihKRJ^CM_-|fA8;BE`p(r<%)YohRhpKdK8Rc@x zo7EyCD9##JNI340&2`1hrXnVkH?wmk@D@{S*a(GpqkZ*JAHz4XM+&xP-^pwE2`#t^ z@{SDiGg)ZFAr$x`pq6M_XeJd{wCQ)9oxt{b-IqUz&~o6{_frKF%97fXm*FZtyqH_0 z?nyA?ugABCD;TIUj#8@{z0#@ocU-3WpBnwi%*6MqadBANDZ(1VPLkGlA2!CSyB-GB zx0P_PX<97_rDX|!FLX}7S$3U&e#I23BDFR^=`!xCB!LOl)O*Meumlmt7KBRNVEZeoWSG#2#eGA1Puw4+&>g zXL&?H_&x*2Vu(wxij|d>lTEFJKkI-TBG7gEHquRoG$*eDar>E?YW`7l&WElenRT*p~yD}z4Dj_>wjget<9oOW9 z%cIC23#phrl3u7kotYqNSznYnGM1zE*6>vjWW9GT4SFzPYFwV}k7)6V;(6grdJE%= zTG2*JHj9u!P7mUr&acX=t3K7&pBPRdvO&C1qQ`Goa4o=3o8CACWsxQy&)37@>W?G) zjMfkl1&=VFHi~;XJDUXS==%g;4)a5=MWL-m&#pJA`DJ0WzM^-(;?WUyf8ED_$i$?a1x~zWb z9q*u3P<>@IBh~6QF0jcRijb4_Chy{=7hp0s$Kd}_UkWdi^LjQKhK|>(w$g!qE8Ypw1a>lSqDw=Y^PlUJZ`Wd)<`Hk(i#tXY0lCPBd z!vldjc=|28mxqs!Q1;i)aJs(@Hj8JVMP{U+JNvs ze!b1?!N59TWI0yagWIp-#ehon(TYuBLudJ=)Dt8U-hvLddNH75o2`Cn7(DC5+F7i@ zimBUvHmPmO&|cM#u*sS@!J`!$9o5T)DTdulKm)jwar(FyD#K~ z4cb@?buLM-DHdyeYDirAZ4iY=_S(y9DrJJ86@_86FuGR8MnHIIK5XFnIs7eio6uo8 zJR~V8Y42WWfv|1K$`8L;Wu{`|7<-7OK-92`HCmdGr#5T*w4QU*K8JBg62^m521mmp zRK2{opcBBG@RZ1i*OvQ{IoI$}Lh_?I<^`cu-B*<%K0-M*h?zksG^S8qkYy6Wkf}L} z-(vqb4TF$J2Maas60sLUhRAbDmYMFS(a$I888OHFXq8vw!KRR%_GK}9Y`=w*QRL}w z8JG|?t~w@vvsh}qz=0&^C?oCEX1@KegQdWJRA?d*(`fw9lr4Q`xzZ;?!2kA3&B>(8 z^eQvJbt-%{&;})xs88X-BMuDZ!!zW8$zs3k!55^}A+G^*Tv9nZ!Y)$67}ap<&>iec zpO3rNizrB=nlLKXk%mp73~4fipVm&$ozmR;eS6OzjVtwz8cbjay1#zY<~5$(Oor}q z_m->kAZwR<@ zoKk@B#xT_Jd>^_&VE}T75l75bu5|VKJ+X0T?!I|vnGj-xlL9rAu>2x`CQ9U{!ENFw zIehL(FUJ2(^#0ab3Y~*4l#+jNEvhD7nP>>blhNCgjvDTeLoc%=zGSQ&Za%PdzyHzh z^jW0G+MHmZKu8Gux9@ntJaf|H6Qg%5AT)>~3Wsm^xP`%6 z*a08%H=O7j{PY1qal%}d_TGQwm)gusum5o@qn!nXdFhaO%O{BZM#@7-0_gS>7NYyFlPhRS7Y z?`ep~yRqry(+d(e8loBp;9P03kr@?{KlBxXWvr~5dN*o~EN61I>P3F0kg|QU;0gO& zm>Bl6-aT&1ZSPB?-(%0m1mbZ7gG51ZuXLSx0yt=ggrOAE_-?6%au^er8ih(g>^yE=e-p!C|c@T=p31A zw>36*8zD#Z)oA#;9+&&$-^tMR(QZ(ePlL&nG>Eh@`0{!0*5A_e_IW#SVAMq!@{rW@ z@FTi({T&5kcQ?gm(Fo9}j$=-q#C>~g`Ap;+;H0~4jR2wkf=`9*F1@xoN|-;;|6P{6 z4dv zH{o+qIC7qKcI_s=Fy}ccMtYM=Ur(+_ZRC?}vmS5Sa}=%leT8`(mt|}V32{oYT?rAI zjUKa(rqPx&n9O4b)eeo0^ttPB50i^)v73?0f#vV1^NY+VKRoHa+~gJpLcWPk+4Un@Z-I zN?`pS$vhGS8T6(ebfcIn6#SXN-RDHssEAQ3jyjve*Q|k6FM~c;Aowev@3e&Xq>$(M zJ=ak#=g~Wk!z{Kx8EglstOqGiekVaU<2iSu=@&xjzPVC%TM=~_<6Tq=o|g-pedPO- z#<~w@`W4T(7sIdSh0ja*Pb;L4YhG-J(QJiKZw66q zyrtX-pjh)EYki3|Un0CwCVbN%a`iLhW-0!()ok7G@v7&e?-sZ>pJY*h>mYk%rj0PB4bi7`(0=Hl4XB_@YN3v+qtuCmCNxmSR6yfuDBt8k)k2`} z3ZOnI&{tVdlPG9Z8no)g3QWF;z*h)FRSZIv^#^$dqJ4%#Rl`tx5IFHhBnm-jdg&+w zWo%i`P~-wYYPy&j2vC9sUX=!_aW+PB3T>h3BlsI4ofzEwC_F8I0uqDMb&gN7zGD=ykLxxuR%&fWasV=GR5 z1R7it^fyIvp%kcG8iYKIKprO|&$1r=ggQur`<=-RN-BUnP!!NV z_&2buZ*gz9DGy8X@IMmj#{_|ISkUJHHS4f1>|P{3FKxXK3(m?;oW$ z|3Bycug;25=fBq9zXN9Xg#WJ)kem7M(Z59Je-9r1%aX45|7G~ELF_+=f1Y&Uzl2Tx z%jn;OuC4v99(8~q*Ys~C7)ayk=K+Iw`1$`l+vAsQZ5CC7e8Tzra+3*GX4`nYE=N*0 zZfHog|NTy>IaV*`G=P1L3`f_o3Q4C|CCGg<>neSabH1f{uLhe`PK+T4mj*??S~&0% z{_On1X$47>dtG=>-SNZ+(+^8pKjT@~(CoMKftAb2M{KzRX3>aK zoqk@`tEhzfAi4|p*N4jw!^a7j%WE#M-0DVIT^(W3csd}zh5z#nCqk_3y0GEVuaFVZ%Lm z0T?7CqCXfx@^kSf3;mAN%ONHO{YnB;bF|`m%tTze{9m;Vr;Gh!vQgAB@aln4| z>A!AWwr_mrjD-5b@m=pap^8T}&R7^jMrjZdEQ$9Txv+P++#zRo2=fd%wcy~5M9yfg zYm3M#M1_zb4v|ECV(f`!HT1xW911X`Pi1eqxA#uTrRf z=s0e6S<*qg5KMyvjflRK{{CQSByBw5iQn)v+J|>_mk`@pfHraHWuJw*V?Bfw+hlXE zVHCsHO3Y47y7x6JE@7|>{9IbTXf8)l@?FOwY{wh}2je9MLnnV?=%x^j+8{5#*vMP_ z4NWl1aCQgeQ|18PIsgYF$4g1+M#OtdL#2;)#&L7&LS3ZON4KuMD6moC5wMY`w2B}s zP3+#u>Ziju5FR}eYX(VF1Ikh=J-id0%STKfX(8!QY^i=Fy1k&g^Uz_3OEC1Hm6v7M zk0L@K}&;emk?J|W~X z{Sh+3fjgOuVX;to27wJ9hZYNlIyGJU2o7&tX@=fu;7+Du@Ft^&1gS!h2H=3!W=uNd zMn`qyd+b6Od`xS-nv9n0HP;O)ELG#fhxrjz+x5=Kfpd`-|8>fQz%N}7-&~5cn7}+ z7~m>=)*nbWTB=a5ZOO1p$4O8yjztMgmr=?aUqwopzNS^oO$VV+#KcDU4Awhwd5#K! zZxvqmo~k@TCmo=z=7A2rDpR?|-^Akz8Ay&VCmzh?VHpkkL0KWyNsStk4ODV0AecE* z%T8Fazvs4DJ&wNm@lc|E??M)4JVEuD^Q)sPVRrZR=??t@dUELxiFawNJxCJuJ`lHR zn+@M;I9KDj1 z7UUdS6Bge-Qh80NhvcD#gF|bXUej7qpt#Gak+z^}p=FHjn8p6ox4FK2qofJl3o9>w zSH7onUu8k@!Ditrd9n5tDM|YdzQSl6*6chylCv}%;-xFuSi={7-*Txg#{ z91Je}2yH{)6kk4zbyw%*dA8=wSP|{@b*b=_n)`-(36RF>v8hpiGOPek(GW%zO_YkU z{Ki2!6>c%XW>YK8bNKm$Upq*YA>is#-a?TAJ%sez0J|UszM;7oREcElw3R39elv6l z92b#wE-+f}v5XSLt~SDC-(4EYk1pvf=PuGkZb^ep`93$nq_81xy%n6SKkes`Nt`0- zN?e75E6c5UE*$=K>v+l^y;%p#DWbb6QXu^OMF?pXgV^Rk4?IzCmFhkgIjQcG87+^&sbvc)IJC`?IAA?de9pQq)4a3pRZNNA_jMGR^LZ;_i-qG`_e+_azwfr}2WS5GwWR9xHIW4PO)U zgqZWdygy#Q?1&3E>JuAV7I{ocicPtFPsl9RTTyipHB0Oru9l?uqk$H;A1vTHnjwRY zd9{WW(0BV?>`|R03h_k|q2h@YHa!$yQ6TNRb^U(#rXlm6Uz|x(oS$+Ni!7TNAx$EmwNWU%_|mo&2e7 zb|g}MPeL}&x8)lzqI47a+|Cv$+aE~_;TK*aj+C0^O6(0CM@uX(y?R{FS@vD8ZUMw8Jf9*=t!7GLWP%R|aWN zv80WIVzyVSaG}3M)=2Bed9YLcUf77zc}TVrl?UCXI;_#P8wF~zdU0ziI24tVo0ld` zxtpYAeX;*Gv0bZ6KS(4ES2Sccx$8gC)WJ2tMoXASmmJ)@3c~roS{oT0LNB@+Qs0*h zl)haKnPfo9LyG#_59n>P3cD$Cq~X`UHg>(lw}hb%Le4xWp)ib)Py_qN=Fzec z^l8~EYo^k>!`zG}2!`F)H;H+!)Sj4m9jTwhL`7RA-t3S{;u!?@@UchPxoExL3fa}l z{5;m29Q8y~0eS#mC7y2ho@1_C=z?dVh(;(*s_M|3oDO|X3Y#OlyYc(8wuT1o!8eZd#2%^-Gdt`i;&0Z; z;S5BmF^}b;kipHC-tT=|iAsK=;=r$)dl*&Rws*}gaQQ0^mJN*c?_H!B^au}6{1u+| zGs8v|SGP7^nWQi~%d5+E?w$c;`k5ds=1*r}mr4R%4mnZ1OwrQK@AJ29)+Bq>=(Iyq zQyEL{P0gdWbAFw8)+ToGRsNN;mP7S;twql6N1PDW{@p&<;#hRrP26*t%{5PR)!7 zragb7QE)1zKwFwyE}W$s{4ojj^AMwAHF+uV@>VXrlkurdmk+6wBeE`}#m_$m9BsN9 zAaX+5N`H}VrC>cBElQo*G{H>b(E?9*lpAy<%;yo&_t^^6XbEbz1(j-n>Wx7I9-wMHQ15Hd7Z1=(AZRTN1Y99k9#pOan)3s#gn(8< zK?q^c2TjnFJ7_5gv>FDmK0!rlpb6NhMJT)L{<#<^=kcM0`=mc~<>w_MPx-p4fb= z#%&4TeT~F@gVaL4SW~pfeciL!0-5_N@%u)ZhbGyYNXh#O(T5hf`!d)=oBTtY!rVvc znO4n*4yA`K<@K89GiCpWvA2MVqv_U0ad&rSU~q!F%K(E*a0@O0f(CcDz%aNw!3pl} zngk6H0we?{1h)kKN#6JS&$)MB(&REy{Fqrusv?pmwbS-;j=uTHVI@Z-GUT8G9+sj`y^|Ko!3 z(~`;7!1J|E&8HR9)n1*SaT*66+TU$-ZyU7N<&8h}Jl{|^{;cQt}OSr zr&aTv3Bz(Hrq3GI8)mMbb?nZU%r`7OH;kRX*!liQGG6V`fj4!L4tZL8v1MSq)~B=S z9reX2@aeO~7tip0ACvR9FOFhNcN|U5^3CpsEq=_KeKj{+S2Vlnw!CV5aS&?uv|)KL zYqB<=dzuQ5542hz&|T|)-sOsZk)w69Zh6;f@MT2*Y0GA%N2lu*(n`PK)3!~=E0mr9 z;vFZ``&p~CLA~EA*7skmm%^00tU)V~=ffq+jm`wK+VW3dZ3~>94Vei}HE3tO6ny7Q zQsTi|TVS5!#5dojUFgJK>r9d3#9QM+l@Mw2)|tN6o2AT|A*?FyDw$7raPvXvw#O5E%{jZDX>EiGHA8`n85q=-=eB|&c zZl~~7693EwD}--joA8j&_l4D7A_xdLGylmTx8w&W15mcCVM()p20Uke3lrCo&NYAk zp#L+3zd8EpL0aElAp4nq?iZ}ojcu#~E#G>miX5%1gkCdB>%c$q5Xg@R2}Mr%mLy zKdIdFlb$P8L~5^&Wob{!(%i|lV7O~3wX&yA3uX}43A2}xSp<6Ne)s5{ajuWE!=^En zLUq?d=h;#T%r+7}(I`z(#oC~IJt8fl^83+3#A=WyNtvc|!Uih|zctia=mlry^iqxj zjTZJwKG7KYxO4Nyk87~Uhd|nIWbR<*yDyo3T4V0*CdZi%soLM{f$jnxrZ=q_2IxF< z)!#gNk8d7w+gfF4CY2wjB|_ap+$HD|eg~JAmtx`-=Z2Jw(zP(hz^}-Sx7_Bk-X;ha z_qCmyK``xH4g3Z3!PA}J?dlAZ$cfT!1ZXrNPrn~7mCNZm!&dy5Tm!>7fu?+$~);+^|2rDD4&a1F(&}02{;|d3Et5A+C}MM7gxB!?)s5#iB`urt6KCYM-oOp zp3K3&vhLU@N%BLz;EEaQqIcpB%S-_mDRjgPR#; zB6q=)ylwc1C3V=GKl1a+C0v%a#t_z*Gj6dZG9m^)^NXESnEk4>VbW7=mR`s=Me?!D z_LCA*yWQN;X+HkXY1!Eih&e}m!oPHv-DUJatEz3b=r5V5p)E5%ZT-tqB(6Qm9)~;c zpXT!Xc4v4bL%e)^ZXVIaqb0dcDb&AR`*t;igdR{Ii8W~0f=rUSKHqi<@}n!nW4!q?AE~ICkb7y zP|ypmO#ap*SUQJidy8M}5r+5@qjvh zdQ810K|UUoP_>o}TOy*=>L2>oS@|59d(9-EkA}TJR+o=c97O8n_4r&EI7md7ttU_| zbSK=&Up6;e_Xu%UaK(Dqer>#07Yz^~l(p#`?Ws`cj`kX%d(Li(JYf*)+@Zkn;scMQ z_|e_>^XL{-Z7vtTo)w{hOBM#wGe(k+9~0ZB^*d1caIp~Ab?M;|m?45V&eLpD z=|d5n{Vt%-NwHYkbOer82NdK7yr`d?$$qc9r$V#Ode&aZ5|m-KevkL4`e5!RGDlO!zLk`UvV@Tr2z%1*)d8?F-?qTND z=6z)wb?}dC4kK_|3=JlWFbfs`N%J_Eh)*cAL|zTlBtC+#1D+HrZt~&oZsAU#!IXAN zQ^DpRpP~B(&-TgS1U^=v+g>|X<;D3GvVPthF8<>5Qe+fo5i%#wKIUj2tw+otjJeoeR_WWIC|UB2}v#kMLQ1E zk530Bl?CXAL38EXS;ZQ zk+;G}t%~P4<;y5x?%2A_tMZolpq6*0NKJ%;pa0?VOTJlv)97fFoYe4z57&>GSg6|^ z_wNnjyXB*Xp0gf$l$UDSB_APLXg`H(ee*~@J3GwSHM1Biq#JieG3XtiHl3`w@O(T1 z6d%f-y`6P41jGo^fzi~39)nWFeFgz#saX4k7ON7;33qhi3FIRE_QRy#exm~*7^w~d z3a??0rF1!Ddp&&iG0K_Rj8)J^6&up6k$6QPCcoOZvKA0;Rqw2<18rN;Sicl`OVYzA zrJl>)n=b)RvsaR_o_Qf(hL3p;f-LS#QL}|y^nFSCUg#Lcx`O=Z4x))!j9nd&oVTUy zkmobLa2YC;H}C*;?t?AQ>;t5q`L`b%&~bP&ty@Lg_#~|kE}Qd9g84|Ig(Lx|>49rO zXI4-3LqW@K0!50Pq&OA2p^A*4LVO;RPl^YPY9u1XD+dn>g=XMuvVNyChX{m;lHnm` zQB?*?DUp$5%i*6dwO9oY1Q}}RW)b3Rr?7&m*e11#)OU69zl_MTDrYMEK})^fUGp=6G=(#W z7pBBYQSPh}TVuY(Vvp}GbL^L~U zdKs+Ww5bR!ReLRA7s!}}#Jk{(hq+B%keBCs)QWxfi^%}LDY(20K}R-oaS(;Vy3Zqi zRpV74kr`Isi)Rl)(8}&<@h|mT8xUdhdfx zNiH?JV=p8E%lj2Wnr>LzsR|@%Co9!C3%-b;ihOxkHL~)Q<>;YobD49f=yY^JaW>Pz^Jqk0@^1D5q_QahYK?B0-*OjLDe1m&C@b$Gd->)YCVM5AG^juz z&q3MAiEt0gKsO1hVrmlOVJ^nPA?N(aEce-&4H0zx~w@}I~ivG$Y&*nbiO28C&#UCiGHPWcY}6)w!0Pa zyve$|ysVIMQAXhzeh*JWHb``Z1ZkYlZH1H)@*&_?f4*OwR~|8CvO=tCfXH?)M!?s1 zHw<=K)gK}XT6*jseDuUWG18r#?vRUP`J+-*$)@}d3<<&Q|Ary?Pk#OWDrk2_LQ6qp zTT#?-eR@}EY;%4%d}}L=>L`xsDvRr>NQ57Pds+)4`YV%$YLcf~@`h?tM;kIGnzG-w zWv})ZuMd@e8L3$5EtqP}gFBbH^VSASJ`a~~j#X}rSM5yK?asbi9;k#jGT)K?b+YE* zW6Ml?A>2G(X#26$G1po2p}TatHGlto)9Fgr*=p}XZ~1h4!Nq$2>Tu0KH5A@Gc;&g~ zjGL{Ip0e1V4LlLw1^@4q6j0wYx3U zCmglL9JJt#x0|c=8Y$JQD>iG0HOW6~mSSv_U}%wMY?EQ^RplJg;U6)RopjP3Z_I9h zD8RQC6SW3$hB{GTyBw%P9yDSk0Y3_VL^X=wMs=kc5n#12unWx8ps!jf!uwVbP$dMI zbG^+eQwq@H0f7KK{`33Absm$EvcQKK?)b z1L3D+lapRVMg8>lyUR*1V`a%AC*2MWcqqudjEg-B3a*n7UkUIykBGQ|B_E~6Hz|ON zfPgsW8zJarVoKeWVqICb!cKKQSU_HY|s8vcm>Kf?BpfQP05+_L{@{RA?> zW;}r8Kl2jcl?vbg{_otyDZ$?p;iShY&wn_V%|EC8f0jRl%gX;XBDNhq2UnN#B4%YItvdHPNHx;; zPVsUynQ|E%y_Fq9;8}C_dHB8EVVtk=9@c_r5$&vv!vcwy%1;_+QIA2Sco*}mjYTB> zE1N6<+550q1kW8Ufk;L+bC{@tcI%#OTXz#sjGMBe-1vF{uw(;K$+Q_>e3lSAb*3># zkXOlUErzDvZN3qkL{EZ;fj!};fU^+iuyV3Ejj@$S;TI`_TBdztEiEoI;UX~RC-C|d zZ9t%aiPJ>xdXJV@ZL-A4Y}td$eWKvPx3BDFxoF*0D6KXLvPH)aOE|3o-|8AqXodZ( zIZj^;`fw3{`?CK@WMKq^jUApu6~KjW9N?mwKyCBV-;OLNVs~$kd`!s^=x6q=krCt*YJ z9`jVz(!qObIJvKHkV~kc&NW##F%j?X?hbfBPuy|yODiW0V`6JmVdqGQk5AI_2=wsx z@AB_*_YU@Mb4fKd{b9xnJHljuFyy7s+%Q>!WDaJgrn=(ZboPoz3H_k|@qPo89DvR$ zYD&S>4gW=D4&y5m7#{KE54u4~+RI!q;KtO_Iu}wF#4q3VRfg)A7o-+EKB5E#1_$4z z1)i4f*oVJ#oqs6->hzPD8mlUiESqHguM=%j z$cggInbEA-%rtLk%JB?ovC38Gnrs-N!(mz*2zuk=<2Nj&Hn#?KWDYG;ZlF}>#H1}P zrWmP7RzIn|@O}1yd4O^kvr3lKcNM**R@(*89IeV{&jNgHy;%lTe`b}R z&qbt0n)hMJQYt&r3g~*Rfo#g}!ErlpO%VsyF1~~4eOOZ-(jpLekc=>c<2i2F#DU9} zAnv$RExG=Fy0>y5U_zOF*IOksplikRlnM!0M>34ju{!s{{S1Ibh-KVCf*#W>}3 z5{2TlL|7K9EJUYKwSHaxkhshemi0SiQXv3h#`>nG>_H*NtX3%rzM$g|+r6sj97>_# znZzpuWKEu#cT-J$`)Hi)WuP&A(R>(j)u2Wc`^+SEVtuXP*4X0YHE`0>iec`|XoJ@{0o0XlsX(O|vc;HJjfvdo}K(I}79 zVOGjk{;-eqX$iM^I2Gz;IGnB!e|gZdzydeGL&42IiVdnu0@R zoC0X;ItsgAtkAjEW(Nv$B|{wGVfLyr4x0^RYb4s_khBIyM;HGdEm{edb&Ki|Xyj=X z2!iL!i-maDJvgAEmMav2zDVa})D(GquWO@3cIVEA7L}S~QWBAG-Sc+Z zpm(8E)|GWAKqGMjnUfx`jMaF#$UMp2ykHJW(MTIqS_us|zPj*e7x@HzR9@x`3y-n$ z3i}u)0=@%0QQpQLix^MnPWP0y>`u@`sbb=clR-g2b<8;#xzRmwnD2bw3y#sOzf)HnW+XHVjdQIrUYeh{#I`V11EQW(kWs_$oRAXF2~}c! zzNSnY+CXhIJ^&rp+bDvcirqgSR-R6BQJoo;NTS;buC!48h;>+=`_07$gN=x<> z2SzWbOZUT%090cCM96i$+}AVo9rw%^M3#L*OxC3|9k+RA9}44-zXuz`-~X=y=eRtP zHYFB5^=jv2*E1cP($p2Ws^~E!UZ)E$USWF#%saPTDVe^SPg*~X0q$OIRfD>-LA>N* zTyr{?M48yulvu5rAtLpr$pVLjVh#-5DXl#A7y|87lLGf@zKLS5oK55KZ*7deAj;og z8T>xxEVDXMdi0!DN@)!RW@Iiu~cPO3r%MiZ2msOdfb1#W_mV7rjT%Qhc05rmiZ$hS7~Ofb7DQW)JiD( zbr`5l=LO}n9=#Q{&T;GBoFqX)<#3BR5@_On^Y3Z3a#0jkkBKN_%<<78PUR2__vI^6 zP88Ws@1jJK8U+x%^0ps$b1>BM5q{C_$+uuo2wpIJ7hRjd(jBr z$`o~W1=>YElYHB4O%0)tV~LA+C7sMF5rh0 z0104UQ}y%)-=f=!@Fnrvs!7Q_QSDFxX3;QEpw{YhR46BEFB4?HrtCngtBKlNFcvI% zsA!TR-M=N_C@mw~1YK7rwIGyfzl)4Kw29?yFd6h>9(7<%H+z-mnuW#4D=i*AcVvhn zCs;x$2ly`NM;Xop(rxUfc=HpHQmAN^6>IoahGPZ`Z5Wfnv=1&N5;Q5NM`)0N==iJj zYUui#d_Jx@#oqX2R2d>GQ@T)HDnQ`6Ti7rIfq-mq!7)e`A-pbpDwaQU|AN1s)-}+f z`8&5EH3K5n-N!HUpL6U-=Vg*TV5J?dXwi(;`$AI{Mema>3yv1M3;WB+l~ZMrNQN97 ztKLsfyS6Z^xyPm^HW3^$lzdpi8*a|D{&gonm-IrVSu}p{86svefug6UpLuZbTMM>H zrbL^)t(h$WvmYQFM=o>v(t*&v6Euud zA+THpG$$u#%6Rb1?N1{+(-9^kjruN{mR%uarHM`v{rh{3jrdLt6n+})bL2^b5wtZTz z`&~<@&%Z+KxHjI-{tpBQ9`t`ffFN%D8#B^U5Ybu~2`4(*i(}whM@dZY+c#}R(StQ9 zOWg%uMk`kbN@m*fN9xl$OJl!H)g63j9&gHqvm!s1I|plF7oYp@zK;FFkia>Le<+To zys(+3v?@{bw*n}Yf~b}JC~x^uDg;o<`B7Tk)v6>h%HXCTYNIqxSEOa55?;L^O1mg( z2|r4y0LoNRNUJ(gwE#+wDC)2z+K?pLpd?zaBpUpbeo3?FzRHndsOi!H3(WY2zm|4 z2jwxk)S&+op8e zPV_rAfITn9{nwxaZ_uGH)3G1(lmlSL6?hWBavI3`GnftjJkLVer%b5M!#OUaIN|-d ziRHSB=Xprv{guS`2<5L5K&gN~VSW@v3j{UzH>BuqOoVvD(@GxTpUDnSPX=%V-2Vq@ z!yz&}gYy%Q1soM`YQgQoe`X?_KK=d&B*US2Kj0q~E@l2RH=#fIkIw==+u)zl{_lRd z(CuHXzhUKH?SI~#{z=Mn`uA99a)U^xQYJiRq5oeXK9B7Y0U(L8oY5ncB?&}vjSV^t zNszRe_wGW>irK_^6!jcoOISGYs^$Xg3cH-)F<^q#S>mh9bwe|Z(-s*@SM1(FC>3N& zo4h^d)Xl4mNEQvHIkyt^YFOWz^scCu^gg4QU#1vw2_=xuG`4n5yZYk1e&xSWQLF`l zPXWd_Aon7{sqzkvq=kKYu~kombqw3klQ+f`)AF{{CJ zGHlh!7tL5&U_}pntg8c+8+z3)H(86bjV@Dn|C$U0gE`=$drD(VnRQzaJ!-?B8N3eF?xa@4}IRK zlgk=wwT313IM84Du`ovfHARSiHZ%T2ySmCRO4 zC^<{6KEbE@S7~Ul%gTI8+G1@zWI`+2BrBCz5{f&WDqXJ3`9`Gb;I#h6!JGWKOTS8f zLrRoz#s733LHLTSSW8+HRc1$_&>5zfNvd0pYLKn zy{e7b;l5Yw*-nIXI}BIq0DzPj>g-5yijETJ5ah&&{=W?t5~ zJ&e`O)y_=Fz$O_`hwyZuz;rQ@GU;qN@yjl}-;O+aI!#|crSbGRH^3rAV%2vM z2?@@(Dlxj?DqRm=NYa-T%NWdg?jP%KF%)fBt$d>OqmeDgfrnYu>};p<=M{Lr{f<4Z zV&8^-ST>xV7H_Ub8Ny@ja8_m`&mFIN=+O>{F{}SbUMTBpkFYJ{JRZlX99CvJ^_&$X z>R*m|ml|xifr=u`{S24OT!x2XAE!=DkYG}z90`?3%~>k*jV#dz8e@U+eM^i&26~>F z>sUAYPl(Y9vOcV^K=#zxWfP3PB3Qe*Pl` zAh@^q#Dj8d<2}IZOpI|TUla%_fm2BuB;fEbJI||hg=n8Kw__0D^ekhR5Aw|9vZJUH zCyO`7%iz_{}EO)T?VuoB_;b5{x z7C+I%5XI7@XhEZQUM@7qKRV?o7XDUsRf$Z808+9;&$Ssq@?ySn4)z`VgOh_b2Cin6 znywX*hS@2FNPbf$sX>c!0CDJM*`^**&$B`HX9%gK^huGH8O`hF%d}}w>a)|mkMIe)54xFt14=9H>{}$fdSSPxL5})(1q+6_djNdz^|b# zl)5hPj1^D>0euz3L*ZL{lp_z)|X$u>PeMs8A&f z30sAzsHnn?=6OLIfhhAnY5fLAmut=^s$Tj+pYB4HNmh`&PWUxJ)HBnxs9714+B*!a z?V#-|ugiT|9#Hh%#Dd86>R}2p)PFC~f2InAIsiayMDk|cV0DS4jG1(;E^^Y!D zil?Y2K=*F?RU#a$D5UrnNFt{k1eJm&=G#6GZmBB%dFC`vfiGPZ%w0K-Ge82^6bPka zzo+IHsC56;Zzlf9(Ijq2M9P)Oo~CS2XAB~wQ6JUFTePJLDr47D;n4e_-tGEgRfL^({JlIdW=zeKrLzw(nQ`7{Dk=3v zLNW#I;{q<*z^A!w8ZSO(3M|Y-UO$%XhC}{DBrFpttz<4anJ~euFl$RC!8fzo0wg*F zBXT-~WjndydScj?MV3gYs1yQ9cS#h-9f@yND+jk>ZlF##;V8Cu1knQfVGJlFf$Zd0 z&vq-%t9UCYrUsal?KFmjQAzB9I3lryn-+;bJks`V+)PuxY2k8XyqUB&naX3c0=@yG zvHr|hMqs?*#b6)eX<5~0ATeZhlPM~4!`Xub;e?NgIrG6VqMi+C8Nhx$!_kZ=db2#~ zK9)wKXC<47fu_xaY~=ClZI8fE!yq{OifsTQ(_=Hk?(&K`<$NKs-^~(})e5oV1yg+9 zqa^S2eZu)-4ht|&Yb2azARU|0Nv)&yXowi}^6aB#Awy0dB96BqarC$D)0Fqh$5mPu ze$QB&W}+=WC8dpzK`~ItVnoGHI0lO5L5ue?cg~A)@V;spWpZO`xCc5D*S#+KMdpyg z1OGnG%}r;cAahIwr3DMNdiOzPEo zL&}3S^v)W`&zm!HkoEj8maZ6H%;-iEN)zSSJG*zhrRiWU>4#V!nUN^ge<8I0po; zd{qLvDFfZV1Vz zhWj#x%0RL0Hw<^B40k0A@Jrtn0qzRu@A9Z_v&pA}7*AmIxB0-8NZ_P5;5LW;HV-fr z$S@Va&>17Skiz>=!*`oa8~#$wKv(xRi&j@#OIt%-@41e>nYOYbSWZq>RT-k8sKho|`@e&w{|w6h z$Ngvj4|e}^obzUVoEf16X2%dX$p@)#|r%q;EQq}xj*Gkk>X#Imm>Y_*S+ylur!$BEtcA>$mKN40H&n}sv@x|dki1fgjqPh*aOLy z7e>|f&Vhi%n5DpQ43c&Jg?(Q0?uUr%0(%^dwzSuec=n{LUpEVFWy&y_?^(dakcjA0 zDOQ!-XC)!Vy6b7DlJ#h8t-MVk%3tP?`Yt(2D`^MGo|>#o;wk!h(KTC#NuDySAfwWB z<>RgLwoh%JgHdk^Uk_YzkI+BG8J?zYvC#e!E-yQ8`_`;Y6!Ijgb@DExWjV&bREz+1 z>tyK!iHo<1aUFn;Do`Tw`*-0H9$^`)m(%-|cF>cL9Y}V0Zncr1>6a+={-+{qr@~X# zv1Zd(b`i7}^>`1k9~Ez&EGkiGe|UJvLRiLqHQ6Ku=y&2^I9@H}U+)UqOIt|8Vc!uZ zV>@55jHhI*YUYpCdMa-=dzRDCqJ2xp+w{o8Bf1G_*o)%z>1L>gYP`Aid@JbGv{tg? zlxz@^m=szgx8`y35aYC@*gf)vYs3BKG#r<#X{(x`6lfEc?%c(VVGT5h%9_oAK4sJg zES(K1jN7EkFFzr8@Vc8_cOF?7TJ%A6tgM-G>mwQ&E~3&1tSp&mqxq@7S%7VV_4Iy@ zpT|v)HRBnuTVoe%j@d8;hNUMOHxO8GlHA+O$ocN`UB9g(h(w_WTn8TJ5k9zO_2tiE z0ZZHD5U{m5&UevI*l5LvzdcvsmMqs!f7hm>h+r7|0V{h?dV-S9*v6F{Dx)`V9*dT( zGc(wXhTpRlyS$MyYOpi)@@q7N zV!Q)FSQ*7UDiJ0&M^*P;2mmwzL_XC^*-hC1Aj$;`s8>jXnd7{8B(6lT8*e5XvXrdI*}E4zvlVO|5Wejm9uL-i`p%znBwPc%gXu~JO7mlQ#*#!!=f|bR7t70q7Lr1{ zX*@~+-`f-q>-ipO>C>U^OZ9ecU7c~sX>_WPvbGI}WmK?=U-jo@ZljD1>CYnpDmUNn z^a7aGgdON?DiZn3AMP)m+=BYi~X^iaY{;sZ=tA@Q3vV2_0;s?S) zb{oR|$n74*X^!NS14YQvd5*y3F|+_I&vo9PLjx53e|U4Ly7nOeQ8V#e%~-R#(el z2OB}mK5MK>>PvDsrm3~ikFv3uGG6IwKRoSWVz<}kE>QEDEAr_l4j z7~+`Z%)@&$^Szev8%p*rD}6~ZF(80O!zYE|zNDfR9wi~{xl74G7-9JyrSltud&hNF zB@_rW!)M}ZD04O1&5R_6^%H4B)ccOC@FIOTcq!STe87tj-D8RGh!TPoO5$=>_wQ{U-^{E{hJ-pvwYy~yh;%l%frVOQ28! z9UZ`1nW|nELZ^-usd)z-Odnq%pzg)3A4UsxG#l#5J17kztn)@4jo3S`%b(Y_NF$O6 ze}!jV9Zkmr2l6m=kLSK>As6$Z39SjiP|=jZ+n-GosVp<~cCLyo`n_2eqNqa?p4fMb&rg)ZT7iIWZqc80#mfX@U4bFw^wwo3!IH zGL%t(;8J4=Ld=Vf3@yrjzPOJgKY!bd0AvXvTHV`tnj$>B2ooD>{pp;9O)r@=-^c;0 z?qq)!&=c`YIBYf=hkpiNraOPqBMK2PGA@QL21)zAe}+lGFmBaPSvSJ_o~%T-39(D) zw%41L3_oTky$3z)1$h!w67jIaT0LDZO+|=D6M!oYgWWIR_}qbRs|J)}r^jJ=BIdo- zQI+XMJH+@;76F`Z0X9dc-jK;}pY9&pxM)6M>^8ioNRvy;!xPT^EvO2RT8K!+7#06<2(l#XJy`GK zPjmDF!p{c}*P90JMa}=d_ru3LkuCprf~#(R+0CU=6cz&L?Os_wRN_P{6ZQ zw%By_jFAXNaie8VR$rI?zToWLPLW5=!C9k|2pN@V1wSN6F{qTyW+26gNNx;>bK|;j zEG}dR7JdiH1$;<2A3;VT;+n!xsij2)XzpWZzguOVoOpY1GolHLi1ZC*RZ*FOpwWc- zYI;{#Uw&K5O>@)!5>SwdPo(u|9jA^4paa+pgnjQ5eH^^dR)vP|^lN``#b6g;e1G=+ zMuaxLm}Xol(++}!=`Pv83H(T69Lz1rzt75ql1PcC0&ZHxhiTRyWk4OUIA?eqP$}II zzV^{mJRIPuv_S!wRqPRR2`R-}9)Q3*VhXofW^q=;Q3HZ?ZzqTVDw!P>PPB(^dL+t( zrkyCDlchs4^phZnIf~4Vp$Je~ZMOb6;zG#37xV+G<%+bdN>ITB>i7YR?{F=HAOt(Q zLpz4!-AZ%vo$0~>Nud!rRyl0+!v~otJApSRBZL%I+s*4nhYbl^5i+1Q%#|T{e9uaZm8d?^l8E?tUM{08!gf-EARZf30H;RbNi-RJQ zzJ>N18)9E^FHbGzA7#m&C9akKam|>}PS&tE(tm&P;W3K{1F9rK6R@#^2Vqn z@99jZ*v_->X3$9LsZZXN=^mUuI3w;#g`DH9-(dX@hy~m5e}h;^{zWY99bLnNLnA{& zLxY3WwRLSBouk9Ua2@WM`mngX^6AUwW@~%r^vuk+{iD;fi<`Th zzI<)(>}u=ku5D~t+1#mXY^izIJhiae*xu1QHeKJ;TKldU?yPR8jfN&!Ia+xK`8W2D zrQ~F_4NVNqF2LuZR5vs!Xscuw7s_cW8d({CSliTpp)aE*FR3D{W1=IfB&DveA)+8D z1Qz3y6;{zv;gaH4&`{tI<7E2zFZV`Qij!!FpKm+?fh@kM#?$40ZpYYXx%PAZqo+20))nCpuvn@+kCygikrlb~P)KRs_;bSAy0o^Ym$;|38?~UN- zDZQOyI-V~+)Ar-CbV>}5(oPFI@-;^?B35vo9DGMXvvO88GC6NS**Xm%?VHEK(-;d! zEfX~*QD742TP~@L|Ef=n`b9zJR(|O1q(Fj~F4eeGqj3=kmEkA(>o2M=0kpwI58FnQ znFEEl7ZU!h>!&w|%E|>OeeW{Smk;nCIC>Zn0GFZ!NvB>9xr|>p5cpihuNGt$zkKx7 z^zBxMVZ_oc0nZ4f3u*AzK~vKCpTF21?@aUODe*r)#4#No$Mx`)YSkY!k~$(O^Z+Qt z6w2cfy+~mqAfDUj`2oDvS3(O^A|tUXnLM&e44eNNxcmcGR6Qtb-sfgn9^!OTtJAHaZ+f>2F%IgsPd+}m()wX=7 zeFrrvR-j@v_J>6j=$o7q@VPOe43W%G@}z0qE1mFKdzgkV6!eTkCHpN(TtPZkNSrGv zGcp8cfL;6byl%e%7BTfvW;2A#j?N3A(BzzQC z6R8C#PwgP?^A8tmo(MV!e10OH){FdmJrQ0+Djmb5;SvNwcW9Gxmh zbdn=M36%5jxFJ#dURwxY41G##yizD5+OTmfHD2B13M^~8cq8O~9<&oHHjW;-Q3U%) zjC2ym+d!oGRkHbGZDu^|Hi}1|%DO*Ul5d$p9qI^kexZ#PVElpl`B@k;R6=+;X?EA* z&D1LCC#(#8%44JsHR8}QTcpDXvQ}|sALk3@m^bvV%Ep$89;RUW@*=} zddgTVPKj{m(_1=ZW%$Zdn9w=d2;ju0CN2{QN7&aq7%m7LW((vfBe6#z83CX(uxpJ( zMPOC2$n1Vfp&|$h5!*($-BhND;&d-|%6!7t-ai z>7%|Nv4R1*3tmtbf~AgVvq~XhS^45^)3izn8Zd>NO}iSmL-mIqTV0iAl{vH##!uuQ z2518h6EZ1jbE(iUrlSM&Cc4Pviok?LjwVZ|Pm(`GoizQbD8k6&4N zRn(bNpT?2l=@*4Y#aWUFRcAvJurV_a3%Y(#+zzjhL$isXSuC9JM1EO@D7*kGc&0kE z!(xyd{3inry7_yyJH}t#FWCpGvaVK)JiVY4G2c5Cgmsi*BVj~WP6SODZC=coDOzH&HZK@t|rNNa{c?+M!7bkXT zX?R2fQI32qPC_#-8g}rbl=(zRKztYLldSC&_Bs z;ywWI%ME)#P+j>AYbUGn4l#hdbo>`~B2B@(aW^0lg$<3bF}y~N_2!IC?oqdg@l^+q zmpcqY=UL=Hr=3}R(hK=`B4awt8-(EPZ-loWS7Y!|v?bTixS_1x5aa&HpEY2p{&cF& z)t5Ay#zp@L8KgS&Gg%!&x=0YFDIc4lJFPkqau{K(rTAC8kd>Yf#@PBul8EQgJ~F^3 z8quW=Wm6*2e2u+}Nl9YPy@+Pd)Y27XiCt zbp@X|4dfycq5e*N(prrbK-`^-g!KSzB#rWSWR?(2PU9p|A}?lfHrfj4zZr*}cQuP# zPHfhEl!F^ODT$9`sP_TF0MX#D!U@RP2U#F-i;KFsJ@mX12Wls!@YURH2X|x!S%LDa zaL8sR#rj8X+5TQp^EB5 z+Yh+ H04EUie+nxG19}r)?bDJ6I{%o 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 z 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

YspH;QEU0iNxu0faR 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

xu=zJIt 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%0DuD7wO?+e-Y%zNKUFJ8lv;p{K%1w9UQeZ{1HUYU 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

NBOQ>bNP-b-3YDQ5Ivm!$B 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%0D+wUBm0^Qij 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�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­QsA`M#x3*6PgYrinjd(mc_(sD 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�o&(VmCD5J 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

`e27ytwWB_ugd!L* zT#e&K#`n%S@i#82K;cp+HErmuBtSld#TsfjF3uBaw>?J90{E>=t&GOS{>sBhI_p6} z6|qqqiOaHdRy>$ATr;o6gKPLT%l-B_Bq`LmGVe$RheWtiQ`$T|@OK*{H%Mu!gs7Mq zORAnpDUcOQs0@fZLS_pB#%PK3*e|)tT%g-{rf^^y4wUOk#ggzX2%d+(S*81t@otqo zWo&^r6(LkcmjckQ8giwF+=~V;MSzvvd%X0fnI6gJi&mtOPI2t}YABS!hd*+4IL5T1 zXW_@qtIO_J<4VX&a?8Na$0vRxJ&AnajaHnmo;_P3^#oAKl;Kre%;u_kd z3S>kw{*(k~NJ<)73(RySEmZy#Xb?RB6cY`94iDxa;(np2-=~pMN8G2$n;a!+enCvV zw^3(3jE$}BVTsSM>6Bx;aSa?4m;5Qpz0=e^yOV_iuAsL(bQ6J;u5!sNhG9VALDqnZjfl`PWsC{r4q;awPRPq8nt614azcq zIGb~Kwiw8|t&w;C`1!7=?X2rHD4R$UHt(D!>?VJQ=vf~9`YvvFH2JEFvj}dHd(4q$ zDhP>!&&w-#>-__Fl$k?CqM3n3Mh4!gxSr`i|r*nEG>31TDtsA0q}&VyKj;GgeKEFvv@p? zIKV^_8J}PcHglNI7*QRqN}cgU%#8$A5r0~C>lyb*rU*zCsFgsA4;m>Gu{MVnA{cpi zUBMXdnVhL(-r%K4ejv+iDm%?JlAz;BLyY%;Rdw=tMaZ{YI*B~aI8ru|>kb>NdPuGY zTwZ@fuBvg#GPZJwGFHu=^f!L*#YX$hxE)dCJ4tF5dtZDk&UwQf2l65=ermK42x?mtJKQr{ab zJbauMLcJu_f0mF5SK7d2@OQs)C9cX;C4zi_|U&E>TXqWa=OSe0Y8S~Hu}E& z-Xzr?813R4WlYxlDTU#0qr$)uE)w)dR??_!7fXS;`sf=x4PPL7hDVnUMyzwoG9UTZ zUP?yx6e76#s)_Y$Lrv^IWt`s;)AAVMaDU;nA3UTTBFSp);~(sgo~n1-_H%JzM(h!Y zqlUsQS<)447yEt{v0d#ufuihk|L90foWNQ|uvPSj`x%h=4$C#-aE#{jpa71;w}j_G z=@H5UkMV&TDeGpdcKb9+S`FZ#`J*OeBG?_X+J}hnl$uXuMakT%wKF_^rTj))>-H11 z_y-{xLTnmFS<3jsS6(>u-;KWrCf^GLzKZQ1nx!nt7#w?^+@$%?_o^Uv4;vf3FeYju zAW+e~bWRmf=ir^A`A7_B2jw+1A4{ien#S@n8b`E15o1nBRtfDz&0Qr9=RHg-4KOzD z0dU9)vHIO@{$+drzg0oB?*9O+09OA6D+bohCXStYmJNDVjm8cgT4oL6YPE*8ZANx& zaykwC3bp#yO*-avum-SZ+Ge$|HY!Gqde$v439QH`U&AX`t!-Wh<6$k;jVk4}D`>gX z>3FlGlrqVgV(}?MD4FA>l{1<6l4Mk}xx}*M)N*t!8u(<2n1u_Og$n3+vl;ku7zOgU zr7PIPKd?)ba!Qu5h!$~4l`{$Evx*h7iTPfRE>^v}8$xD6u7yLl#g`B;iQEdb9JlOqwDaC#w9~RQwyRS>xJ43t zWxp^u0hJ5b)@{-%68L_~Rlk=Lv5EV{hpEe4inNiQ(UIG#oHnS;J*7oi8^`L=V(^Mbso++#_Fv2=yWB3@+i7mg>a)U zV;+kjhvat<+G5=Rs`xQY5EGnTLNh{>Ue#O1%WnoYf`(j-|JEz8vdnM)tq#pJrnfzHPk$o(9_d3#P%RmS0qjLvf-lpPMIUfKE=3eK zP*wU~JbjKF!Ur2N_mdG38fB3!ULA8bAx>TS!x<{}Gl=RHAKL;E&%nq(-E$?003N27 zVdK1R#NV#se=;Uz}@DUIvW5bC3}#jD!Pvj#CC$Y;57q(fxI5y}!`r&QVqz~8Da0CC|7?GYh8Yj#J2Qc&dt&1Ew8|F2PM}!I zPtvsQt+#JuXn0UQWDpP1$=7t{?^SFm>c%j76jsM*ZP`%LhB3K*%3q<-(ZGVYq9;x5k9&phW_&S!MBZHVuFGV{C!Wiv=`*NnaRi>5+H18_3i$Zb7gJ=rzJ>YK#!?#?aey&xXGW>9+m40h{(M zbb-D)h9E5(&Ua)!ISQz(^qz9?1eh9spb~j!jc$N*TcE}E>AUVtjF|m1+FZS_P+mO3 z2%6b5vU)J`@$(ioqF}Xrj}#ooa4Mo`{TZnB9Hm4&!`^YsvLogPS-{KYZCNrhUXeoV zNYR-8(Aql#$O<1;?oURbw3uizq??mIl@_;e{`+kg0-8d+HgzGDLZs)#I&+?_M2KE@ zWja|RN*cL>#u6$6RZ`^lyT^0t{creAQi5D1dP1p;``}Fmv(#T%neRP-T91PCM2G%b z@*51-w*`jF_yK%ulS(pDteK_mQ;KA03&k>O?cF5!*8u{T)*o3-PwNq#N|D$`RLA$`yU2ZES$CjPzFT+(gs9 z8s@AJ7wYKNcic8G>N#W(UiIW*V38K;_#^+1-?ke+sKFhLLSgU`H%QL^rKkh>8jtBaS=}ww|r_^_dHis$O zcXU*zdT}92w;@!CiLl9u*V3z1#(gZX&aa6~)`i(%XN$;~jt_x)lnR}6w7zlK7;5VQ zGLhOHkvd5shGEytxJO5ZAv!?Y<( zC01V4ES&^pjIYv>KSSBCUw}v`bvy@_>+WZdt4FP#^xkO>z1%8qNJsL{`H${Ogh};& zMRz{vnti`GuMOZ#M1LeDxrZnN3GS8Z`P5I*U*^7bC^RoHybE_4O1J(u-IhsM5Zw=)KHFnqVa^V z+GX-urf|8H3&u7IuMV-?kI`O!2I_^gj#N?aHB)A`3z?^I+GOzf)rq}pk%T!}9kx=z zindw2zBQtsKXZCli8vPWdsYesHA{T#;&UqIFD+$qE)fW56u%f_fPI#IF0XY4w{<$V zeF2|;y|{0!m~XA9ceSu*m9S5ZsC%W5OPPR08drK0<@->gl4#Na2>wYfW=|l>s61dy z1@J`^Fl_*sF$c`q0mkG3p;5F;CV&+iz`7&gzzcBp25?~x_+bOMvtQF3* zZv;>ZpwkRxQV(VX`+}_VdD{Ju)q)rld_l?qAg~`u(U%VF4^r@=(T-q}b_UwK=aqAz zmT~~Xc&mIKS$Ap~C!k3Nr$r98v@^AO2;-YHcGFBwvurLYN1#zEo4g;bRxFdsJ9@oj zR+vQ6p2`5irjy8`pTepTK&zX?QWUSD0sGnfYyF_y3gs|0(^wsVNa5fYGQEO6n0q*L=1iC%@MB3fUN3-rAV_a!@m8B;_t& z1E2Bvqk_cx$Ga$aW_bruIL`Mc7`Lq%ouA(T@CVCT%Ta=2nTX%n?wIPI-ELJJ7`J^7 z@l;qE+YZFuX>n08S)p>M-9O^B;KbZ*-(TLitJtWMud2m2#*=}BjiRG}xrgcn?f}>j z2e*El-_H7q^F2S(A5_!rsE*y*HXBa8!wz=me-n}xF}R-iL;?}@!;bgu>Dpa=#2K(H z0>Pn3!jnDT?)~tl`eM#s>it5B6)KzdjU>Z40GY|TEUrr@7;z8(mNml=x=Zng{P}BjbK}k5M%EaBdoOD89aARGWSrB%XpAkuLuW61wuLi5tOJ3Gk^{s4rreKwhn$=7L;9` z__CCC^k>!QO{f9rtW;}epXA`9cfnBEMGp5UJT`^sxh+ac$cquxVy&iUhJQS18rq+x zoc(dax@{g4j*VpPYHA02>&7|1bE+QoX?7&kGFrpB%2Tml`cJ7`BjuL5SnA5p6+>4G zm=rWz``!7%fqnW)8P-NOZSo@vsk)k4{guC_g*b@@;6+_oXIdV&*AT`>BF%kYSub58 zO3!R}8o8YE#^=b8CQ1QR@DdpimJw%}gd@jQQEknH+7L1!(gcF(_%@el*1DsK6l2sr zO}4D@{-#;i@W4&s)OXxCrZS=_i%##s%Nf>~(oC5r3LU`4T_)}pnVUtG2KQ(-_pt|FpF62cr%9-DG>U@vb{N~gSHokCAAIx$J`eX~A zVOsTN9$6^MhVz^xauH#TkQO2jugy29ZAf_z`Dm|z3YYjCpZJD6RZXZKxryVPT9ZyH zUcBW(*2baR=sg^24G<0$3(ue2-$AsT zDhn;K7dRVq%YpPHD-9ADWSI?pGIUV%IiDBJw>UfWrWM?nQFwUy0bmQC(=2ePpbmtAcRr(M<0!~RD-?Ed@F z1Dwezq=;6wwy_OlJZ^(hZ-3pHV^LZ?BwQ*|3MBj1wN0AU3_dNqhU|mVHssUJfTI-6 zGR7->eF71f2w0T>YgnwR;qWQML=l^i#v^J{TCdF_GOf1~ECru3LM=hi(DSsLLCjK` zJ}iY;X`HlCzJiAW4AC|B>IQ z%mBjKU^4Wwx{I!-Tz;$)?(&(W1=BMvqL!cIlrQR%;gF1%%7Btjs1@2=Jz8Zoq!X4= z&BR)ygLeEpQJsf4cil0hfD?=j#^rP)f+Y4{=dZ$nQ!LWcV2V1H1W6DmB@qOQB0)i@ z^$pPJT&Q{J56CfFqo#qb>B zKJ-hg`18f@FYtpa_xFiC(GiiCQ-#0Dhv^3ufVt7}SSb$tgxmDbDqIDQ(M-DMqv6lK zCIWwW$4d&o&lnUzA}})GIQDgc{4obM>%x2?O;O0-Ti~M7G0DBblz)Z%?zOd`j)6@6 zr}4G{AMd%3{Q+eO9T|z?g5|Z*GO#+b33M9xcs_Yq1;48sT?bK0D3x_0s+31C%X;|p zoc%Vup@9Kpjk$Q7Cr3!s&Tg6GVR@$J=t>3kR2Hrs9+S6#mdkVA!`Z__N=%xaQ0pOj zpt{~v-7mhL|94D}cbt^JCLkjpHs(&J(Q7fqJ}dwYIB(2iA5o}L@$3C*JqIemo^UZ`P$yKgq%4fj@@W_?-yO}JF6NaMM-CIB z5A0nKwBNTbAH0YPXX$shb3NL5#9Z{Z<0Tj!dL_0h#eTXeq=Aw(5A8*;1G~)>9&MhrkbS{jPa^7Rm=Gy zUBvTA1m@tHW4U-A7{v1$eL`9$82s@0AX9Wo>@?-oLMZ+;cZO(@sK7w~UW=LNi{~$UF+Y&6qB)Xt9#@l*pI7QHMfSAippYZ0h zP)KS$yz}4(e`^=`BC%T&lh6nv>KPA;l5*+Y`8SxsP24^o(O|x`?xHt1Pa zhXpbGwx~G!j;vf`#jut)rE(;8pg8Y{8Za(X7YL>fT*w`F#hy5*dA0T@=2(UV<77PH z1e2+}9>P{$l?9peUeC}9kT1(X#;>Ly-nyk7+cVNdj6w=x7%+ivIo8?&`pWh z?=w9A{aOZn=;5jp!U44@JgTvZ0{{mz*Ab0WwF(I`$pwf|>@@@+;nuMRtgn!9nhZ$N;-yk@7O+R2q~Lr}aL_}_9XVbuL6N|VOF zO4F2j;Ivxcj#2E9N#eBDyDyr7QyM|jn(yYcL$1uzrZs}j%^*v<;nSKylVD$%9L8+u zM@?x4!5aTngk7!~bY+=7tr2)v(DkdV|2DGv#=Gd+Det~^?D_EGHmK}r>-*#M=F`%* z->p+W@U@0uI#cdRin4%11E)?VSks(k(Y`QKNP|zc^!Vpg?=kz*f^VkF0oin&hP@7KC zn2%GvfjI+=D*99^I-F72@5V|{!}JlizYXqxFSUDW^h2QyQ0Oiv@Cs^C9Ey|jw_fl+ zYQewUe=8zke+l~jksg;=K{ceIP--X?0`>g6;u80ts=tmf9p@kFLdYgMBImS(#lR^1 zSG&j>={o1cjIc|y uct+)^ALa65Wf#(;{k|O@Sy}CswH27y}lb5)l&Np>ExXbsS zhX$GWx@gFPV`D?9sI_b|=r1etd6_3xL9H$m%c+UMPpB<7Cf5!PalLyia$PI=+IOLO*;WH|U$?g0n+?ayhJA#0(JHM5 z=h*^Vs$@lY`Kp^A!ol<61>9k*-*0stjTy+6?rfWLZ-*3>o`1d`_ibN0_Ys(*6Y~bn zZyhOP7$xF&<*o>QM7hL2oA-7p+zdJcS6@$_d<*QWoGy|=b|pKR^9xuF$oHab`2+Io zrJ(njk;-bpm>J3S=3sZ{^A= ztiGsV5y|)LFD-Mncowt5^V7#VOt@y+D2jEct1xY*VXjQY{S4m(HVIESClLUa#k4ab zCNcLpXqJ{J2BmO?-kKIocsr!$$7)*-kyPx&$|HaLw+O5$s0gT!-vi=O(>&Pm`VJG= z`!V02f;=0~)8r=d|6%McpyFzlHPFEw26q_T-7UB~A-FriJwSrHTX1)GcXxO900{}2 z1V~8c?d1IDyu02ycfDKGG}X0x>&)t1)m>d*;5kEY1}SFoGI(yrJr?vk{thx2_f2P#x#=ZA9!>7B^c{!=A4kD|78ea1*&A> zpgISnjH=Z6lJ;CdQU&edfm|uHq~vEtnW^iY$gi6Hut;R9$J|S}SJvnsCkSW_-H6;< zLFFYj1&^YF7M~9?dO}Rm#uH%Ysbb+?N4aM%4t+l8<`0XiPm8v6VNk4P;{0j*K@|PO za=du|dZ$ZrG=Xbz>Ex3Ya&+c)yXk{<2N{WkoK##{?IrU}PzV8IhnFvEnOlmyrYCn- zes=!gkP!m!wpN4&LP~A*AXh$0>VOTi3|vZoxf!1YW@CSuQVVLnn?AwH%xrHE+#b)* z_U={rP#wDnvczyAF&-i+f|*-lS;M3e;|vR?_VwnE=~A`zqNB}@5RIy!ZakDJYY=%n z*fgJ5r753H(p@e1Q*70##S(9|7uD!fXnyTb!p2OwKI>^4i1`O|qtX26VH&T0Fxh|}06Uy$0&cUdWPks{IbYH6jb=q7VX>Gi=l)p3@`@S;(2`w}5xQHA1%Ei?za ztFc<5JA{~8W3eSIhqSRrw9ao4B$=NmrcT@vb7w-{7GSjPy3@&^D$clZyz9&z6g)qc z#f0VpInBs<%c{=g32}r;=Fhjxcos;hy2TFchqWTS)tK92(_Y7|Fd^uENh@)4 zvR0nEi_0Iae$jWY;?r(kVcOZtQl@u~|NQ0P?J=cEa_(5*QK>;e{Ih~Jt03w4{pwW- zjP_4lVdt;CvPvb!iB;KpO>^h^3+`>QXo%ngODVZuJU_#%O(NCnt-R>VhSjuJE4JjX zAJR(bMl0##c{2y^3w~CW`Oi&Ggg`%M%le#1fWzd~dD}C~3hi5F-Ib8`w{D!*q zFpwuc#}()Fk3vW?s(184bAP4N=^tP2#FoKL_LjeK;h4Ak97sqBz2ZFE7#KK@%r)-a z3y=YpzXOywy#GeQDQM4asxlw$|yxR`o8?FP<07f4C|eq^fM!i=MV&)1tE_5 zps_7!6kfEdW}F9?VmD^-vr?0=kj43+2AnN21w)LkWJt=W5d#^%?BUcakI_z{Hwq~H zRoI=P$|}|)di@sk#1&c~wMwnx7ptS3`enB9bkFFwyrm>eNQ{DdtrD{zZ=+$JB;dl} zG(S|{@d(PXCCHtSeNmTR5s}Z1@oPU6tgh~hgrjem@F1?F=I7AI&>DGPze|onq0w0% zOwH#>fNcK0Jo)a{F-)ZteM8W?Em|Yy;{6gvYROw91;MdeX?$y$j9P3>&{#QM7UF&a z-V3+~M7BxLGJK7*bbW%#y;6e8cspEQa&9yKjnMkJ-SyR8&(9CjWHD++Cgo@SBEfr2 z%`+R?a->sBtlUFh3K*|oCE=&Do7WO4BRGc!1?Co$E_)j;ALNX~MLoo^Re zcNeNd-l{8dU}*s*!i?vmvULB`Y!v-_n^i) zo@J?dQ6dx*G5YbZ1e^s6gAMu_qxUKgpluKD8_#*740S7|cT?STxJq`@Fdrg7yHZ3- z=6n~N!t0Xv5QwfEF?5FyZsBYQf;nI+F*Fg8J+~SJcIwgYQ5`eT@8*BqAz_fRz9^IA z4Ha)Z@Sn#cawNQfgL!j$g|MK=-`a?#ZFYB`H+3zRul$U;erSSpbHwQo7!wouIhrR3 ziPw=A4+4juiB7hKg`?~ukDMf_RyDZWGccV{`gzvZS zK0HM(dx3D&Zy%#*bMD*TaLv=hrxjcFO7|XD2N8ffX^)}Q7n9Zd+F_vuemYF$bs(--a!+Q3Yc{-6ChI@y< zX;hSSPbr!UY5r9;`J%)oTc6x!=Vh`JeNFYeVY>+aQ_@|-0*iHXt*RR0YE@o*&{Qdg zs@y(C%^{iD#%xZqk2FiBUJSlDx2mQ%*cx`}XMx(;Y!-(gA-7CDrR>0end?CP{(msr zVafh6+lQ97eCsxN6P7iySG(pn-K*CC4Z!wgt8(vGx)*l<*`jEbCw2*lh%F!A1*#*f zJ1@&V3g&*6E&K#jC$^5ZzkE}xycR6FOXxpdySP67_FJaxcJ|;*qWBA6!L3Kj#o_(4 zL&FE2+#A)h&!&Z|)+MXlIoH0mYk=TcwdP;D=2yEG*1XQ1eVsqF1?ZhBR^PTA2lrjI zFCH?dUj=o32phVMn|jKazA2ykDIpOt3%g=Q}=^&&x1+nxpmX6Zr+M^?uvcagKg)7S>ug$$HU8<6|43KY0nvpwg>t5 zE84|}W~~o;HD63xz5|iOs+lWB&EE~1zboe-%e`AxiQUm_`Yx9ICz|%U9CUsbRBqX*)ZC4<&gYQ766ElcE{Dph|IN!tQKnZ=Tq<*L3(#~mnC zf8$SFmZ|&(L_*)2!vU!`K+S($kQ%^0cmV&M1_}D(DnR}e8-I%bNf1|P0cYgFAJqXc zh4LR706Ywde`WJ)_>Xe`KhnQ5fBX-{UvW%BLh?Vlzo-3EOZ<-t5G?|yh#Tz}5sobGa zxLRV8L9Ea!#$YA&r0i1rzze0yCN?+81ST3S`p}i~*pPHUy4Ht8VYp8Gr-AgUPQ__*cBTdntgB0DP@%+qalYb9?oMoa9p>O&OTNV41)8(m6@Fdlw z&Fr5%YD%Q6ef9=Eaic*WvZhs~Hz{wf$`#}vnmfU^*JWGr=qW~6J)@7v3RcwN z419YatCR;rQDE8{SgJ2u2i8ek?!s{|{TN}MSu7Mqcmz{igvqB52`sJt7a1M*nYKj*HPSIKTI zykkh$9A;ljwqPk^yp3%g9J#6=(kF80_z#Jm1A{6dO)lh;*JGZ8!S^ zm6+i236EH^PRuCL4%1Ith#{5G`>2+q@rbD)xl{lVR zCE(8r`C;G(Wy)K#k0%t;6SJ~9$fp?@ZyLYF|~CKD$!tDL4PDH=%7zPvu4N7T{~q9=G;rNvaYsnGuu38yem zL+JxT&hsuk*V_|H1#OM85T~Isd_3(_@+mCRs8UY^C2prz2!@KKMAr{rRpYpN?%r3j zC=YN8c2AR!tM?KRlOnq>8^idgmXoY*w25*aKHcrrp~tlocK=d#`Nel$ey2rBtheV2 z%~QqrJbhK`ypVl`_CdEzIq|pd4soV?fa3W0^a9*=EQuwPafj+tm7Z~%Cqq|}t$8lP zCq(3}u9*FSvD;@K4`bGx7|-1GxC{NvbKmBq*{#9$L*DDMyA|z)6bhO2 z>q}4>?yRrMXHiBo95UVb#cQj)84j;~(pT>pFF=LmE8XRA$d~Sa>rZ%*yk2BD>nsU@ z__9kAR7;@4E=KNroyo<|JmUr;2`69gw($Dv_|BF;ljtan6M#C;dbT%jM2&AAyPu|E zB*xK*+hIfKKl29Y{UnWQTERjk@K!)7d}k!7$15>`n*5Zeosfd7RkUoWWl$A^?Jm38 zplCnJLQ^U+%8N|>f?Mhb(WnSv_}5vmzsUT1skAG(QFI}yVut+JvXyiZFIe-r$Em?h ze2YnO#M}eq4DC@zvl#m6;UT%Q7b=p&)FP+9I-g9^ecT@tlN6qlA`c{9=(Sjqg_}cA zN7zkdFQvnFG)~!B#c-O_h-@jSxNtFhmYl_EPxBfmKjH@p7~gm(GGVBGA5p&XcwR`d zyx}QNi=-DS<9ZZ=d)lXkJ3mB{=;|Os1x@I{?3U9DfCAb~WI6dlCf7KylSTQasRNRu z6mm(%er>X0r+iqdO!^vQMaz{#v0xqDf^mBB9y!Z)W&3)4D^0ONK{%x;J76GpOt8}$ z)-N`r%)voLjBWg8Far5=d>Q1sDZ@g8>9S|&S%cwkaG!fjL8XT^gSSm&5*Yo6Rvff& zPV-rMtZvge?{b;SnOx@G$}`7vcrtZBGuA%_^!IpZIY_7W#H7z=(iQLLVo%+7sHgDA z-k*xWOp%bOPQMFbZ8K9yu_%BjDa{i{|C;jO>Hmd7cRts!Cp_+kk2oy&;+27}Gn;UX z4;iNA9DcFUAPy>?&dp(_=rDp0q(?J`sF~X;=Xtx~DZ|vh?)_ZvyP@xMqV{!OC{%XD zZF9L6%d^xoU>u^EUf~5s`a80UUTegZ3ueww+m$=M&LzUAwaZD2KEYdWrpwGS_~o_- zcf}QKs|S0ZDXG*e9?wQ9BVV1C5&3p|576`xb&;)ysKvonU0LgPTdyKJEVpH9toO+z zXRacyN2sZYR$ao%1_;r>P>fm3^o0n8)t$b3=Q5Q)X7v#BDQTqqYZFPouV1AmaWZ8< z8i`K(;&2!x29{DwsLxO+X?}I0AJTQ($o|?$==3+?$bk?$KO3;QAtj|L6<0T~hJdZO2@I(N1(2sW7^>nhQM(WL0hRr%!;2OTvGaNd>4&2lgeu`rCXF$@XP^)u3K@~|9mv+Z)REweD6^0R*u;`%Ji^+lBHLXh)} zpZi>Z^IDAih=={=1^1me_q_y9FC*<4Kj&9Tp1n8Zdt7X7G&Co?>|Jy;O_Y=yY^#QuLI5_RX_~VR>1=!d-oUGgIta;ejZIqO&EG%>M^reKj`PkT1I5?F!IDj7D zLTqdx7bqYAdSI7+5|VKUqy-PJ4i^`wcH-kF5)l>S;5^X4Zv)?s=U?*?A|V0x--bqf zf|^}x{4v`82Yvcu&~g5wD1eUC{s&6ue>D345xFvhAiHnPFs~&>{s$Sb9Cx-(; zG6DY>fE#NTH4?z;W69;Az2?p_kA3LvJnQP-=KjqZpLjR!W7gX1HiJ5yn)kFb&0mjm zVu}?YN!?wNS2iUtew3G!=GIq1qU?{zXZnAZs}l3b`yhB}1f3&Eg8jZ`q2Okq77Hq- z@Ve*D;;%M+AkH0-Z4KT`OQvsGoy-ivSsQk`F^f%CIw(C!Veq*NdC$yRH@qE)cTD39 z1f0-6+(oqEv(8CzyqO?@#qc%7;)r8hQWE@4riVZU1AI+mw;$J1(wG?RiIS^>5m zbEELmn5-wa)=PhSt#Ed#F8uw(?)Mahxqkln%kf<|B8Mled2B@s)~kEP1(EL)O;_my zuZJ^qRi|RgKXyg6fJA&lZ=y<^juN7P zubzc9ha$MLbjI!#4)W@eCvl|R-khvZT{l9HH)K=%>shJ{qI+KY!LFMTSXrx{ z%>lU}og*Xm1=~Q?kzGu22vK#NF&TFvq{)rt1J&2$fMQc#1Ooc54AvPkcY%^}``J0u zQO!|hZg;O&dNH3&h)O0nsr`04%G^d@5*b#?3UQ^#x~Zc%-L?DT5uwU$r~bNJ_%hvY zT}zbxI}}rj>McoOdb`t1Jp6#1a9h|d!uOISc{mSUryz{MVebAlIh!q^Q( z3|?va21+T@&_UuCq+amC7!_7uu3mg!kY!uV`(mJ10Gx?NowS)l8q38GOG~^A1HK$3 znhxa27ZqBv#8G%grZq&vXo^Ha-b%h^io&=3CV(*BncU`7ab@;Ar&Y#KA2Jx{?o9Kw zmFwY{2og3geL#r$KwE{59&d2-R)3yvG*P1YoA5b`w*%>3 z{*R<{eZ?{&I%k7%qH`JWg&sWCI5^yISct}P+044?-VkdUZe{4GH$&2F^Hw$@IOiy8 zDCIEs!P1Vo_(ox$So)4miip%}S!?4}E#!zPgzGgsk}w7xtxlX4Bm7AyZi~Je9%`}c z+Nz-btlU%6%tmBaNYTWCBzOp+2$CT|?t#XfEksJ;MCAvayxsC!RNPTBFxE#Q zr{=C87{&AANG3s$lzWgRcPQDQ1iOibOFLfoxur4&^$4R3Y-lenu`mc`Y9n_3r4Q!o zq@a=bs1pbh=kX05Ja(`I4sBfUaPcfPA?->1FS+%A*z2d9@1n{$DKxf*gV>jy6khPY z^?Z#^@x%^=u39!v@U&QPkul!qGw16tRRea3=x&`a+#1KAcsNQK8w~ zX}-ccB*@YpNG?u;iR_^<)wQe4{RBflL@+`Y_=V0UI`^xgqC42igcB*Q>8JZ0mdDsR zM2b5J(iDY4dn;h2#?`Q3Jl6nGm^{pj(|_vcj1Yv6!coipC8x-V$*O#;K9yS>o91a? zB>qFK0b*H>CLRMpCiURfi*2%n7=#1?IXYeA^_~3%d)tK9ou-Hc^d`eb4H7i(x?azv zI7;BBY^Je>U~${-j+5qcMD~>VGQxRBAS7EpQiY%*LP8N)MOmz8ved z_MOhb4uO(SVn6k+on(f=Jv9w*lDCLENofuoEY&U`d%f(3*Y^CEI1p}X-O$OT#{iA1 zz%1)mydj?BYwSP!njzHG7?5fpwJ6Qbs}lMo@t*1%e$cI9a3zZbe|cq0dEL{`267QI zr(NV?Q0{DHO))9wfRTVnULso}Q#7pSjRPZH+wh*>QCUmrTnHw7YHu~Cir&^k>mj0KPSobHsgeHS^CzeD6zgP0a@bJYA8P?0m| zd8-d+1y`68{8hq<=CqtP?P4iwr5?4kI@tTn8-}cwHodf$w45_(C&pD^b77C&D9BYn z)GWd3RswL7$+&bkbPMYpcjLKJ%HX1NlC=>p&iOr>RW?=0Q0SD&R)WD6NFa_MHY7T< z0x1Y7rw8*>5}9y5CC+DdS(_=vrJoNih9#&+LAD=!kvNU0joIm*dyRjgr=QW zH_%I3RGP_r*YFgJD5FDTkEX!xS_iE>W?IM@xO7ELrD?>`Gz4KT3PEugjVsLDV4Mt( z_s@8=C}n~Pt4C-!`^{j1GptN}A?y^TfC}1QGEz#uWS{Ll!$M@DbW$j_l9$HAh7qH8 z)yPmQikT*n3t~4DqeH=Uv?7Dxls&b_I62gbV&<^hTNt);h!uR}%K%@LEQL2?Mp#U( z$Pr{X@RG7-u58OMzgwbmJ((W*m_cZ1jx?yl36_#*;1i=_COdmAZ%ycdM1kvlp06Op zD6w}y78lM_1-lz$W}Jv)2<^st0{B5UI&f=P16FqYm@R}V5?&I13?mfFACcPW-PAx$ z*l8pVQ|lYRFS7u{0+X!%|lwuN(^UMosOx1PW!}nq|!fC@8WHM^gd&9BNHYo=GUwNRCf)Piu#S zXI`MdQip^nFKNZU;9F!_Kvw3KMj=SVj;DoXM@%dXL0>!SsTQT}-S5mP9&-r8rGe$b z!=EjJKXOJT7U?*KL7}PT$`d9LIoiWyAu4}23hhT8)sVTdp=H1?j+5C?vB+}A zWVTX9mT&e;C_()QilcIV1y8D#i;QKv=F0UUp>}{wAf1ZJ`PWz)G zebqX9)ScmoI?R*;=2~{fOzvZc$(iG9rot|>e^DsclRB*}NVS{1Lq|NbNb>hW^gFDg z)rxQRo5mgP=7k3bA82hk1-vuo`D;lpW-rIk_{AGI|QciE}HmMM?)X^gt>)yV%bAR9U zz~#m~LwuIFU$G}P;MKb^w)NAo$38%1MRoWV+HoKF8$K1?UszD!GWfsvDacR%2R{YW z^pBsiohR|X@mZPlVUgsQ8rg?t#piZqXs613g96Z4PlQWXn9D+1&|XFAt$~`)D83dAI4O&3^0P%)>$|E-T1W{Pi}M=4;8o{k(HG$c^xA?PYP>7}3k*Nq z0ke##u{Ry?5m6rr zv$)VI+~x3U17E}=YrMX^ENWkaZ4`AFs~8!xx2Uu>>rijU33B?S(+4{werAcJcw+bs zy~lq%@+Wn|e!GE#!{s7kXT{sr+eIUyX_`_U3O9?wuP|YZ59BFcu}2F1 z>OzLgGudowFbv`^wBj;-(<+j7vRB?O^6|74W-0KYH}0W?8{+%eD8A|Frsc(j0{i+T z5J8A^UW)7!D_^14nm7$cm6ts zT=*0YrmvFBt1&X;0*xGc`?NR>9@5*`3Z1_l@l3o3Y>N~iS9B{o!Qbl5tSS;D>hX~_ z)KJy}6r(2NDN3|>@SkM@NIIua@0bHnJiECT84%IxN%l%xvff>Na&&#*%W<#~y!I*Z z#meF3@r9x)!X#rn)9$@@t-)5#$|HFNi9X%RWn+|}t_{g?@?hH((HEO^@bJ+(Ng=ve z2`o2XtRDQdnrMh;r#dmKlI?TgT*jw$-o?|1di1~%pT+Q;-{vdtpXVeH17{BEKP7WH ziKinqgW0d!3|Zv8hML{SO5yuOvsuqScVHh&)4f0b@cPSTrZjGt0-mh;LntCO|)tCf|!3rQS_hkdt!?OzY&ZL z>D?rm#N4_hyFv&&_`-F!m3u&qRg9jB0wql;0XG#O_~sLiwFuZC^IU0x;Us0%Wnq** zO$__g&*vl}piIF`MtSGG52dqRpqWI#nN72pC)Ax(LN+I>2&3Z1OwU!N*@9hG~sW>bWO>xo>0laoWK@_pJp8sRJUCDeLpoqJA=qXc=;xWmXk zTSD{{;ZX7%N?35u5T$TmPY%(ES;>IeP|8lcjivG<@9P^ix_@+MiwL zKq(~1U%)XmqoVwLNt}J=pGw|Yr{Q!MVr_kDFO_CkA}Qvme8IC~G?Ek1YuND$J;9|T zi3*w-mkXf@a0X#3)zz`QOfR!S4kR`nTn7vH^rj$Eb3HBN+-apNDP<8)UWiM}1!+j9 zk~BAmnN>c9p)=%)p`OyK&LRx5DyNbQdB*$IlL?1IV{L4>W~0B+7L{BX z>PqV7NPE`kMq?f|jOO?n2p-a7KyD4&K^DL{=MMp;&;*b6!g4fL%_VlThpVkh&Su=! z@AN#Qaq204K`xc3?ha_Ot5IEH3|0VOk2ox&;;k0ICcq|VSj{(MCjj_Z+G2Fc#Wnbp z>I6+;G-;ykX^XdQIXO8!bNME0>ZHKWKO`=IMHQq_?fI$Px1&l$F-b!@1cTgk|JPR< zw62oE0^fbdH*W>Dv8|OVUT0(FOjlA!rJQCcFZ6s)68mtC%9#}VFjJP{nZT(nOlRW$ z*7Jyq7DF-QUL?Een;>oL3|3MF#?wW-c~f)^4amol1eG-5pw^k6 zgcNdVh_EQHY*WD}Z>2WxHaJhha(|xlf1b3+CTr+2%}H!`s%B>q_1u6B zGlvibjCsi3d;|c%_FKO!^bk^%@?qdJDGMvrkKpMEvYH`qC6Sp&c$W%f8*iMMco=_V zlZt++08U3|ay;S;!8d#UsIU@q=i=|3w8M!kWBv$<)?YLx#3i=NJ^hVzsVDa$KWX2ofwRQCs?6(;3emD{l$-y~cv%kh>W>wCM zOt7V@ZFkqQ3by`+jb@>lP{<*2OhOT6w6_2+9K53RP)IpXp$1~YD{{6|_wp>-Y;R3w zgc(jo1351RMtKTPOa2ltZ7nLn++$=_%|^y@G-N!^YH6IL9Iv`{ zcu81UHnSTE2`*sqoO8f9-1WX>p_!yKXV7EhkTW?}zu}6?5mu2IjPxX7Ou~>e+sIG{ z-<%ay9|Fb@2v#;nN+5^pMv#{r0WFgrqA>^=`y3HGQADLTXeS3R>xr5&>)fdmtVhIa z6#*JP&`Wi1@9{-0 z|D}yfNm-Wf5I#<(-;C9Ilz5m;?MIgWClQ{5)CUFk2-=@wQUbrh*<3x*^GS9B(gH)o zIG=4U#wjiMr3H@3TZp@-u96)2qy?tPQ{rqc&d9+v#NE+XNp`%_0@r%jK;<^l3Mi+p zz&*s>ZUc*PHjn!&R<;wNF1>E~9CKp+XTOivMCXs0hTJ|KZsQzOC?XE^`FGubyM*`)4cxUC0@?U(i9e4F1_3=6z z`Yr$NQ#zphc$D<(J`Z}A2L0s!`@|7?U;pfl9aMLy^p3xJmgT~h==^q}i%&;@Sj zsw{K>2D+vU?S+AM!$3P=ez(Hx%=nzvAv{#TK$~H9D&TiVZ9sLy@y)&`*`UjO&`z5) zSFz2ZtufgMg?daUT9w#y0Vn>+>G8i!#sA&(-wM5BDD)T%tc(0JKYs=u&}b-q zL%-AJdhoaL7_gdA9vVaYuRRBXB>LLfZvm68`rp&?aP_j9An7H`%k6v0vyQom`o<%* zsXsIK|1TBBas9q{t=ViC;>PqoAT@0l`3}nJp%pkUa$j(beEtpXXz7yZI~1R4G*c^p zsSKxpph_u8+~!$Y+Sr7kH%;l6#z_}l;JAC4%Uao#>5AwmqdZiwg#9VJ-M@N{qtxKQ zJ@7WBYYtg`;NpjQ?wPf5N5#5VUWFS`KEeAPLp+87nGbX|)$z_BNwjJ z(!Ze-`K=p$UCXmA5>>*9icD1`|X{H zBDz1zPtf!sSWwTBJ_t>_GQT)aZ{@>pH?`i=0BTF!!h_Ez4PoIs%75GgMSU?yN%c zd`0w#7gx90A?;b~pT)CFvNL(LRlhCUQDY%c^&6Xjlkv-cFRhLw;*c7x&@JYcj z4j~GIg_5y-)neMYhTkP1^+@)EMGaJh{7ckUA?|XH#XDRNQ@(o^u8DIN#K?pr6pI&V zzqL0<XuH@SzmijWR1q}q6%CFXWQiI)a8YvG$(a^#{JA%AkR0(Kb*V})OXt*6BgrLH+w z$Y*n2f>_yNeO7OJMkGSg2Kc=}>A8=mxf^J-8YIf_@`%Bi7Ms$BwL#v&s46nF-U3Rv zujE6*AxT}_g23*ZRo{aUN9Y+Nb&fqt&=2sY^w*LlAytx5t~_MOqI#jKje0R*JzIG> zc#xFp(EA`79`&uT1$2RtU_lDUkoSUn5;A2H@^|IeDO!ojZ#VgtVg0G`CYLcr`6OvC zBIf6uY3(I1#B}GrnLv>ic1nY&x#n8Auq%i+;ONOv*!di2k>P9IGSa;7gQ}`)C6;6$ z!?;;$syt*-xY0ZD;3=X5f9C5m^f`Fq5kqV2*W*#hSQR-oD>zT%h7cWM+*h8Vk)L`x zrijLBbf3o6%^3L$Gznl`Y5AK zZ+FP^2&LvtHY!xpQO!oPqs_4Hm~82oM)){2p8X-D{QQ00H?odNVL~fb_tV>WkE!0b zb%d>JM(#J^?X4WV?+sV6r`T4b>mPYL?6hMa4P(E`Q2K4HQ#0ZYy*ooNjCCxq9UOj# zc=%O{_P`*ljQYGCdGg^65t|Z)oMFzZHigruv={hPjYLRMY>T4Uh$gJyu+=H^pojPY<*DQe?MT?q!hOWV8JUMUvp@|k8 zNu^?!zOrATBQ#^jUq%yMMTQ6#gC>fN{_@&bli;ZlWMMw7yp{6rC zli+)Cq|)k3(`0bqrP3}jZSl6}a+<%tNPqbvuWgd5UYlFyE?lZ8Za}x1$MLrx?iC#< zfLGv1q(zdYQ?1T<6@lUj5z)%#+;PVVg;v(cEctaUi4zK4$S|#{feIRh(CeSajMzPz zH0<4)E%l^)MabM&Xe;zR+~mc6s)V-w+ub1wyt9@_2#7;;{u0A*p?&G7%SIsQtmFVtE;Q&_yFf=9nng!-OZk(Hpxr~~>O zf1eMsKlB=is$_qE)iC=sM7^^T6lGGAs=5#>=%c(kx|pm|!@iK?s#Vzhm?=Z9#+Zy< zoH2Pe)HT6@-JNzEMjhzwiuZ;S`P(TJKy;^*C3>X0yV!-p_R`Fq#ck=RRsCGjsvWvQ zg`_tFi>Jj6{-_n!-=icu`SNb;D7t56S|$Y+U&zSn)HQj9ibCrBh@!cp1~E2F+xhwV z2*bknJ8E2DdLqH_oxT)S;{lR)O+m_ETMtwyji$WTIh877gbCl@^G zq!s5Mb+b3qI-up=RI4HrZVaK3fF-CcT7ls&7^EsTNr~U>1$Qx&U&V%2$nLcAB1DCBaPmsLM|(+4+U5JiMQv2hl>EI# z3!AVV8%eKG?t<#`ol=?L!#(w$t?MIoubLn@;an*5hFOI=E`JCkOTm73?c}|OP;sN+ zlwq!Z{NtvBM_F~+n=5-I@-g3^iL^JBD;!;Y*F6-XQc7)*`JNlDBaZ~EBDRuHa9he3 z?DHI#0NAmu#mR;sy+3GQ|KG%D$WH$U`wax+p(QT`s-GwO2m-;r`p1|9GAs>w=!^$g z&BS>FfMgRvHY_YGY;0_!3I2=Wc6@w%3JMCN;m(ucPSvkC=fWN4!W;m^HK4&{pcMf6 zG7)6`;>C-pK%1pxztLb@4h{}>c6M1=*|9*YEsgMuQ!%xGLdLA zlkBjN?6#DuF%qxV=B(4}AYQM_+o;FaWWe8P`l3wlMX!}qtFbUYKYy|A z3jjK<-9)tDl~|4RVyddDQ^9s4@2o^cMdjt?yUitrZ2rK-jR)DzguI>$vz-rj0-)ep-Cha_ z2`z-%p`f62dm9eEH6M9r+4sh{$3ikgQ?$`h19*DYB22xG>T1F~4ESIGSZ>%}X~N^> z@EhY08{=V*SJS~Z({D{jZKZ2ptJvCDdq}dCX|h;K@+&?&D#*#o0N8qZR5T^O{IzZHM0F*d=@Q)E5Anw0@$bmWgcpeEs4*B2sxdEPToDAy+mM458fRtqM5b!l&lwZlwN=|Nb zA~)epvlL=~x$E=GvqZ`+hXx;8q^!m75*03&BW}-lC*;B0S*&LxxOrf-@u}>u!g*Kf zi%W#~r-W`HQwi|Ibj+XOYNX-~Hrm?Tv$<3@8B)h=4^4S|i$?{vd=*fTOXY67;s9#BaAvZ@T$b)ss6O>w)$R8I zk}hM+F^-s?ZdNms-_(!Kse<|Qv#msfsjV8DByb18_{fc915EL|1hyQL-R`Rw8~; zlR7Gqa_Wx}wb-K;{fYEVM?FtZxL@4gPAk#oPbyU0->p|^J&~n|BlYVH{ZOc7ejl?R zo{N;AVI(`jsaLRu#*FVp_45VQl9d7-xs|-NHU77V+U@K6$jJ);Kx?_iQ%|Ml@F%(s zO+M^|aNehrPw+u`4e2ZVXliL6J78TK=PglQ%qay)Kq?Edav4{Y@zv$vOIP|?HF!7O zo^hOP7A0S7zl6{F`4*L_=sNxcNq)NNm-!ABlf`Noc6f=k$bGQ}BYVI^V{ygnaO3CO z)pz@yzzc|QBhIK0Tce=gl;1hU0b{}ktE93=HKoBDCL#B3x2w8higY=-8=^eB{Qq2 zG6oatLS)<)$holCjEcb|G^wD^y}UV2wLp$JK0G{^Y z$#vkZ)Dl8Dcy2EFCP}l%_j`hE$9OF9iXynGF==RMNIq!m>t}|JtGEpA2_^7PDykt! z>5f_tr==hI$FBQR(a>6*%R?#!1)#(4X&GoUa7xVk$aOP&XJdagEgMm3iuwI2B68J# znY~#|ts#?vZKHniyM^RF8k!L33XWv=GClN5rv~fC`ig)8e)YHN6JhN|l2Ip(;4Y(i zj~c`N=+2(0lO$Bqf?4UHbBMMXt@KHSB-jgaRrcUqe70> z-C#~ku}fYS^BbhRq~zrH-E-WO`@&SMy-mRHr+duEoWkKNyGQd!+p$HG16pC0mgC1v&-19yYveDY^#e4w3{)^RtAo_o>I$-erF*K&R7?=2&hgj(6c$ffTnV)%< zn{kn!xud1^vnbcK7}wxm8Z9dYg64o&x!%5hKr!oVKRhx52&a{$z+U6*3;-bA+}zyJ z(b1KP)TRIn08|Iy(_K1P0&NZs4n9T%9`dr!=xOv-mbZ6x15k8li80;X-9YbsrLT6_ z-U6WD0rJ4$5OAEWm6hX-b-;=NMnx_zF2?=6e*E|`5*Izg&2%(6vLL~C;qL_m?g8zA z;~eK@&GIk;X92?c4x~gr3UXcwbB(ex9GMsZ(R{m{tbL4hTWqWcJZyX1Y#p>TKtSIb z3kwjt2ZZ}&lvDv+-qPJPFb)X$)r~-joimyPJk@_8w-RWC*b1bGmhRIjewe>@}wjCSTH&f+9Kndr3Zy5ue z=;^f3^pSOZe0-jMADq~r7zSf7TufcxT0m{Ro1Kv3FhhcD{G5cr{ZzarFlZm_) zxe<~Q=oLz6A61DHR0u%sX;ex9q}L~j)_A74t3}1@tXZWgrUySe;FBJdr(Q-T*wKnw z_R@lXtQYu}2A!rhXQ=F(Q>oE~*`sD<MPEka28iSnc{=qWs0R?d-Op!93P6y*XU{Wx_cfuDPE=y>o9nw9TTnW{cYZG@k9 z9Y_KLp{D%PqS+;1a_~2c;g<1`Hyp>RRrc}}#Vq;a=yN!C`5b)7=Q z5V!5Uy4Q3oznl;^_1TxS%{Ix9ELkg-OsQ9b@h3EiJMtO=D6e1ZdVRKISi%{e(8PVY z?dH`W?L#8pMuPrJuiC16>s41b*Y|ld$0btvD#5d@!$5<4(^hSRy}fc`&}6oaS3`>S z?^f2J*x&BkzZss7KAdFY1TMZt?<+HReuhAlBn~ClHVdYs;W(jj7GKfWCKME7QD0iT zt4e@=bM?q3cq4#mS~lA!E?n!=g47f#!#KBxZ#4_zM9-A`fHZj-%A* zdA1YY$tX?6HA8B5QiD_V&095_o()5ba;@*w-+b#FV?u1J@%u zZ+!ZHlMk5H@2lJn{0JbUM8fRRu)q*u3p5!a(3x|X@EXleVmo&@oDN5^&rxC`SeNAdx44W9e9KLg_gx z0@2{&PJ%%D0O-))t-!$-|DH}A2KEq0%?AQCfk4L~&@O2UAP_k`LM{jd zoO<=|+2vtiso>zFK_FE@K^IQ;VnlerpE2U%tj5Oy1YJo9!2LS{fdC%~pmb^o4+jU} z4gr3kl$2ByaB2a8a5@^m#{)b)02C8&N}EBTaS(`sfq{dKtrP@`0D*e{R{KGqE)XaT z2y$R#ECzunC@7ejnX7?oprs8!L~H?pLO>uoI=TuF2pGzDf`I{GwA(-+0s?||5D1Wg zYX)xc1q>|U(E<0>_?H_%ph^%37Z+C(1_ro=!oLTp1A)9jpmGo>4FvK9ff7KVDi8=A z9sLamlnnyC1%UtocsQOQ7@%JVo(#YU2nc{%2naARFsUFA@D>$riD3f)m-5#;k^qCP z4xu-$VZa-x@XxY5&OccW|8(kqLAQYt0(`~_fCBoj)Q1pgkVFq4CjFBMu>sg{0EPMh z9X&uf1Ah)8@kcxdJ`I0?LIBO5^o0%3;lFMEyb}OAmIzNd_#*(-B`7rH+GAnx1}f16 z9XOY`#Z~~O2Jrs$)ofBlM| zmGnNzOQgT!oSU%PifTgp+!;&+8fic`&*sffA|1cw<|*kRQ@aX`d2OZMV)k$}4Mpi^ zm@>JEYihFRYTx|M5%l?uSCcqiC|CS-h}FV~+h+%K5s9f7+YPr$%eY@>WRQb|Uj3Qd z=-)sd@P*U3Z8vsu!XJ7Wxqd>^O${GU*jyciD5uC@vsJSs%;;11C!RRGt0r}3JBQ0U z(V3UNSh25w6!mVXiw~J!v^)uZ>^lyA^ok?^1jIpXtL~S&yWJb$EeW+;Dgm+#Y2K6q zb~w%R>1c{00O;H`_^|7^k0QBO`g<0sRqzTBj+NsUexa+a8Dm zV4G$uO9bB8>ry;P*?BO2Oli(={U$w(1WkMn$miv5;!bF^X{VYsjpLlN97 z9~K)nmBPD#(XS74EMuNYS&;Jt1*w+tpfRZ7*wBR~+6Yhr)4(Rk?+l9WEH87RdlEgfl13vs3bBg-kS#7sOnmfuEtcOiqy}f)jWiUmuWqcz-uz!DEpt z9AY`lN-rCl4F>10B+tG^9}479@QskqW!yJ3OGxIcY0qgvi>k1&T^uQpO(tdHJR~B< zj^NwNwJp*Z#6=BfZYbBplO?q*3PZ}#4^ zw;F`1D|=QpcEbOlps-VShM5FPhcCtIIHg1t7xsvXso_HL9JZ5C^E3%grmO&_$12S0 z$$m@=Ia6xX!B*(l7XQ4RqSQF?Tb^k8fqtw~=a1D@Q?JbE_+U%s6+e@93>Z>QY2Y-N zmm^0!-hn{qL1YV~VL0pa8udw2-breD7mqh7&ZSweovupP*VmOx)3@3(*r$o~TYo6A zu3PMzp52fJMOQ7T9({QEHc0cng12jvr?$|5q@lx$#m(X@S;R-{(X;9`PQu9}X1jI)Ih5fZ{vm5lz>kEVq8OB6k1!k@UCo9qu z$1evp24Wo16-M}ttI&%Z-^WZ@?sf+#CedP4n|4yf)f+s# zR(W`hlizzo?$JpF=IK*^*>em17~-9v@b2CZW4cB0pRzX2YxL>oCMKa$;@VU%AA2sj zId&(Rw}xAMUi6N5_2H{Mr<)@2h?7vG+7IAihJv(A+7Vd#Fu}Zqi;F)m*6Wl%_4uJD ztQhizv57=sQj;V5(LuunenRZd?H$dlR~%*aTn>dR?)NmjXVZ~c2Zx6+vgy-PGXs>F ze*5Xwn>VSgF?!?V#7d z)c!svRM<@-rk3>j4Oi|iYcn=9;l4|+x8%F0YNSDYcwd(*Eo~Zbpi-tsNauropHyxM zI_y=sZZExY@VFzm_RuGXd3l4>A@k`}1u0V98>||Ft@7jYQF==Z*1(DG+)A|kSN@ck z>i2|G2oJoUxLG{8kP}^o@NW*?{d^>nC}ku3!Y~_gERXeF1VP2M%R+uK5ZT8Pk$e3{ zF>&upxV3tb7|qM32!~EnZ9RU~@>7o7t4!`8PYlfDi>`@1x2?;p1|o&!;p(6tUWBBP z)#(fwY(Ll9ZOF3nipzM;Dgu`eSr*WDq`oqDKLnd;0RH&jl<)*}|2HI8l#Hy%Onu!L z^Y!hy8w%i&$lH*+U#HKFVp)t<2Bh6>3D(ppB2$1qN+|IN#EupC} zr>!J^sJZreL)Fee%1(!0q=imJP;DBrCMBjSDXJnqygcqn z88WmqCb%dvAV16}#oH;|!LqlasK2JPFx)RIz%?&Eswgq0Ha7!lYlsRDd}3#spBUSg zm)4XPkRKn_mXF%%`TMzmt^^;~NGGe%M<`mF5;E$K}L^r-%ABXQwn~ zCZz^>r389rMFasKurwwFsAF7hk&hh{yj?=94Z|K8huNCshIpX-oC8d?pV*q@1i6P; z8)W!6BAqNUyd08TtpO+5NIMf>Gu>cI{Z#iy$pMeuH5I(|RXlZ+oK+-|c18(~rojfv zp@u49#t2_S^*}vEA8ojcsD7WpuqsgHRk{=-l!cw74T^A!n=Lv|J|U6M(cb*mq-7L_WquR z9{h+d`>Q_q*RH<#NpumfYK$t7_Ram@BsVIE0Rmxz1Qz7FZ7}Aa2IKwx6@yR#*Sweh zz3)VcaUS)bbmUG;zn88}wZ#qKMmD~_{o~a^+4$t*M9k_ZB6Bk~E z!(er%Qboz#EOB;dA&N38>agJn5Nwp=@LE6+M1XWr;y`vPbLLdQLR^W3O_MYv9qR-%OlaOX4|V?D^t>q@_L@@co>U{c)G;5{nAOKz1VE z)@>MtUdI=T)Bu=*zf86!hc#b9Do(BV@Axw9TJbo03gR90=q-8`2AF-y3kQMW9E{T< z@$4h2wrIN|8Wd{j8VQ@e85JM7#L) z(jKc_l<$l zL%yp%y1eFs&{c8o%h_2Pym9#CjC=61nP~e;dNV3e$Mw-O-m56Q5ev$J~CxxY?`f z$G~LdF%D)9^?TJ1R!DxWQ^64o*7aKfkM|_!yC?$ECSbF@GTLKNLV0u*6=k+aL( zt?$>AjLcv&JF^VZ)I`v}V1v&D?t3GG8h`OR%6v9bUox6`EfepVt9#;HZo+Qyws1T@ z{QAXpiX0VTE5UA3GW=`$Y~fbF^i78s2Nfy$NJ%S+D3)zVhB++djc(+F@EB$^n_AKRlm^ZZmpu6p*TC zUH26yRU+Y2Yjw5Q`@tS>|LceS`l~(UcqA71erovlbPOIxFg}?c4!)k0^0Ig@DT!%< zZ6$XXtFw3xZJBr`vzQf~@M(=@`1hPmS@`W9pLbk*>etiI%Z;=p0U<{Yd%9X~%d4e) zqGeH=2noD4|J-F|S>?vDsH}4)MUB*P44wxpGTntXKXEN3noB*eR^5yf*?r!gQS+;Z z4qcrQ-D3%N6dt+e>(_6jmwFNlmltndolc)=Se?V}C?>*|?Rw6P-%or>Z~tV-ni@Bs z&KMy^AbR;?DJW26VtZHj{KnT(1V#{B!lUltQ!HVWlXn;P7Ov55O-@KXnpR_bI4f-* zkMV+!{^26U2RdH41e@o6$`GcYyF-b&Y&L9hQGY9XK@AluE4jYAi*JiVJiiwouIZGy zmI=vWr{BDChw_{nj~-Ggi<)lSzO3I>Cq8y4^GS`iSz7A3BhRjKHNO%c6{Ug;n;`Jn zLD-e1(rqO{&$Tebt*7>Rb>4DeXZ1LIpXk|qTj1GOdpf&wE$4BHImMk^7d*KrB%bFl zd2=@$T797DF2-}O)6|8TMj3TvDiIoi+kyUuy*wZtn9z^JaTYT_!JDSiXU*xj=i=a~v$c-M zWH!2^1k*XAqNR!ig>8hQL1XgOY+0=MR?CLbwyW_dLi!Lw>S;)3{*lBSZ;IenwJhwj zj<9H%g?SFY=-(&H|B}g@!1KQYNU8r;bpe)hz-s_d5@~8`0v2^$U0r>BeFFmnBO@cg zJ`XqoAP@+3b#=fh4)`Mgy-G?-GJh3wvVdm+phB{;vI0z8jEszc1A>#2lfAt?pi2Ub z@W7=2j|PCu0VNc03qZ{TsGoqlNJ>fqhJAT?c|}D1BYZ!|tythGf?xUF~iZZTyNC^h8hjqNf9H#)8(`{Ri@FH(FiLGr=d% zgI`v-pl8E2yZn6}bQ~=;(XS&ndcrn3ywGoAHhQ0IbcdnmKS%;tj8;627;Js@5 zuNLsXdw>_<;_ZM(E4uu1%vJ zx;3SbuG!8NP8~-7^61oHryn9jYlR)BVAQgV++4_2y9xZcBNJIkOe|EM7>FMo;ZfTR zuv!-3zu!%Wl1POrS9P-BnAsBFXH6kQeTjn^+VDcGB zca6j=Le$CPP`(TN8a-!sq);hn7ngEK!Pd`uYFHIcwti%;FmVbcQC!KIp{gLlw${fs>KW7Lb)B56u)*@mO&FP zc)8ePC+ISJJK;p3J~BG^A-}M=a^4HYoEUtf9x-jlqJC)$Nj+dv2IfA_kkTa9b7 zw4l@MDz2pV>W~d~d~*6RDswj0+BR?6YWE_|nYoI7|4msZV1%@xzQ+12HzM-qaw{NK4qdTabwp4CKX$oq1lhVUE z=(vBvLT&bE1~7olOG_3#7!wiWxRfXf1vXo}|4;yZ z^cW;wrzx1C0D-Tgz=f4WGEwWZ>syy2 zjorl^WfhBve8HHn0D?Zzw!iIcSuXL%Bw==o2Amjc7ek_PT8plXpeHOO5%g9G&iZ}S>zJ&A{f4NL7HE3R$vgX;ZpIEQApVpY} zXU1H3{<8o0JAbw7wI?U`n9EyKU+lB6a`$Tl6dbgPW@RYmR!sdx`#ixbKGu*24Xj3L z^|9QPUv#$wKA!TiT)Vo1q-y5!)7G=*=Sy?wnt1U_3$bWD4@TyIW>QQ7OR9b) zRI!{?RKHf=T$#%iVZz?I`w{V7qu&=|O?>0}XjWbTAABeA~_2e*nbe)t~z>4G4enw~iVSr7k_(M;N#X0(M z)9lS*a*pcjnd{O}R?*s?_|X$wl_iE3a_TlYF7)$E((tiVDr?> zrv;?;Et}oHh#|~$5^BmUJ@ksop(R(}bk&>%d!F@XZXdf(GSh9E)KX~Eyb@PcW;nR) z7p7h^BM$G)-)3o#o(XF-eRI=wNk=`?J9#jpiJ$n}r%==OiAkgcZOD;#uchJRos z(T_)FG`)_TZ7*W?Uce95Lo%++(JB4cdz1W}0he|6tSTy;{{cW(iOy6M3%exfu7_ah2_Z#TEDrMzk$|@7rqg) zwMI!eaxUh$<+(n?rn1Y(iXyhol|rHfmJf=z6yq=LI?d(G_C+vi1EVL*9l1(g>KQP8 zaV!90NaBBE>&&9C^T{IFd*#STjmc26{zS!d^2@_`3u;VBmG0Hs4Z?{)ZfseDD#-%d zm+cdY80Z4pa*!}9(W?rPrqRC-!v6)kNT&ZA*abTN4|Y|aX;hr5l%8l;o~Tuvsg<2- z)_l^e{v=s=%9egCoO_~Be5z4%u2TL{qxzFd*(qJp5q>-xoYFJX5&}p zv=foCOa7uSO!-%ebzfyFzL?gZc@JCxt`=&ISDu|`fMC=35vc!FrnWvC)tmydL+_1U z_f_HKdGp-4OWRrazFvGF6+233MCPBr2LrOth)`0+Vd?}~H)Q5>z7Ly-joFdRBl4fpab>0PA z3*oWmzmM_{J9++Gl`nmH67_=U<;eXWv}7_4B`Ee`Hf(03GdUU|P6lc;Y{GCeTw{~} zZEC2EC10=Z>Y{%d`xxp$QYK&2G2xY%d>Z9>5IG0J&cbTQV~?9#qHxc}l<)SDHf zL4eG)VHwjDde6ACJ6vDur710iv#u1;?G|tg#XjRK-^f%*hnJ`QeOCAuGhYfktG27b4NUqIARl98St!^Ac z83b&r#hhqQVkS@H%GG)Eh=W(COf#VyBMj0l@!|vE@*qXd$~PpenaV*+TPIvb{9X7w zO-#A#D_M^N`1maQ&^Nf?6m+d}Pr=%k3Ro1ZQTYyerF+J|K7T}Y8|V=GWBcy$v~&yU zTYIx%)$`;E+fQ2gG(oad1!V8y$a(_nFp35^^G8=#2Szo0uT9-7$M_dZjRvq=g#S*!J(4VRKt9S`HuH5V`{UszUm|uzm>h->L z$jVw~}UK-@aU??M@p8 z5*XY&f4Vf!7pu;uFu76?Ra})!lb8P>LJ#Kb>-X~%=DqsPjoZptGrcJ~iyc-Ljq*7C%>4x9VDc7Dda zKg^LYYPF8J=MuE0Qe^1NfO*NYU>1m%$Q#`9@V)8#p-A_Em*u4`(lJKy$wJ;@G$c3s zY^Q5disa4A8MTvAhvR-cUw!P=FlnJyzT2(FF?~ESzjA)}2!D?{iNTv1rD5UyN-4y^ z8uR5{Y$kXiwLylJ>m@Z~O*XnlxOxof&D1hVbCEf3eAr02S0A4OI~0@Z<8aE%8Tqh? zbN73zU|3wuYrF7UI-Xlc9Ho!@fw^nt`w7sj%&<$aYl1+6hMzVNBQJqX2utbn&7-sj zdF}W~(v)f^)?;mq7+PMqi*Df=xg5 zG?j?rog{qYqN=K?Lmj2M<^wBgnYTV2FWc0v!Y+06LD|hrWAC z&G-frhmgr%zkbC)qz@&#?&ZmXuqIC|eC`g3pO0MB;GG`18r} zb@FF9rdQSPK9tD~idGB0g#-kA^(i6IXPxGsl0GtRU%RO#d~)U%_AD0pZif63{^E~K zf_?O%8eXNKAl?U4Ha8HxuVb2i_UD|Fgye|bAHx?ov4@eP3MlQB$oGL^k@@oeH$nyh zF^_NF*;!h?28|8H!}Jutv&@}`kMuA9?i-?WI*DBK)m$k2_9q|HS4n}F^pPd+i_Z14 z)O2(TOK8T>AT_Ejo8Ea~{a8E&zlIj4}{p7lH zF5(Mud&gQ~D&%kpkAkNs)0{4t&pQLiwFT0ZMe4|aCYqGlIrpHUcmsHM8z*tRaFyVh>8Ak)#J#>GQbWgm@+K`PM z#pIf$Py{3K6b0EP)5Wa37&Q!V_=O8$@8wg1Wxx>T2zB4wRcVt0%kW+W6;MdGY{H0F zW1g#Ic%&fWvET4%9;B7bC? zlH;DMnf9{sV?Rn@BF;KlD}HH4C9Sr~n1vptW(05ga2w|lUq7)ndJefd5R2LxVbU+s z+cFpNQcv%1D`yoLM8m?LXd6F`cZ8~%3Y%a~w|*?7nwCxCLKNP~zx~2^j{w4Amkd^l z!xU8e#x8LXFFYqsim&la5{|NFNF+o3+<+mto$n)(T_NR{Sv2u&xzv17bL68%PMB~C z4GJ1>s2>7I;DjGWqQE&rob@GfQg7G`1f;|SI@@5_nOPH9YBNK>J~|=8yWJHSp%!bf zXo=@ppFWAT*toL0V!-^rvjwb{NW6*!i5Rf=KLt3l}BN5MXqcrj;rr`+nodWo{=vgjbu*kcqc@3-XopWl+JeafipydzT< zGC*^_v3<5w%nPRR-uyCI;$Bys=~qzEDT698pm@a?)1w6D*aAb0f)5I=Rk%X~=hf}+ zgBlem){9#lJ~-&hZ|7`xU-%C&r6F;f8;A5@uax)Guxhe8({-)OPudO(Aj1^X3DhGk-TaZNU%WoNCnkHh?GvLO+e1cN{P z(YGX!hfd8nRVj7z&nT<2)qI^wUSi?!ZZKvtVa6vCuvMX526r;^xeT9{m$L*2XtUi3kp9l>!o+F;jB z>}f;u1D>xUwi;u!nABQusyA@uqA^M2H#M=;=g;ra_B3tL3|znDNaeKXE1741@2l>s zz3_}sV^BL29@zG^8`Tbr<{Z2w!4P`%!zp^O0HXRizzF4_>?cB?J6*+sml*bz8gKYD z)!wtB!uGq{ZR~WZnXgQk69@MP-WuZzQ8QFGZI#U&1z(Oc$ZqIzu7=4%$fu0)zdF?8 z%lls@hZ5$-MnqL9@qYLygX5aWg^7ChJfu!oTc%b7N>EmJ;HM77q{qytb#xdP#uzP( z-oBa@^yGl0>Q42^;`s2l>=rz8p6fCkT!)q22=QM}n3#~f)!YUnxmcyLwU(ZVNDz)b zL_>~UrNy1x6@fg+U5MMzEV|%UPOh-rnx=4G1?P<}VY|t|V2zJfG$}8iwy%K2-$|Fl z!M?DV4yX963g0gXF2$qWO^EkOYjra|G8XwMl~aBEW=q`BSN0{rF#}(1ctKE(4{3Sa z($=_|)UyaIRTpnl=BS=|hpGNft-RIyf?JKx3KhU_Z0WO^A|n432Bq3l|Mtof4)@;T zNew5(*I$YeF!Cc37spT|V9FD0v8r>^7OWG#7%WjsT_>dY+h@%b_d-D8-4N}7)FBbY zYeO5WG!H>>Q=tJuI7%$MR#hTU;$8C*7k29x-De;^=S_=Ht1ic5|igWgzEi@X}ll zHAfX0?n>&EQpM#=1xvStRzs(J+Yz6qqw^UwQBI#HI|4kZMG(DA_J+4x$<%%jM9l4} z2{l@Xcm<+5M_{LwAg6dnu+g{sh^gff3LNV-PdYV@KjB zql(y|j@qV)+owzXKim?%u9L*Bizfb%-1`M(*c$lpAZ73hx!*jgOFy~y8)BO_ z%8<7t4!snCOBDW#L{_a7LCd6WlSCHHWS+Ccww*u=iQ^zJjKq1I)P0)BvW3KPjL58s z)a50CaUH4i#B^Cu5AYFr|K$()C~D#iEdT))VgD&$UGI$l$m4$nK$~0(=#ak*;`Rd? zV6%TOwchTfR|!zPyj0)BvP5AvggVsy`r|bqxTy2oJ||3&^5BBtk3=8C*3?v}XdD@I zpF4gxB`vIX3GcVbm)fwxS=BA_@SCEPm40&9jdP>T#N9e;x!PxrYMZr@{zHSDFKu|@ zud5Z>@XYl(yeAA~KSO~@7% zyG)e)%Jh95=0dq)C`hW_2*sqs%{DW%+=M8}k-t}J4Eaz4bMQ8Y%~vlK));J{m{e+` z9b7MsSBb5g?+Z3XUu)MtC6r+J?IQUQI{qAq%4sb^>9P2}Zz@F$YfMYe(?GAJ8Ii

6@&IroC3K7tb}Pa21O>FZsI7ZMJN4uiE%a>i328pnI$k%~9cx3#g(5dCr-P!*coGN-+6b z=Wa5RJ#uQ~26W%qbP9t!2uw_FgC!Q*0NEni|HD&r;GS`dxrfavdV#^9LVUDusz zr=hJ+@)6rQx?&1R_{n8ttYODfqd!p{CW=f^McZbNoVr79luO5-}f6a0Uhfbp0A8xt_bz<(xShaO`4F2;!0 zTro31!WbZn46$7&u|qeBV-IjJdJih+EbA97>lOX24U3nF?Yn`jGXzGpWX=O7m78Rb z$H;wW$o&`o&aAFOX7xwbt)BoTnZwg>z@$s(HK>ul49{LB_no^JG{Kd)gecjP$XF6c zU9#)_rdzoDsOOti_c!ILGayTiamNjipT@BL2AI*w0~Yn$Zgg93h#qxnwcZe0w~@L| zl6k$>XuctFnIQ9gC0=kyWYGdl+hiUyf*G5tO*hJoHzZDDz$~uVa6@GCoYZZKz@&lL zb{Lq;`BIi}Rq}CE@`xQqbR? zbuCKxQJSyg&}DRN4W||sgx%69WaH$}ZQ1kZn}5F3!F&(k z&MP-;26H9?aC|5d3{*jHb~RIMM1SR+d$*0Re`0x;cZ@ep_9k(N{Jv{mHLuowv2g(y zgYdx^VIs&ev^kHPSeF^H^C&C(s9{F$NFe;1fy(w%D>>n zT*_hGD&+X~eIytDt?HLq`bG`76YdPU-7reYa=lwxI?0h1Ffd*xQB)x26JATTb?O*G=ia=zjC@$M zf9H|CRh?ND9DGNohwGM2>MWDMbm9lR|u47J-x*{FUQcjw)()*-q@=k^1Z%>B8zoQS}dfBRq5Is#)zsiT?qQT2(Y#&XPB_0qx^GpCE zK0Tsd{`Rqk^``tgHGM6Od(&dDRK%7uN1UB_#+Kt?0lRl!A?pi|7mkUWkj%%T#a6n- z1ojN;Z*48W? ze!t5Sqsz0e*|WK}IY!0dT#5h3;uoC_+-T)5F5n~;hqvd}C?MX%5yEO zUr~?AOA<}Y7m}_+b<8uj=Qb_y1D}s#>?xI@Q>JsR9cazKnQSp&iPokjuhHfvG}PC^ zXq;g*QAEq0(v^XC>DO)=|I!w|od7Y<>yq$}@z?Jhac?^4@m@dPiOiP6qtg%?+N`?J zJ5~G)Jv?s5c>0 zw5aR3fZy+oLi>oKoJSB^ggY&?9Bv#YPQ6Y$s672pUuxRHa_gf7NA}ETqA$V{ORo;* zR?4)Zg$wI{#e7PkeUR*+E0m8-s>-_lW0o9gc|Z0EP7}@$Bo>RTHl21d`US>kN5yHe zPsipVvMkJ-$1_J1p4vEWbkp^rW>M*i{_j4qPT-iUz6*cC`i0y#?ZqDnu2$kE9oWe` zj^|-%DzOHVs_!;i2%aEIs&SZhzg6d`^e(wLn8Q`?;*LMy(=Z@vn-(YMw5`CG((M{V zr+X1?vp?T`ujZ$#urH<&nIJl6LyTZxRoWxdF9XaMdY2r8PFV;T-idg;5&MeFAV0i} z7sy^mr|Y~|`^-tfYmF%_Wfg`=FMZWsD*4WX5*JI{lgqO1`fbzNdB@OLk8?qflKLv= zDyfmO(IZ7v0jotv#nDIT|v{Fb=&O zHL*@8mGxvzKQI&SGHW?uz8*_uTn7#DGjQ&@nU?slS7G_{3vj9x&K4|!UD5)%DBG5S7SCx1Nl^kGg!a<0cfcOd>B}_$> zqJBg}Fl0KL7*fj>R5DhwNkIW54*+-VLXjwIJef-Ew)XY}*D3JueQt`6?@nEcv=gPZ zI>B0gOgTO^PajLs+HF4NuB$zBkty{~3C9;ZyJ1H3J~*~dPvD)}a*^#=3_H!OmUgfAJHLj#_`dVL`fl>wET8W* zu6tpPX;kFPYrDRCwePI_%6IsQkWg$#^Oc|U8}X_O32|nwof(4K+L({(!_K?A2)XbF4ku|rS{j_3)anu5mpW|)ZRn|puOy(V%5Pw3Go_TN_ z*K*i(NU+(Fo^TX{Pb%5SZI=6Bg{FtLzQrMN&3arN*HD>1Qla>{7DgQK@)ANH` z6dAiJXFJx&J_z4pZmORUNvvDO@fh+1Cf>GBd+s#pmDq1V5j(qv{lNp<6L&!}AI3`< z&Eg7Kh@`?)S0sh5l9K+x%yw0rNx?|w`9H7?k??_Pkr~IEnq7(5cCYo)8zY=5xhIi&>%yen_RxSwe>(W+}G7_dbDhItu_hug1u=S*6bQI|*$hID5TOULfiBv`78Waxj>@d zqWjV19M;}Hf#l+X{|1S*xU6P%I_%w-PBDShvSE8HJEj zJS6|jQ_3Rda47xe^*f{dSB?*$-3Rx42dD~*`1TmNJcD_v`I9lhhq%$$i%{i7%OF3V z_r=C$%4+7KX$0_uD3Ldoubl2k6DYMkay;0eaNpmNYQX#g-(S-}c=jzmrGOLgs%|T& zz16~sn@dS|&ATol_cbA4_fLd7spZ`)OMli#4{l<61zO}OgipRvz-Ko5E+f+oYnL?4 zSAZwx2#hJh0v_yJVYPnG+X-;v`35={trB8TnCBPfOM%hHJqsX=g1=pDy|Iy}J=H~ox$zU!=> z)FB9`W~prgHn31hjj8tI_2{!;b2-W}bxs9dCSC_*3H98e0)G7Iycps>PbD@vp?Ht2 z=`(C2-tros=_;f+i?Hg=;1XgEK5Y;*LX{lC-%*5;(EJsg%;DiQMc;YVryq z@khIHFZA;0rotOgJ=hLrRrQNZRVd#R4<1|S&2%}GDIv>3lX!a+9=}(qt~;&kma7X_ zXQRfQvVtn^c%AbgyrJVS)I|umLd{Q6-G~@off_7eN8ZLy_Nj3{ zwViH?vZNZwv#}FMjZU?TJ&xId;V)(2#4csLnB%O8&_Y2b)qDsC4!yLYB!`-nm&emR zp)Lw_wZbYc2WI~c6oHT@<%X=2TP%`FQHgm=S<>y*)Ehz;U*|;NR-Advy&p1>dO2_P z;p)oCo|Q4(YIsofb!GzX8c~FrnR@Rb2-X|o8{oq_3sV46x{M#{ic>T@llQ_fa0Iy> zn9-TWcv7S>x>WJB=P==J-(@_P3151>n!N9ky%Lv`Oawj9^O2P|_kAnT6DK0a!JN0`|=(})%9jHk8r$t4N^D0l% zDR}k+3AmCKV4SSZIqAmJ2x!i40tOkb9v7Hyr*i!KpA`6Taa}%z@XT8#2$a3=Fws{c zuRtmoB?5;Gq;QOHWM}mfz10=kmDj71+<**zeWz7$^N>)+>Dmw#otju*P2&63-eG>W z^JUc6t^ElcBUI(4f6nP829ii$x2Zs2#+!$JI_X^oM3kCuc!%%WvWNbHui-=;&-{`# z0wma&mnOp(q6p`AAYPIA5*#{6=F|9IpxF9($GyE*i-($%@@)6!FBIdiMHm%rW;i^| za-(k%M^=eC51vnXv+q6oK(-QcGb?{qCso!mg6=6y@T?I4%eQ~8<2P*AMTV>7JPvyF zAp4&4GSL9wBWf|8TnfehwPB!)RefJ)Jti)(QV9Q^)6NKZ|J%&!mnH|s!|ut5N*qO= zK?r_zk;s>L839(ik^KZT!yjkXKVQlZBD#LtDGlSo#%W@%3jA!1_~#7f5sr-Iv*ef3N))%j!s5@Pm+DjT z$>PkK&xsEF!4%}pr|jF@jFU!!aQ>Q{dl@RLwV%eCr8tj%#^BxDPIQfmq4!~4p%$!9 zglx+!$Jc|$9PgjHP!S>Sr7bx2s_~))LkFAQ#Q!E!YMveJ{Jmo~pY~ugv7pmXjb{+m zSz$5pjb%s6X01*U`JpHVA#7*9QyiFhQdo%Y0I$bI ze7(M&gwxslkWMDU=6qSuU`&lJ;qp#W(vL<&O@Vx-MBHc4o)zVs-vNVxPQJI3^#{#S z(u%%V`r+Oea(n!toeK3}IVBgZ7MM*Ojfij&nH?$o98nHIA7w0x%Q=AP54}Dt=Ody- zzIV2xv%_5JW+CCVzq3DSfJ%SWwA;iF%%_G=7ZdN_3_hTbc{5)KyK%-s2TH$eioR{^ zyCI~aeDKR=YC;3+!LM|shgraBGM7Ao?qoOq`wuq*u4}3bZ>=~A;~b*4@6Cs=T7GZ* zj$6|m#Y^1h_q%a!Ih-Y?G%g$S!Mt9}91X^)2py4Q3%`C$sbp>I~UFi&2xiyD(YOvRUvv|LbFApId3c;&-^)j|9Y z%3jbdB>T{}9(v;r8j|oMWu@L?`o>kB_NhHbNKb5m52M93t1|PdKPgzN+9=hj{&Q0? zA}`BMbZV;OQ;uKZ!6cW<6h9*yb9TdgQB?W=A06@0>4@v_Z z?W80Da5Qkbqml$b(2h!C{{_@B_Iw}vSQo2Vw_DlKub|JTijUQx+iooMD9K^@Uv@?h;-E(e&;uCgAzbuxEP$E;f(8z$ z>MIoRMR@$1onuFK(B-<2NAunn|HCeV|I)Ah7X<$wgq^=_0^Y!u%g<;u{ckjS@_!l> z`#)@RK%>`tk%Qhq%nu^yfABdWYf~JIyDDK;jjr4N-23y5oHHGBw|!Ir#7HFN3Ewuav~PQZJ-xZE5bi7X2~&;qzJtW>o0>K4(azZQdm< z0!m{Gu1Q2f6u`V!>+NnE@oXC(pRe=`9=68&WiBZ5yB(aMThMviI5a)yW@j9mkqY(@$_Xr>(Yvq4c)8{|_uT z>gS!C%usiN%yf1p9EZq)Q>}sPyK8^unTUE;NIZ->4(Z+SSa-G|WHEGWRB-bGgS=az zMiG9L^gd@VE=TGCBv!11m0DJq zX?78<0}=BAD^kP9dce27d()RQHjiXNZv&9`~ZJOpu}kiE=1C)As>wcRRof~XTId= zQ#YOF_|=L{!@)}rtT?)qOVuZzfhp~Pe~pPLs^4ggao^F1qNYe8!EBnfY`~_M)N>jW z>?aWsk?EipLk?X5wD<3_ARM5J_n;wx^by3anU2!*_gy zvP~6`$XZAs4xN8N93;J){$ysNWdenYQB$t1j(WWESTfyfGNYNjW*TKHZaO`Axvg}Y zWg)MLco+v{g+ivknLMYwYuGGx!{_c)2RA~hXFCfYAxiFDI4L4{VHE-}wfH@V!$)7s z1o7tLv|37C{gyjJ(>_t&rL zSoBOp%s3M!sJd~9;-7&@J%d9HgBEo4%)_s`&0G^vC^!*w4$R>l^KhsrU;gutXq_>A zc|qQbA`Aj>7L++1RTr;Dz!k47p`J8T!A3(mzlQ?tvjq~cGNW`ACb<$46!*V`%5Y^; zJ(4BFV3(jD(}PO~C0f~;cGRm_dk`=05f%pL80tQ)jSZ>BBo;rkbdyISbC$Y{f;5j@ zixutEM_XIWhda|0n^g5C@2%Y&LAU_LcgCmw-&|`o6dl0yANakaCiBV z&t|78{S~AJwU-A(fK)A9y@1}aDXC|930ZPE6pZF;=VxG))%<={WX35*iiL4qP-uIC zOG3HUxj(6#kgc`e)me@VCA&=#o(t|OaH8irw5Wx>sRUTxrMeA zgzAcTQnR#C{wTekaH#d_yGGy=(+^)|4$rA0%d+ymV53~Mn!{kp(x7eJDCxzzy zQ|QTBr;^sbUb>504_JzJGUR~z+FlX~Rk91O+XOC#D8^(AM=qtCI;JO~^(N8f_<_n! zn}-ri2Yp9Lxr6eG$x`}Xc^?lYtcoKm-i~>a`5d`mTL3+f-uH}R>>=s?+T$XT!;Uz^=4K^e4B9y z#~QIxbQC9El!3Qj;N7;We~bz==-tjebn57k#Dp#?7K8%2gNvl=*WGHLcKr6^Ma|f8 zqpfdc)N4t@b3-*~+LncJeNP(7ub$E-AS8X7`$CzQn9BzGzn zhxX{ON7Dnf<%Q4mG~}Q^v*~CGux~|~wT)QHN|Z!?FV-SQ2k8lZ&4XAAzO%^xPWP@& zWzfVjSn5{*wkvytm!pTeUNP~Q(nh-K_2C!qJSl=WAk&5(le+wHVbQ0Za@HUCNEi?w zzRP|qoCydvo37j|S?ZLXg>Z=`ZomFa%cYfY6xtKGmM0~4En!%UXDq|HTQ?9W{?+>W zy!7&l#ZSd{d)Zx#vOM$|bvj4T?>)(_aKV4wVx$$a(-%h-EjJHS1_tBG%{MAp66I_$N8rq>RqG@^;{y|z(p_l z6DE%cN*YvDRGMFt9RYf$Bs>09Fw_IA964iJt7a7?WDE2q#SWvTyW1kWPb2Q0j9MOg zcTZ0uMQ?KB81^qk!1$_zIdf>g_I?iF3^Be}3mW-ZJO4f2{im-zjO12E^`~MYCQ93S zva0zTC=X1OBDun;_ea~+{_Ae2D$d>%+W8?Y`~B~-#i&c4dbb;4F;U2PP~~uj`<~D_ z`9iH?voM|B@}+kV@WZdAH;z+E(ZxJ#ys=*kv5VUs>EfY~E-||CGXe1!KlE50C3$bg zzZ)Bss7ylnz&+xo<@P&L&92zbp-{qr5**~Gvlo1RNjg-wngD$UrYw+oC#AyE+^EdJ z{#}O1c+Dj+hSIo`nV#lG$)g<9k~UCDJHmy{S+#P^aTOZ*m2r`Ak5YP007rM;e%p~} zcn@D3vOd6T6IM5i$~WG%UzFj=uuKKreVK=zFV>@Uotpyx2f!HLXPJm$-n< zwjf!`#1L+!`jQwKCk`y$mFUkOqOM?Ch`41ux1CUMY3H3SNXj?vzH!*&y`oKLXlh>p zMQr9E7oG(blIh_BpT`fYf^@Y)!=h>_<&t{PzjjdOL!#3)x6}rgkGYlyr}+DL6GZxc zU1s>Tenc3FL!D28kFTh8vAZ{=8#zUL+aQrcamMY->9~jYW=`Kq2ide(PDuSasI6hS30FkhFgw9p~#>5CzN(4D|azx7%|Q zXR&oqh!!PQPwSfvH0;5Mx@Oa_?yk7LX0L72HPC%juzH|-?Gs2r!N^eQ#YC6E;d((G zxzi;azH>N4pk1Q-wesgub>hJr#Rt?Z4f^EJv{oQR;QtXufza?jflEyPPz?g)`2SyB z<}JlLR$2fY>F_ZFqyYeS0B{7LBy}zZ;1)4j5&$1rN%C7u^8>7cr35d)GXT&@Uw}=Q zpEc8&bv%Re>I*Rdb`I(YYl3ORZ5TW>xk3%d=ZeT$V`U3E&%QJ+2v-ymg_$v2phwuWl?cR#J8BZz&+8L`A{<@WwInNhSSz zQKHsQ*Q2QrXbD+Hj4?e_Lmh|ep_9r6Nfl8Dx-wnvY)kCL1IZ)HcDgcc?iBZj5`t;T z;L|SqjWY#=3Z2P=%n?-4SVrQVC`+Bl`!ygDb)`j+xkG`=&f0Kc>A-@>R@0?l31u7t zanM);;S529K^nH+j_&uu^M|v& z#$Eos3GL9$OC~$VPS0NzP;YXBS#wm#z9rRXu}t!rB0_T^ar^2+X+ndR0sY*m+}Pb@F^hg@0{CuYus&iFkQG;g0+&i6dLH(lwnAVN+>V=`Ji z>#lTz*N~<0sO%}b{DJ%shZKk6SCC{%wT)L@u`4Xzh>Z8RSkXg(rElk51DC$;4J@z09i~4XEDNXkv zQ{wSW_0W%BwIiXnWs2SIg>!f<=*es2x(S7?h2%}Nv!WdHfSJHd^U!`*A;2vD42S_U~^NMa4U;L z=rYIf6Y#rxx3p}g8(IN-%zhe=ZyvP5%F2gV7j?7L->Xr7{X|99PoA*hwW7Nsit^cT zz&Usb;N_)j`^lR&+w@mO@wpkdxgoL?sOSxO(X$kE6u4{U$t?XMRCajnp&k|dP9)y6%A>;yFyu9lKieHu2YR-n#DApXK z`B52*B^b_=RX%=T$evht0AX?tfE?IdkEq=#>d3&*=3;BYDo2M4zEr|XXg$7UEwjmw zbBu7|y5QX_v6Fiff~(YDYJ8ci7^H1rgD?CTErjntt1PMK*FpLyX(=6x;}j<;{jjGd z#En^6^^oVfgtaASZ$IS}D)xw~K9fb#kTo*(9T)Jk@LMbVfidBB@|9Te$(Ri(~6wlA` zDc5$#Dv3}?UUCLJEx@!CfHk{`%$(z$`!N$4cCL(*2$`A$Re%ZCh}vae`nP==|3}kV z{tGw?Wy;C32bmCM+|069n%J(rXPpAT5XA^j4Jo!k$Sus z70C^yl1?*_KgTtk1-Kj-m*ldQ40+Z--@0@yV{@PSBv|=0CXINZ68WFWLrMpnx*u3N z{KlOxnQ=O}%YZ0{j$ch^Nj2E8lVS|Oswwi6BFjG+rGsbzlSWB0$uLCJ$4HKIL8w(a$atH!Vi+7+FsWb)g6C zR2F$l6n(rMN18K}l>~KJz#G71TPh_3jKLR+X@oG;NDwgD07o@owE;eCz!eRcY=8XC znBYD%4+YYPX4s!)pnbp!tA@A$%&Q*c)dYxO$zYwe^;N_tS?vEt*I{fwe#m;Li)W7jW-)V*H?v?z|r63TlIHNREF43fjXMf%>p z&fsN2!BRhOprQYrJ5Xo+sZM_ccaA;m?%lTsYl3nVM-KZ7#?H4YIUTt-_mwzdAQ&ixtXJn)E<~C-$k0NfCb4W^6`>m5U>X6eF^- zA-Psz)s9L}(ZU#xLD0sNz10r;661Hwn-U&^S68U}dql2W@WQIS1}>PAR^v02&`J}f zjB}#^IRfo`xSlkjek?MPVx%c9tgu=^QvB<_aH6Z7Teb@`ni%68Z46rJ*QY%upk5p^ z>W;<^fnF90Vd-tjF`3h}XXcjHZQfqx)a@S|4dN6btn(1zKF|r|5cR{IUXF`YCkPZS zT0-7>&NcQO=7BuJK!8S#gN$W%Qke=Kp zsHww^QtL~Kczt}h9Poqbl3F?>s&1%C1`?)R1Qb27Jft1R)$wY#zn}GOCQvOaj z(fx|^sx;mEa@csl9z!Eb5{UuD$J-Hvi%>?q(Ia6YhpUIBSiTiSHi=LHY$+{wQo^Z+ zLMWaiVKq^#I-oM*Jo?HHp+tGOK8#}NXtWUKrF;q=Uo@5Pnqjo#fWl9FvBZP+y>h@# z>S5lNz&-sML$aTgAMVA+&GS2<3evFi{j7StgtCxF zZz-lqP%WOR1{@*FeTuC`Kh}ozt=w1zh;= ztrc%qh_NNS!=QqkCzN|oCcD5=1o#3jjeR^OSKd*+cEgyKCTrJaSK`07yoc#hpesG!&%YVEpGRhUnO(+ z7FkMB4Aok}o<+1rI4jN$ub#u-6X(BHwd3h&)Q=}`B;;cyr#!lAG=!(Mt-}$qMZZO= z6R^xC(N_n@wLiu;Jd4(=O796R|Ar8g(x`>6^DB8I-Lv!nqdEC`oCVeR?Hk>p?WH%O zN(&T1lLc}KV4Da8`GP(SUBxNXW=Y9NFT*7z#O(~l88;*2L8g%PuM3j-^sl4sJ`tgK zrnaIbJftIp;R=nz?l&sJ^Xfc9^^yHxaU>EXxr+M8QqKiT%5BynlDOBQBNHfS%!LIz&p__)z*Od5ldzM9v;uO>=IfyTb@bY~}< zvU>skgwI{QrFWEtIul3ch#dYsfHwnfqxP|re9{tq84+FV?n}i;O*8wY=zuRq{KXVK zSYQB2MEkfB^~+$3^_}1)qPew833`f^w3Z^YrHxck_-1EREKXx`BMF8K-+Iw08N3f$ zL^$@VTYLo4Gmaj1%(%r1h;G9mee%fhMd}3OZp1iy@&eS6ss<|J`V|;>;$Zj_JNTfp ziue}dL59oK^YUdJtDN?gRHXL$h>@dh2;A6&cJKU6&diq3u)AKM=1loLRf*bkStleAD>trX^neA@wb#KGgkmDuowMsuEAM_h%ZplZRH zxuGbIIETzbVuZ5VuXq8@r}zt`Sr>KmLDh{0~u{x$iV?6-&NeBy`$A~s7DMf+X`9E4u|#%MGPN|i%4 z$&KpSuEA-p`Vo*#3&%Kyv`-M_ZDxX5ky3R3jVXf0_&+d3Acy}kMYyO)xG9MR0oMJ0 z?VMC3e`nZfD0nG}0GmXaoem(?0XGsrxyv(Ci_(zj^0NS*B*4#PD#``;kN{5-a0}ph z0!Dylk1;3pH=wHyqz8{vY}b+{y1cpRqgW`RK5n7(RO9GPrMCoXvkB1w=1ONGIpA$t z{Y(QMApne%KwaTvTh0Ox_Vx%$z>^eZBJj|S32^4QL5zT{qNmDjp!KfM84Wyu3D_;} zX6y?&FO0gs1}-pGdE)@%SOlc2JP9Cx`%o9+UKsd_C{nP1?T~*XS%Jx?hCd2`A(RXhzz6|4TBh$`0T>yRO@UF5PSzUR%M+^DAJkJMV$^QN zYDlB{uZ}XljMJ+~0}>rjeiW!W1=N&9m*-%L_#qNBl>*wz2Awttd<+GRYNH!*eQ1L#WuAjs-yrGxgf7!!&?*Lk3e z67@@iU)ChSoNdM3FqWjk+Xa!CM zs)K-m65$vBs{Kia^!ExVIg$%T`?F*e`?4joMO62~{~HgHdjZV-X|aFC3p8LeFc>ZO z&(+JeKs)CBd-XB`>PDn5xgCMl{bvMEZ#s3qyaSl|?}L|s`B*0-aPCF7zfx^3uy8z_ zTdRc9)ejW1L4Na(Q5~dH1`Nea11XI`~=rS+f&%e>Dis(4vW0 zGH%kN<>D(d%E`A>OG4PE-b=Sc5By6S-4E;XSzBME;mKLdK|8-6A1VA#ecq6(RCw;Y zH;@EW8T);pR#bF#>)CgbScPzMp2?76D1-X?{HF3%oVZq_5gH6<>gFxvE-l$al$6EK z_SEPe+xV0xJRs^|Nj}xHm3*Gtd_P8FqEpVJ$ChC*;S?r^5O+$~(Ozl`<3owe8xE*n zIsG8Uu2l?^&O2zrDeXDfwgnrx-#;oKS7XSS{9`Y=IR-t%Cvh2l3Ns|EW^~27zB_O_ z*(gY+@1Q9398ZKj*``aec>0VId~X6`#gNC#;TFIx3(Qdm4|^P!+elLlVj4HqKvvvV zvFS~V;JG2i6UBI@RwQcQ4^4;O=Fzn(;0lyXupz9ptVxl$px_$=pWgTWi=6!x@$^+C zn>=seVBkzh{d4TUjmWoJoS%a~Ry9;TtTY+09wOJ)ay2J}(Xm#`B0$-Z__X=)cX?Uc z>49X2?i+*IsL|((vbMvjFYO*^zruqojG?6>`M*ZHm3&6Gtd)+k_19v~FXtB-=#k`( zusdI9S!9yKm-piEE8RYM+_H*)C)Fz{e{gg1=ujJe8wB%JKz+Az2ZYYJT&4sfo%|t) zu4&o`s*sjf%t1#99CWT)g&z$@QH5}@^t9rRjc8Ox*M3N$6;j^)CQO_4FuBVe$C1ENR~I_BdJG+VD6(e~H66K{_%*We zyBav*I@fqMt!DW_4=MxAqPpa=7 zHB3y-UB{2u&BH0lXy~iWOwHG9eA_BuH<-z$9&Oje@x){;E5VjjQVcP&SLCQgcs!Hw zCe%fT-0$9C>SLU^u{j8(BtwSvdOEn3`;SbtZSTjcYKTQX_-rWiygq2e|0w#VNgBG# z^r@m`gh~ABo|l6Hv!y`ttK_V5n_^}bezgRSo1x!Z@>v_riH|B2-&!kR*&2DaQ4Nlu zA+sZyB=&`OYbY@i0$=GBZ4hWS`35ute ze2dQB{v8`qDjP5-Sz60^Vk(-y3%ne4Aj~_NU8ZryGC{<_; zo@EO(PX22|DxQ}7gUKayq7Oq)ES7hA3=bL$W?hOHMBax(36Gs=*O;{vK3Ftvs9fW>&xxkpE0iDyPQ-sKkL*Ym1xu*|4AtR^i@ z8aQ=Q(4)e9khHV|v_UytAk>rrdP-)X=ni2zJ!J~^cTqwNvPEGyQQDCb;%yluXZTwT z642|4cvu+ROR}It^osa8C}&aVHORSzetMWytez!K0kig+BiV);IORrrpJ7g~9L;`1 z1SPHdNlyeWZAub6me{i)ds^gQK*Wql>y=0aiP0nT+3*YkZ4Bc28Iguo>77|({g{nK z?gl|MZDjPDqxY$LXkU?08RG6W8QW7yen%l0NGEQ1-JFmPRn}U~hHVbyP@3|;Khcf4 z(ig_wS=B{_DBNd;^8xqA-U|Hm1Ez*ay5LIUf5Hjl#OFHDy@pgi-dA+19l3O+s0v&Y z;CVQ9ukJ>XK3VK8V41#@vV#6vY|N^ByzZZrfFq5k#7^x;cy@N4!@meq-(h?3KFK*H zX{1(52A2!Qy@^9_7+A~UU$e&zJchNdxoNFsp7^x@vwaKWy4qBs%C?n}0Ndo> zc#G;xPg^PwGWz_kAc7?izo-n8H2_hom4lIJq!Plq^8?=7th4oyEst>tf8fQ0JMC5P zYn`lk5l4cSh|k}~(97HKwczYxS|ZeH?oT(ntRRUR7ww#Hzg-_Yp1L7rf-ag*ZxF|5 z9UrqVya`lFLlST0mSc^6m~vMk;?>RWE3ZNtApRogriC(a^Vxf0>!I%S0M?u`TtFz; zR^L-iGJt(Wv?g61MZa%9!gAt_@5DTMTso!ovzieh$pSy^%IW}#;>6kRQnaZsBgQP6 zIe+)X*9iuoI+NBA?lkvjbW~Q+&T8pd96sV*G@fbf(a$^|Yw?8x)rNuyYq@9TAAK%K zDYTq7x^yRu)@cKlKg4wmt=U^vk-A=`BK;s!8VKRoCsu-7$bkdpnDWD+EC#Nz6?Ifc z`zO6Igzqwnwjmln_%XT&8#V)akltNN(I(v)BZ0*J=PKO zCi8xiAeh5iTan+aAHk;b^gHk)R8pd$aoG(^%(d1Lz}Y7K40PdNXGwNCNG22AmP1dA zWA|)5FqSeY5Zo~+KXqavp}w!Zw%k>zhHJB**ttIGw2lnx| z>MmYOem!ra7tI$=85pCN&39yFv(Bz7Zs7KmiSaIMf99tLs*e!KM8Nws>oxb<-!bZf z19>}Erv*~yYq-A;23Jqmm(~rpBzvU8rT5p6w-yKAdH!&!HEj?7G}VUC!*rZRt^!g$ zSP>?Ru);;Jo8ieM!ck@x88FS+!23ek$D&U8ovJezof18!97scbBme_Q5#%tR^Jz$4`C?|QG zx|!wEmo;>P?8%rY=Kq@Lb&Kb}-vN}!(9mOK+I*rqzF2xG0NE=8&F|4y<~lfTtamt~;*51+wXz%c*>?gLTye;oz@ zj{$HR8r)3Uyv)E|JZvl}PSn?Zlz_Kjqn2jAoV+@S&R?JQq>bW}1*g3NeP{C9y@ofp z{ZxPG3yIkh`T$+wqW5eg+4Na1oaY@hM+Km~u(xtj0-8#^W;#5{zHB*`PyqDzQp7YD zdkIVd!4dGOEa*NGIo7w176B;Ydug?t2=d;Htqx*C9j{Qh+b{1xcaE&o;cXUWwkAV}14WV0n7s2^YxjlyTpfBLBCKon%B)@B#QC7@XtULA$G&!AK5gq;9_m^5oEyh3B*}l}u$L5~JR{C6qtvTa(nAhc4ZH{WT)7ZPba``ulY( zr``he#Y&7Y9hF>S#dS56bnr)Z0RkxiUPg5fWNmBjtO^Oqua?pjPLVb*kvdIQbGzn@+sAdu$=XJTdt!IX2xkQ1UNILsjzj8JUlz8EC z#dnAq2am%9F5F+GV_+Qd(q-)0M%kFUc89o3#*=vZ$7jE}J^_Xg$cJNEj(M}~Ai9Xq z)Qmwb&oTltcFuO0pz8?o^CQex?YB#285Ihap{})C$+uyX(sQP~hHk0j#dh&~Q1rm< zHXcACbBozK^5;bz!MH~0_?mZ~HAH5u8+M-J=1n*qaBI&M@p_iF5)p+rA~wBj3a6SL zF4fuDYsR4ZoaDhB=W&MNar8OIUR=XR^M&XkOJP#KP1GN>?`z)4(pE5@k*Z zOBnzmy=vI7Ak(2H|4ze^OTI&mjPPyBU)<`A9Xj*VaFQb^&CAY0G!dPCGNr#;F^=!K zi)jqo>%)HI+i1P8eA*TN%q9HhU~`A>Y{))iL#G6sq3Lb&xj5#UDC0b0`IS5rN9*?- zjN@a2dzd?-$$R&e9_%GYq1FMz7$xN=b%_j(X0l{`2 zF{H!1yQpJTzSIYWVoi#bbkf!+F{Q{E7^p?jpRSpxn&{SPVgIn%d;Jh4hh5q2tKtel zk3G}R=z@QT)6#;o7NmwvJ!>%m`9xhhWl~K&3|9s3jd4I6?NO*>?{@EPLGCz!oVSXM zIj>v&p%$+M33q!(lz5ml@%jVuk6*)9AN+s(7>QKH>QPp)WkE791mP@86JWfTW6$G6 z%Y%bQaZcbA4_;egVEK*`>|`AI37I}_2f&bh|X#uIt)IXcxVPn zywX60Vi@{QY9V*WU6WdQIk94OTa*wBmA{PEBL~zPWxBpR)l40JENO+CO;evXFc7Q} znCQ%E+AmUBhO(Z}6#@g9LC5U-nQP_tt@iRfR>nzXyw>u*Q9ip^(zzsdY>p#~9hW@*oOz4qH77%m?}+dqAB7!I=t~9-Lge5VtQk-!7glHF2fY)&waYoU&^v%E7o31 z7Wlm;DdYW5WCijSHnX^m7>eW}mPu#mg<=+6hCr`*i8__=jnAY-+htqXzv|GYoEN?} zrOlFJ>J$ealaC*E1Vx7n0h=VB#^#Ra`v9S--@~TDB{Nm9Ry8rBgT1veKC?42OW_x4-(Q1xyM8~ zyFx-2=|h%sr8HGbTcaFNr5(W+LIbx*l;@Rcp-C+-_YEhFzf&kRrgii3NW*@j*$ zw-!_(*$A+rI6B^5^As1N(Ii`xBcm@{xU3g8h(!(2V+gSdy=iEkT2Mgk&svi}6G)Yv z6!!lH86F`q@g?2PJ&#&bZue5ROB|~n(tfUAjEr2fomir4x`CsA!yys;QPIHjN@av$ zAV1Bf5GqwnPw^|$=Z0EyFT)VTH5ch|b6thk%k8lu&GYKGk*_*CMFz+r-NwmsEr)r< zA5lehKq~c~Q3CmaD7WuNXjyeeG);&i3+QABtdIwq@kS8SV7-0`g39-AL91_fX;nYL zLbB9U=F11&QSl)uhmEixS^M+hmPjJC@gHWq-K9LB;lY!J>q0S?9&Cr_JRWyF=(Wp0L;_H4FM_`-uPH7xw; z1KN9z@*}e3Q5>?oI<7d)_!h2s{(<$DNg|_K?&_E^VYdNC8W;As*Gkx8{$2X!Dy~=$ zS2CrzBYFbAhW6-@@b;G5gjn&zJD^O0gCxI-O7ie|rp$<@q=sbej<$8X)T1pn{t99& z4Y6A7_82F%j35o~i{)^Ies_*;mzdvQh6^2RA_XN+Em4Iel~Eq zgb&lJe&jmlfTlONfC~>(p5ZGC$m+>HkwHpv6+FWGkPq{IA=M&rw*jaa%`2p>bPIi? zt&!CZaV)-?uaXI&de!aRgLd8202xMvH$v_hQsyYirfipagzL99V>!ahGobTHb*HS| zg6!rfjco~o1MQkExTGCwOl+}&1Cv^d7~{&@B6nGUSJ2>+mi7LoG%E5UWQ^VJePc6V+QGi56W))CgJ^?d4jCOy=G%WB^ zp8}mGs5X2#;cLhrI1&3;hJpQFp7^pI4C_o_6^w|J`jSo1kM>hK9{4^N$I4fIC-s%P z@FPiVHIZ@|Kle6C+iJ3@X6bkoQ^8PpHO2cYMHIuF`X}0)QMMhN>xVaM`?K{LsjpQ{ z?Yrl150sK23CDGq|0Ww{Ig(lMBZJ-`y zbtrI7onoh!%uSJ^JBbn?&~Lg4!DFN!)Omo2zOyERbaxs6At&2%6nU_=gcAag^-Ba* zh&h*~B=veJA%Isk6<9pJ%lY9P)E zK$lgJ0QU{X-X_|yoRhy<;tfMSiX7UMvw z^jhYxLsaqdRWZ6%kiM$Io~I}UHCu2SP^lOa*?U00u+=rv7IK7&s_@$%AsS>c6EzWk z8lc~+!~KxNbpt5xaL`0Dko^~Q(jwvm@ZC00OTZ@Pc;FC$&%?ox+o>R6hkwcLMylEx zj_?xD?H5OSTha?a(*kN0;JX3B8c=hEoN}id1!!(y{v*bhzf3nE|4Vb1g6;t|fGcmZ z*E%XdO2*3q*!FzT4}jnXKCdCh_nl-~K=|8d1EnKG%KpliwUAHkaQ`knbfN#1uNz?= zd$0f*;J$$opud6fKVdV#eFHUr|KeeQ?*@c_(K4{~SM%?xjg8IU%fDz@TtebMadPDj z1CX=|^z|Q{Ts93h>K5Jv04LCx0c`uHDWP4&{v-bX@z2X%e>c29>wDSo&+sA~3jjY< zU~np+qV27_6E`R-gW*#8B)Pj3R4TlfMDaNEFgEjacC8~=lswZH&czVJt@1@yWv zzEyU2QSq1o3AvX40n2mhfpjdu7w)N%^#wt%{%v=kt_<&p>ZkcHm($;~P%nHRuTLI> zw&3e#oW6n^@aDL!%SW~RhPbjJ(kkChM-_~W%TGQdRRvr6aDcuwf^(X5AaJ9m?nC{p z?N$Y4cpY!Dq%ZNH=u&Y4d;%rTk>eBCN0J@{wGQttQQ3}dVmiw!P&I{&MI=9@%o?O`KHeO> ztQ2b+%f$nZBm`7C-W`Q9vkl1L|TdeyLdc4LdBUvEDKh)5`5R^s>^J} z;hoEbniWW3f+O1Rx`SAg^O zdDE+*JooeLn+qhoVw0y3GgfU< zsdr4Mx-vBCq=oX)-Dst06V$Gwb~U(4kls9*O_7FQ@86LQxe$FyHmS1-7^#nD(eHeE zKM0w^8-P2l%5GuPq|>xv^`R+FzHqOn;M0u~<&fb>WhxWjx_RwPQ zFzp&*<=wT@qwTZ>tshzu7Wix~&g{cSw*W8iWyYS4VZ)hO?qn+}nUCv9X1G5mT_6Iu z=Tq-`X)$)fB2f)AuoHVUI7%v(4b*z>)yRij@qA*i$6v=8rv5Bed1GjBpgCglGa(w1 zCG^h9r|nyrU2Oy>;?2U~)Jcj_^qC($pS$z!g0#U-=*seZcGTcKL`3JDocM*DcLS^_ zXn!t{r9=WL>1RLdHZz>D5mv(>e1r9;-bnrLt*>B=K_0P6&asX4pLGzUp)h?MUK#6ISnMZq zV&dzLjmH%G^+jJxbuaq~fo)GaYJYsw;*W>6bv8DmN|qlmt?V~_wte?DJHosnZAXif zV7!P2`?8vYgb9Rz4WSZlY4u(NC+c-PbQI~Ep;^L2da8h=WR(DN*<^cs8nBhg$0%vS z#T%cPwwfK}4z=j;3J%a`b>FfXJBGN00(F|m_W6ni6MMRuqg&~Z__~F;Cq&1yHInDb z8aEN228*{yIJt(Q)M1xaa+dp-j}+uhJ9c_wf?8Wh>cT1-Ce>V>o$K11dnjN&t7p#? z&H<}SWU;*A-dLEt1;k`fw)?-*&DSExmV4V)Q(vFL?chc2$G%gXI7>YeO5B%7ol6QJpvd&MMbPW8D*{sXjOxKd_gx zCfhjUs0eIWwfSREv~NpvnlADIrP~`tQ_s)uhc7szX^w91?;rh#ul6>7DxyVg&dL z$}{Z|2V66$Lz!bdjW{Z=niCr?{1G3{yUkwen2$%wgcsq&mJQaROtP3)NhJsZbpcg~ zw~#9N>${(G3nL;^Ze4-?O|4LjX>zu45Q2J8z z^nHIkrBcL4>G)L<1B&HDo9KW`YAW~?!nqHWq=E8#c!}{fc7%8Aw-9fM=%s_~^zP>E z{Pi&lOV2&x)Ma-$T&28O;&}`?K=pybX>4t72*pp@oJvrnXF5E{uT4cKCsDTF;vZsM zCCOJQ6lJQQ*a%>tDZ3bm)Zx=wpb}W(QaU0lh$GVI?{o$}Em6S4lNTm-5;91Vw28#I zQhH-;2GK}~be+x6OB=*#kI$HV32$P9zxpJp!b#uHCsj=JufFlY6z%5pv*28p^EUl&^@@6rZNZV=*ZKZD-Y+k;dBCRzt)BZ>@_Px86FPmZTlw z>rO0@@({CZJ=6Nxl2?RTmoZ52 ziZxb>EE$GP)L&ujm|}o4FCqw2UUAT@@HRIr1U|m-Z9*^BGe8ACj28?6I(E3 zCt!pG(t?WiO>DkE48*0*S66zA)B3|nc1#Z`=--I1>P#zM#bIQezXw%B52EL6KtJe3 z33?KeO?5O*|zt$XgST1!^oTB@43x&NWA(!xO4x|=MW}Rs^xksC+=1Cc9 z_Rf>4kS9^9Fm|6aho7CWN8G_<)XtM`w;uQY=y~gNt^U=}djiBD(jzr+wJ(^$3kG&C z%biNsdC-PKsj}7^X`&yipM`PzFw%r}kAz23d}y|emUJ$GROnI%r}gl|1>uFR z9@@dC$^$bz9kh_lq^y2F_TG<@!$XlbHGW}m{l*lf^fpS(Ci3Mm!4UCX8h7UTzoWbdZQkGCKR!NgEKgrwUyt;*UR_;9`n_*!s`^}2czk?(etv#*bmV5N z1w40SdFEh$|4U2F-rnBM_BJrHzP`S-wFL;9o15RifA4Iq1!NCps_{(P+RCE#=K2(S zikn_CfY9{UqtOu;tgk6+uCFo>qU(;KK5HfYTvb$6miM=B*OII7u>*2lAVahnDIhe( z(EeSTnwkQHzP{eo)z!JVxtU_}!GV5&6|M3oUtL+5niv6At)yO*^L-h>BQL4Y*2<}Y z%PdDuARs!yj&pHw5x}D%2K-~A!|T-~z&SG@FY)s7vbl;pknGIOlnub3K+fTwp6=P% z*~XeG;PBaDBmVUCG=NZthlkBI`GIr*PhSv!)FO_3f(H)&&&O^zdgQ5Og7wTl z>C%9t03A?s@h{nifk?80JP>ep?W`0U;DYDAjxWtmtPJNh#A{7Pfxfi`%;pQ+-d?XY znx1cTUM4dBY(%-P!8G26ZHOJY;=2jd&J?fLu`?j&6a< z`as5V%}B5xU3VDAaGS~LOfBL(xBX)8@N9DFEU@HEHgJm2^vou8w{4_^PNkhdi_VWx z)PW<9M=eHCC0I|%S4vVNT1F&aLc^5L)Ju9TwQkxpX8f%!b2!JSe@0QYB@FO~6Y>Z7 z37dvg41r0}j+y`9ssH=%hw1!JH8h~+Jh=NC7;O6zCJpuigXu5+a~;5Iq%RZQ09pg* z`v0Lh|E?PWh3$b>JAzED1p>V?{Rghi4np(^qX{e5pGS&6)?#Y+ZgKMLY5tJ(&~>tZ z1&=AK9i4J5&mth?Gh zAMRsJdKqa%nyR8$2g0A#IFiv-!dB}p;KqR=C;vwc4p z*W2aJ*NLcfX)(Urs%wYkWXlOr?W}KQ{R{~do^sJyYwFltDcwPFW&ufm4f)o-=AsJ+ z$?fN8oX$0tlQC?(`eJ%pl-zv`k|m}}cR9HSb6oQUMm+BsMb0K!wHv3Ez);RLeo7+- zD&Z-2<^4ajy>(Pv&$cz%xJ%<6Xe7A1ySsaENgzl9NpN>}cXxMpcbDK6AOr}(!`u1g z-1F{u_r7nOf4&+;?b@|>%Ybgithv^jlga}@BS4bp4ECuFh_laiNtpK2BHenRatuLA z700(*vW_g*4+N)O#H=pU3%!`L)2Gf29 z-RO*5*uNxX4!ERbWTifv<4$M7s0nk^!+Y^YMH@*G>zLKCy?H)$cD6h#{aqEEJ8`oM zO<#n+uEaz0+GscxMt#+3L#|qE>)<|VU)>uqy}n~NJ8ZGh>eLX_{VvK~-(eU#e&cwf z7O94-HLOyF|KJzXB(aBG3@W90(}hdwyBd43Ris|EuQ%)1h*XX~DYPOAp~ry{t7{cP zPsfJCah^W@5?{r>C>xLJdVEY^gL^dI873fR!m~rUEj{!0Dwh}qi{AhE(GtPX3-2-CMBot zhZ8|G#exV!s{67)4LU;z$mm_vT!wWSk;=tcyO})SBsYrEhA}d_#c;%%sEzkH!&f;I zk&U_XKRCGuzRL%pj0m=Q<>hxKo$yW_o!$o>6|KZNeXLLT?>`XI^UV}?ofl2aBBhhE zcUV~=r=Lgm-x=tb>k(C2Q7L%QXZKofKXMLv?_aARm}^<=?>S082h?{HqWLux5MaKM zrb4ffhjcsLrMHz(J$>kifcNbnf?|wa6bCI8cz^uJs2w;KbFM0T#UFz(2aj2ssnAsj zx&?ob(#7wyU90Xr+UH7^T!OMV3$uXQFPQRXr>tXFuThOq^on&IfFgJJAOZ0y?%B{H z8_jtW&C-K=-+kQV`Gx}|Pxh;d9d^u%%-DFPA{4jX01JK_a~VJE^SBnwTfq%y3#%IIeCu)FhU$=286xK}YbVwb)&v|+x9 zqnsme9#9_PEx66}l^s7V)2FP&UXA5#0`nSxjI#|gbD{j@=0ox#x^Y9O7Bo|;WET;!%B%LF_ z3A8Qh&t41@$1VHNTXbk!LgM&6NsB9$HIQC13JTTt9zsD4q9-Fa#%VLZtUmiBES9fr z(%49K2=%q*6!zcb{IsUA*0gXR>e+SKgcV$m2q~9|8NT?)@9B%V7>*cV(D*wn0qq8Y zSA7cQ1I56eHVb~R?gdjEe?!TP%?i*Laot4pynju(3xXuomAUtYz)CAfNOd`kCx8Mf zsKCSAl)I#AK?heMgDqmBEOnl!78Mza`Ly}q(oH(lVgLYO9DNE(cqQx4$&>>bO{(bjLl8VfGT{d+Hzoz6a5`%! zVb)0a#A#>WJxcObr?@`dZV0PW|Fo4L*eZ+e&3*5l;;sgJfk%#9IhZa!@HItS_-c{{3 zQw+7OR$<=n-aN?O^u5~_+Go!gp`f>;4kWQsqg?2pX>cM(lKbuq(`@yBvs-LXpc#8R zTEVy5GN=)F`3g#X{NiJG5%-9x?Uz6-+BOEg2^UsjCtp`0mtfZ>2Wd?-9BUcajtBX2 zb7ICn4DuJ*JWXFJ=3RY(Ba0O2&EOceUN{ovk{x4hMBR?pk*rhS7etWaKCE{`5(y|( zsF7t<7@$>OUD-322_@-S7(SGOR@f&QX@`1z!#%_}cMu+69ZMhPq52GNmnGMRU3#R2 zCi$V*S2v=CxDQeOu^4e&+1iL2@=z8cg6u2wJ8zIX&6nguSC=YPo#1OPg#hPR%p>7A z4EOWELw;CSO|jjX%zHjDhsc^IGg`kIthDMye@wcgL~y7(huO+_&1RJC8y8#&w68fP zClmDSZOs(By0A&^P_g-CKB{{|S#xzXKH&-1Sdp?D_M(cJ9j>liXXQ896|~Nqsz%@6 zcb!ItlKtM0z~p;d9t)u`v}>&ESaX5Gu?0(E5XGPHJlQuJKGd^UbHtb{VrvZV_S~>`lZ#jsbK^?!sP^RB4oE97Z zVlzjU$O;)+`RwY#+I*EmXLM?Ex=InYO&8e|iV_>05^bXm6Kll%B{BIbWqVb(l2C-k zZy0fUpABj;WyIG%-%l2)F9>0>xJo%|j{{F~`Z~ic{R6k}I#^BWG{=Qd2a{XSCa!8~ zOaHp8aX~SQChPZyg(DwwqCF=iwE^wsuJJMme8Cbbf)aaCaSlbwa9+_(=F1Hs3?gyY z{GHMHl^&1RI7MDEAB2oJt3WuD@;Dc(eA@b`9Zj-&nl}Mru$DR!Co9+~2TS%%X!_{K zT_Dr6b%G|O*ZZ}b#2%kChF1S031RmI6Dd))hG4(5mE`61JH$ShwB;Yd!GkOv@+4e* zK^mRIW% z9TbSB5z8EV#{`bww;ubAinP-E?zd!7dVC;2OzSL=#g!t@)Q~Szw$iK=h;a z0O?NReJXd@=xl+lOCzo8Cq?&JN3O(W{~oE((B5unxtrKvy|ndS&D%=)kz?u^D~0@- zZ5@;&4j|-7ESfTI}dTp#IfaE(Oo+|lEuy&6~ph;`YXlux-m;^SZmck z3b>;y8n7))DO=WA`E}o}g$cqc4_HtBuoEpsBAER;rHnA!Y)QAZvJV^Ah!*jYh-;Wl z@JPZ@i~Nd+X9^;VfT3{^K+VRE*MlqeE2Z8vbYvQXl&p00r&vE{Z(}`1>T(|8m&ae{ z5{#&17JhEXFi1Hy!!ib4;6NImGM0<|(4B{{Ox=v&4z}1419+7Dh;XF1PxY~^D|USf zVsc=(@P6WUdb}?sJRz_Mp5eNZ{k5O_AcQC~lv-V}654R{0d(MS6VrtR*t|wGe;dYG zMZpf!I%%r%JToT?$fwy&4fZm~?B_hRQ5!8ueX9VTk2;KgNGBTSl39{VOH17SNd6yb z#x3TOLcR8|1;C9M8W7CX)=+dcO*+Y~4p?U-|Bg^g@t((U*~GjYh4*2S86*Yg3Hh

8>P!PxCn=^W7DCc#;{;mQO016Ylf=WzK2OX$9;!TA3J|#zq;-!@>N|WdB{LU%N%q*Knn<-qplnL zD&Rh$fGHgfhXWc}Uj+r4m6c15C%&H3`(D8fg7Xec@w=8bOxN3wYQjw@+^=>Q%a1%{6-&~#Y_sS4U72^~K7{>n zcU@B^npE(EOe3aX+UIA7r@=1SJbB;eD(u7mvf9#P@cn-2w@5wS3%zxMU%g)(GlLf? zVj$S!)KBfa2gO{YB^gyZc4KdhbKnZk@kNVAX-X;Uq?p?I%h|?{kPQEp6+O6`v}2WLTufZ~2wU^K`{ zQ8X48dtFP!-)eV%Oxvr?VaN=E;ia(O7WkMgTFhj{Zxj$aiI2bSPrbASF!HIc`C}hr zr=Qbg$Az^PwcsLHmS5Tt)9gz2+h-}+Bfe=62L-DPOf$DXfsmgQE#g)#ef}5X1U=?I zAx?h&i#Rz70|9+27<8Ti+K&evhkTWlrmw=`3DW(GXb_s5q8v1^EiHA_qmyh z<=)Itl7AOu`ys@R{BfEf@`Nz@46yIT1w4Jjj~b=4Px;vh!VU={j`2eFjkO}a@v-5B z92|19GJ5t2x#Tg~mns|E8ygz~Da?M-KsvP;Kmq~5T5mhHwIZmaDo{lTj;6Yrsx}OAH_k+Sduqp`)OGrpaN=nMe$h>TV zURFTg+d!hCqGDoVQc_YHT#NuOA`Ub`PC-FIetv#FK0W~!M(%$aFAonO&=dce4miUw zEJiab=i=gWG~vkhp{)#On9ZZwr~nG-UtM>SHpkNdl*~XfJ`K-lmxyq0F51XwFud3qpYpxX@!&|3T?g9@-R)BYeO zW;{U1G0g%VSOln-KQfF1IIE$clQhsf3GjL}koJxZEdCK-{70m5IT-ZZf$~rX4J_UO zMfE+X*Of4UY~!B{gI@GMw{@fZ8M_ds5=j6HDPaER^dIHMKbnnz9~5xf4E0x6C_Pj* zG(g|q&-kSg1Z&v?W7&gd*_#i*qTY{~$;XY!7%K!?-$sM=;&M(>lGG+Sj{Qvss z^U|vN&ug&)(eMA+;{I#t5106-kpl$GKU~i#P!hb31+6D@?Jl$UK zC(PQI*T<^zk*{9i=SI4aZC^h>Ly_0jD!V$!awG@qscGl8A=Nk4yLE^8HoK`NQ6l$& z469bYZLI3AH`%XyyvU54h+SBIrg`J^tn==MK-`QKnSJt;>ap;1GC{VY=mef`?Ha7b zCm-?0Z{gqA63lpw-bd?1>|7)Gnc*nWo`p$@<-JchQjgFbAdMatLh_X>f~K{{O+j_% zKXrzl>(XQyW)PhKEO_SYp98x zZ=;o}--$<{V+1+0xx26l<0@6qS2htYP3R}AQV>KMa}tqjXATGTd#ZMsL@75jxA&5i zBFvqgc(gK)J5?b~$`lum)Vw;=A@h~P`pL~Uit_!@c~Wi2lMwaQ{IG9lyyW_8NIAT0Rx6gTKV^eYQ#xRM43lki&1w9LId$Xc zIzQpT-2F;j9x^d+gGJdT7PNhDNqrJWGE6!oXTOMuXK{&bCiiv#Dd&KPB9kc9OpHdP z)`D7ZQ8sEl!2=p}8&Lt<%l|@WXgVDs38iT0mjcQ=Ef;LJOwaC9$kxL)++oR(UTmbX z|HW`JJ6&tAYZUK@y3J5LWmgX?z!7(rBDBgzi4^tjS6P2C4?oEISJ=6t?WdJ)kt{M7 zk7)?ClS3V>d;d;?4HU$5S8gTx=nencc`~c5)BWlEo>pS_CBi!w`yN(QSWped`*^mF zJ{~KPG`RNQ)}_!=EYk9}`(@Y95>K0S%L9vQ*{4;vR>_AU8zc<1ED*F0Y7KV__;4KI zsJ{yN`;?M)kJgP@SbU=9pXyd-94{Ln{6`+55!F@FK?fXPG<`I}hHu=oIY?Ow=B3Q~ z0UM=R`yJRxuyf5W?}SN{K;92u26~0niS^WOxb=n6E2o!(*PCiMQhM5~4=%>d1z+cV zy7Y}kEDQ{k1YW&ZN{rPR_8(sqnr1C6x#mf{FQvfP{M4W;jKNA#h=OD^HM8b=vR>35 zI6HAg?xS@gaYas3F(p(hK@U^Uy~|PHN9C%JA3<7aUX7Y06$x4@Uo3#Wo|UhNM7QtUx-cn18=yX{5TY(_vK@<| zePX^2C`|3~o>Y&G{!a1?+kY=FXaa7<-}$;eE+s#Nmf$+*@JM)<&BuKIo2NfUQ*!i$ zp;+@S1G!WW9^~WIl}G*RccR9fM?X{zJ4!Bk2Ar6#HRFRcM?IDGh4|LX^Sl1VuEdq4)IDy+ADhf&xW8Z{wK8qt- zZJ9#E>YJ~~@2^M~*wuXBkf_KCJt_m1qQ7(#X(`7?5UE5|Qew>3$%bbo5vO)b?S~;^ z-{(`DC}`9KhcdytKAKf}R%7+68JK;6?3zMqon)mfsIMWW&fO@1KT_l@=*A;51w=qc;RYz6e!|D3cB!QaTk zZv@6Cf+w{z3+g49rFxYaaz-|DqxeT$uY1|At?ETa;sq}-J68&iZ>_(?^m|`R-EPBICm)$-|(380o%g3SFKYx7_r+q#HvGa_-lsHvh#I zVX4$ZU=<{DOt7w2>DTk3%z5h}!@=KLN9)h3C+9u${59us39)I~l0p$)kBY~vZ7OA> z`Z7zWQ!MvRH23SZ&a;7YF?-P|n=|F?TdLHw(A&=Qi7&*>b)LfU@=Zi?F%0MAC#e%E zxxv#}La3G%XW7#Q>tZ9B6xo*EM!v!2*l-M4 z7!^&TNaf^MV@qaHLEY7%)o`x}9r*z1j+F!CW3Cfa=5qCRGCql%S7V5(i~{Pg(jx+E z$P-#JiWN5dxyS+ad@O-TD%06rJugVj?aFH*7bLHp=ke0vMH}}VG z7g&ta%#b^9F(p<6(jb)Sq1a-5F&<50-yh!xsU0M86=Gh{vn}K7jBZJ`Tm_wYQmBKr z--Wq3s)Ieci?&65I*KbL>?%s%_P#L-VB+I}UE;bD!^V84eZ$f_by-@ehm<4Ng$Not z1o52ueBanUul&&GG{=ASMmjVf8NSNI2$36@=v%kr~I z@431O#;JpY@Q=4pQ-&s!o9L-08S_;>au;aipYh(sP&B)WR1IhGkoL==&ETgv#jV+$ zai&Bh7Pxw%|BP~D0X;ZDZkq2(Xo8KS0}IqF^lYUpswG~1BOy`7_%@Z5{&rE~zy&<>1yXr{fS^Zj=VyF zYxyztpb2~`i-ICsq7^DOs9iyX^SzxF6&+)9{p+h5S6rU&TcOdD7gTAJ} zch^jgCwJOwwwX*}Bj-=L?R;(B%6@W>XhdaKfidMjfIFj+0+nZ8$b>QFOR^bAORiCZ zfJp5YCMk|oDb{teVjrtn3$YIznt+%~K?cJ{T!rcw*yjl?@n%7f0o>+qs7T>9@Ss*+ zH)Pk2IO4Es!x-hzidpAbN_>lDU{8>Hl{$jEYP=8L4a%4 z-}%2+07tC zfbG%CIOOl?-!UV~2AIs`k^^H{WPC|k)moEUTYKl%uV2^J)((a|`}+G&Y6yX=K(u&k zsSlW>W#%5$vMwwv%*@QJjN}0;K*Sp0a<M|9`?IxpnPz=A4b-)!0Q-oom)<`s|1?}6=KIg&f5ejib;F;-*1zV%E$B)R z5C}2kzoNr%b^QQfR24YJiL`t_cH6y`Jg%tyK<6+bks9eL2Pn24IE&!jJdsD_(OQuQ z$q?L;QD-OOgi!%KX6VGr=?S+@CAGc7gZErPbax}ZL8sz z`}z1_(=`m%*WuG!l9j;+#K9iXvNhfrtrR3FI%&e!$oV7}pG%niZ$iSAn-KC3rBKjyW>^!{mjt3-*58J%7a*Enu%RJPS^ zmhCBSZGapeQlhT{sfU=PW}i59Y>f-Dc-<@hT<%w@sfn+#V)Y%haji8Y!uhe{5)s~B zgTcLDGqH#xLTqK6fqy#kX|AkP>2$uNB-3v{$=mI8^@LbDREG3P4(G2hlR zfT4(Ngr1}FM<*1%dOD>(a@Xxn5iY!KrkhFHaLLGozaH9|tQMUbf-!bk1$4EkzIB$n zq+3f}MUV0?FLG!DMkQ@3)GyH^J}JTJK_%2j5n4yNT82+LnNv$pvGnZM5SkPi?SK*j zjI}c({na>Yom~QQH!t9HKSuH(UZ*cnBp}>aR+u7ru39zAdiq z{Y^@)^d#03&IkkPAg^(E0gYl946REg{QwK-`5q-FS5x~9hjdAA%MU8cl)z=#iNEnj z7{$7G`|>5K`y>(r(qY-DK8$2MiUHa4u1Kzp>L*7HTK=Bt5dJaDWMq>V^aOf8|MNNf z(5%!?e57~Ap?p72<&tIfJ4R=g7ROWZi6K2;b)}CzzPh0!xdzeh{_+F6A!0g^1NfaHv?_5 zk`N-+T%1^cYu;#L#^z^{+l4d`!^huGY~&fuG%beT0zJp)J-vT6kz=I2H+($`dDnN^ z81Uoqz`f5?|?vU|HPS;`z#(|2ui27=!>ByXP_o&r=iwVq;f_Zowjm@!Q zj|1Q5Sg5%s$3nn7qSC|nNTMadW?Nj*E~mZ%ee#%%57X;Sp8LLQ{WIeeTZDb+(RZG& zx|C``3u4qOv=Z#vCtfE)FRnOx9Umdl)&pg)zqmaGNw>ZhR{02FL6M2o@k$S?z~V}Q z-3lpqOP&_iaao=|9GAKmIwGyNbWO&lsPr1b#=(*)`8_>#^%Z39Lex*iI~y)j3xuR3 z>CIu)^$Ba0{i4o}s!n~R1ChVnhAPfd;IJ}Y*1Y3F5 zAdlKqj4|65aqxqm?1Cg(MEj%%3iV7M^}(!q>B4eLfiO;Qi{4kThw$3H;hkA~|4dRJ zrkx!HJ3DVtajta>W6wuIb#UbKN}D@I{0+~H_*xFKCvieQTiwUbpD705&ml56zsgTz zWDW7bM;t<*Q?&zD&*$Fhro<6|KR3n@2~rgPK;+Qazn}OaIFD!HbTqPbW-?!SBT9!D zbAuWOQd349ak%Ap8A;fk+yFCSt?ePNkc&D`ey9FDMnVnb4SH^AA9QD&u$RQ=3kI@D| z<^CwWQ?X~2eR{R%?m_fKW?U;P^?Cy6n`khlraBDmC^xF8mbZo})hQ^naf_{PmLW!D z0ZcpUyIcb1JURUg-c^5$col;GCNzRrdK^@R_nlOpOaJunsi@0#+HHZ>g+&d8WMsq@ z33TGx;N~n8tuP(ROa8-qWQcGKE zVFbyW)uQ@vR>|80vyx$n4#_rPOJ`mdak}M#6EBaq?Gy*vqdyIu8W|Q-(tnNA8QyF* znqb@UY%Y4cUS=?V-2$^4<$L7WESB9av0Y0|@DPml?b@U3O?+Ov5HWwL43$fR*K0VPvF#Imus^A~vl+XU}1;PMgX@HTOGy zK=nUJVMn)kgAm5T$5KH`vxFx&jPFMNXl@yn(_pcmT(hW9xO(}DvO8SpHFepCIP6KmzOs_I;LB7U$TXKn zmK(s(l0b9ZNPOK%IFt?n?&%DrR*@3`FlwX=b5Nk4qY39$JXA}P#CQ(paVBUx?N4L? zxNRA5xE;X#T1WsC4+78>;QoP_z*8GMfJ<)y{Mn5R$n*fv^sMk-Fn%xw0=z?@|3#`t zrCJ^6a>FNSh3+PyWYx z0Iy!GYh=dMYx}#NwyOg9;xP&6sbwK#al2%nD1V;;l~Ph|o5p z=pP0ql7QdH7oPRjUthlmGM1wFHNCls7{TyU#TuNxjQIUIod_Ifu4!f=E zkd3Qjlt`>|bH6??@OVQbr_PgAb?){)SR!!!(8UNb04pdeujI6?@L)4F@v^2v%D9bo z?1Ma`d@1RbNbHM8IHUE(^5A3T*t_f^I&ugF96=yRLLiUx{Edjb-h}&sccec#W(WmT zAo6%Dyx1?X*6c!@Bluvc`Q}PdT8cqgF$D76_v`2|ZB9i3+TYOk?MLdm@DZsCW}x8+ zit;ZwbSlp`-{K8_z_y0iG9l5T5@dw)g1|CKE-DF%E*+dojB&;avSJ~ie#eF}@bKoi z#i&2OVF!AQ3RQusuTO6;t;{^9{FSh!d9~B`V>=|ekX#c|YXowmTfuXxcFo6~M`$)` zS~wgIFhMpi|C{qs=ZgMVxGzMoSE;agq1rK~0MAs~Mj-6&JlcXb2?Bk2a75U9Zh)!fq>Qi&UGt2cVGTB}$|(8%Kc zRvzC9aj%u>L2Q90a^?c%{>Fzo!{>($k5t8zzie3H*{ABiwA|Spwl%@xu<0tT@P!P0Wc@mL)Nt@> zX&h$U2@^hN-F=a%Y1V1OH?#F6u?Ul0Jeu>zQ^#&zus5Tx+Sx}GTxMj1Qb=75I0FEC zg{~Yw@DyN`IBR2uTsN8XPb*>vr1BB)M%UMp9*I>SpkC!Ns*&^O_qF5(!{UtwujxOd z^BHdca9*R(z^6#28bU_r+p5)1e~Wv#!($fj%k{RmJe-~Teq{?WJ-1L_Z6D#%q=3K3 zcHnJ}EQd07>oBK9j_i2BY&TEtdNCUA$#UeeRc!SAS>~!6Y-zb)QOKrTg|| z&yAl-314(~t;smrQQcvqK3P<(^WbDN+){2i!J<+3hvKtKKv@f8eY>S(*&2R(6Y3?B zg@@7do7|aX#Oy}V9I9*a*G_Hai6;c)$a4paLiA$k8x9v%E7Ws_?TJ(B(3>gJ1Fu5( zBu60d<$Kxsj~AZkdFi{O18qU&v~+jlap++eg0Q^$0+kyr`yE=RF;uz$8oKY^P$DbV zpXMSEqG^*HvZB$19aZWkVLF!I^7AmRGw(>F+`?dZOJyk4S_&8lmg)S>OA^&V2JbE|&kjb-Xr zU0tP^4?`2`dezzrbV|hoQ-X$|q%kvj)JiKF4e@mi(8k1oU9#QWzAMUhwA9aHWRCLK zsI+tafmfh)dwnl+s=9dR?C_`gaN=sETeV+rnCp_At*PQF6)ASXZ6V9Dw`xt8qf3X@ zk{Q)_wqFKB*C~xDyV6_)^KQVgpzW+aMIj_(jxnTkR6#$O-e5`bz}^5FDi0V-`3%*a ze28MTFx&OW@uGEVDH!s<6!61for(e&y0Z@7JR$B|$ zIy_Iuq|-j0G<}U%J|-C)P~S@ZPvwek?QVmnL2d}JAO%GDK#92?r~%K=o}aj)?UHRi zvN*f)QZ?r4z5c|4rM&EFwgaJlAVb>@2^%L633ejwAzdwfvzDqrm_XeNN{2I!IE&7d}YB<%#*=vzif~~O7NI_6!O#M9GM@< zKWm1Ak|-Zfo((|_Z-sIu5*<0vbTVu=O1NyHS_C~q7{G=Fx=d*Ks z1_b3VaRpd*m1~lc6hR%AZB3b7pAyU~-ak^kxsPg=>)JnOfZOLxhKdQ|cP+kCsWH8C zTyq+wotiN`g2v1h8Y?RsJHB#|#?ta=KdC%UN!L(53Ywd$H9kOHPAm<#N&@uD;Q(gP~ z{ujLSWz^?4mgjAxhR~bcvi<@~%;0AQ*iRJ<{o(mG9pg4GMLnXP98wIZ$P&bkq#k3H zFVX4KqDMBwx0J$&p6NMo!Xy_Br2TZNZJlrp`o0{f_CTaYL*8bSy)sZ8G>&FJZ7HM3 zZx!Vg!eQi_lgAO|mDK*Ku8KhzrR~gdi+Ojsx|<}>U^VH-{__6<$Pu~z6F`pmFF-B~ zA^QJx8G14ePAXkK7K?v;P=Tw~lDPFQ@Lu}FaW;4WWCc*=zv1Xf7HBL8^p|A5s)YVo z2YcI$2vD!>QIvql<6k=Zt`iK9w*ZZt?fn{fEC8y35$LlyWWWd%6agcUeRJGIRuxS1 zXFf);S^ny}haBLd|M1WK*iI@W0QLreafmJVU;8a5Q%(bQ9^lPv#s7uSIDcxK3P3Yq zK-LU8u>J=~1B`A5?62xSF#DzZj{{e>6ZdgBHbC(HF+Od90s!+LsN4i9BRKo>n^gV> zB(s}^R4>2${sU)K{}`46WN!4MZ97m+&%(kce1&lT7!3i z_2vnGXhrx?(T7^&#O$V&3fl6rtTK6H>VCy-SgG;%dbE7#Fk%gk2WV|LQ4|HNz$7+42G*$q^gVDhv*X-xN&gGxE0wK;`KKxq&n4hwru&MPTRi1y$V(3<#uR9 zd;9SYcli8QfP8jet@5nX6a!2>kwh^AnQ5l9IMdEX!kEnjl%Av*Z^ER-Nbkp_U%ZF- zk%6Db;=Un+XFE$c)o%zQwroIB7Ssb;mTk(@`5xbcUNd*#o8p5hHa}>nhaYXI>vUZr zLS{2ASraZ9g`z23ej4e?!O9}g_%8^$?J`Lng%=L)jKCbAV3ul5 zU1>#rB*CSY;?3be(3kaWMVc;qPajmY0X+J;QNCAH3?Ywa82G-Hqy9`%0h6q9O7fpS z3JMU>pIsmJGT&zA^eOL!Y4W~$KVV)%HDQL2BDiZyHfv%NDsw4Fq#5H5&8xeLxYWv* z`?&{ir^1}eMX^^9CD^h~5}v4GSBYSI0gmF;+y!=W{^;vf#$q2QcEzv4^10t)^Z_y}~4D{NkeKTpXfr;Ui+TpHcK%ZC`YQPD1<6J{4-2!f)?h8S^>FgtQoy#z>q4Hb>cn- zC?OG3OpM%9XI_fAU=S`6iAf#WTK=sMiPV!{T+F@(Uozg2xumm?TM;72;=qBT!(HB@ z@?z=vW0vJKN2Hx?Y~2LNhpA44?{W4SwdvuCdZ88Z5FdQY+}^(dI4mqqluS1RFi?3h9BPkdNK&U}ZRBQ%PO#O5*3=+$3$!bE=)3sK$?ltGatX;o;}U@~?$1 zm~3=mrC}AVb*V?y_6zm+tZbc?#bVq(ucBzP)QNQLFTNw`>VolM4&ACu!=Qk5>+rVp z;+muR+}z>}CISECHTCX(tK=Z8&E!W3J;N>(Q%$!WQ=u;zEsI3=D{wmc<$R4NZtsr- zT*l6*xy|yd4%$2M!BfNpNlMwL-%y zZPKn;ql@+LqHWNsC{u82?`Vxh-ukCk-RHC;t$8iPV3F@n>RL#gxT#AJrU>NY_`Ick z%$ng&U?AT^*ZUbe2c~wvkR<>yuI}~tGG4CzMyLu!SAbbTj$#6p+T7oEQ|c68`>dD- zS>f3J@T=y4R+%*nvT=boQEeVw|LxDM(>$wueH7xAfnjHrj3D;4be#~CxQzm3bMPIt z9LM7Z*@w_D6B|_OxEb3wF$+fF0cR*EhhA5?{)A5AyJiyz!SXz0-$2i!YR%B)NNeM{8qe%vr9QN~=p9}_L@8Iy-Auy$3 zZ|nxEHCXaCt7?P+%V>_T=Xiy8%R+8H(Wm=wU;-e0AO9EhfZqEbpaf1w8;1NOgn zVJcGK)Jc)zs1`Js2rEHL_V24(WuU~jU>#nZzbk;{I#5S$BTIKN3}{w?+9TnCQgT4* z3()NX^tM_PhhMln(`Xum3&;m3mj1c?F;V8cmMJg%^TlS*MYl%m_&v~5eBa-l&c9sm9Mr4- zUHSK@Bg$`XWM*UM=H#EeKiBl@c>4Ql!{4jkxji9GU!N}4fYXewQJ|VUyzew=^1gie zp>gA}b@Q=i^|5f_A$jV)qB87!Hsfk{#bs?xAGqA%5b%ZtXF1=Am-#?5r53 za^(Sdp0w%vmhs8&lMxroW#7t?2g4Ea=N}qpHZF#2FDAXO>d~$nF@H9L?>g}kChjw; z^HclRA9@L+M(^W#*1|{bp9V>ThwcIf?|l33y!vk4du~5<-+t`8b!fj8k8}6}eC9{~ z!FjBzKGEH~|Dd&tY*FA?{fDUhAMFpsdvW{+2mX(101W((+CO0OKf3efMf{(aGUP77 z3So$z{`-O4=wQdR-~&_3=JWkpLA2`+*oUHa^$^ORh7Jvhfv(>~F@vh-U-2!@a8m15 z&~eGj(u>NrH@A#Gii~9%owdb!4f{-tdRZTC`7*WykYnuE>7lu~1?Fauots5}I#|Sd zpu<{4keVk?8kWwrtk=V?(I%6`36Tz|Z?2w?LNxUssaBfu6;I+F`aZbU4;>rf$lSl& zf_2MPbZztfJEKz7N%Bqp8q5NN z=CL~dEt`RdZY!M{>SlsEJ74j>J5|%;Su9UN5t@HFy!6-b@?aFeu&{QFqaJ}ZR!q-I|z@=oEzG6==&}H zn$|Ikwwkl%1ESW~#sc+HO|#s?ebLV|?>J@@ukTkmrA+c;Cesr~(Dq>32aEd3Frj$v zN#cg7Z&m$soSRXmJ#0CRC!nSB;2)a6Z1+7MM-(+@crrQtME9vOJg>C(6C|O9Q?2qB z-*ToRh@0DS5Di&i@->x=Kyinb^wMG2(Lw~ti|Kjza`V?S-#5=&RmhX^4K1185RS)& z4r}8QDUbN`?uIiJ04duf#6R33y_(k@elFoiDP-(E1ZxE%td#i#VQ>9Le=}&y8Yi#o z!+p%9zxn=@A-1g_KTYG!OHCQUh)*FF)~l&t)!(M-aRuo4K7vH3L-FrFv6I=Ai11EH zcwT!Nu|eYFbLr*G(n*45Vp6E&1o(4ehfUT}6p8A49a1jCPJ9$OMYm!RvA(=gmN+vq z5yny+-a9#Nwxd7nsZxTl$&V&MvLz+hK~IZ(Sr?BV#2;h%)NVZ;&i7$zsOTDRwB3h^ z;~1gXJ2#Gk_by^a$8JaU;pOGJ7SWrqkn+B3KzJ2q#5@mDgkN9?S>V*q)ywnFvy1A4cG{{H)NDZ$S{1lZ8y17-lwe!~m z)!ybf?JOn^98(v2$X-7LRyI33JQ|mOdEA}wa)&ON&G6Y&z!h-?J51yzR0e<><#;Au$9j>h% z!h!aQK4w=C_-lo(7Q<-QlGZR66U}2RL4#%V+#~u_U-`QviDT3m(-D+o=WBq5X0#O*g8T>Y!bZ=;bFIV~W#N+7>)PXvFm7^fXILM{xTLQVQ_}H!ru8 zw6%E=e}4d@Gg-LWOCL_7M;(0~PQBnO2`2vhGVj#12M9ZNweAF7YLQQES6IYUv4~Tc zB{IQz^oYEqxCM25K*-w%b1HE;B&^UJrwu!BGIUAk6qgDrx~{y13zLv88-Rvlb`ZiCn(?HnA9$8NePaU%lSlE$AjrY}ITB>C#o1#uDJ9)U3* zjgw`IC=A;kjJW(Wi!WzXl+drxTzDpb(0uS1;3)9QsMOcbZ%TYH{h_$2bb+8dLYN2w zQ(YQv_TMzThe|-@uu=TpDn}ERq_8DFX%A-`U1STLF*+n*&wf(J#XE26IF8~bxE7Te z2gRJpIAngI&vyV^`)jz>YD$k z9-bT{x@ub$I?`H*D-NN^!Lab1j54;*HW#c^E z$vUn0$AHqNC*D;)m1-QFUWQ`asV~Qvu8&?WPkg&ZfI(^^@N!$)AtCj+=?s~H=EZPV zzOm^~&SYk0ZlzxmQ9p$qjwC>aag-Dio36d3dy`|9n0lFb${3KEnkzwU#jEttrR zFSmp3mZkGMGF`*@&^Z%)dyPL~KH-zqu6Lk$_WVXX za?z8xRCBC(-p6WOsxj^S)p>^x_ZK*?OJ9^yM_L@Kcv||xw_1yiN+jOo3Ia>x5ysb{ zVbbSM@IB|BPtPi(RO>g{8q;A-slAA|rO^>^=r-B?=g0Zczs9cD^dg z3j6;d?Ja=fT-t8Y!5sz|+y)q2g1ftW2n2UXa7b`>x8Uv`EVw7QJ0ZBcJ0Wmq?{EL- z{O3Pk-TPJDuCA_rd-|PsrfX{IS^e}{%YV|=oX&}I>%`Uf`GJyWnil0xP-5Wq;uE)l z+IJFPu&$pkWbX-c|)RJZoJQ^Qm!_YXA z;oO^72AhXkjogvgl7G?qqvkf(0@~-2B`!7M2Jd4LO<~uNauOBhE&PN8Ki&Lh5B-fz?FHr zKs7DXzSMz$9)LU6JTwoSGH+Ur!yoXr|Q=o(}?8Oi!rd-Qll<%E#2Ulr(AyPws zpJzxg^Zy3PVrBjZNEU|RA0*p?hX<{-xVZo7KwEx9L}=TEgFT9d^b-*#(?0C)fZNa5iA`UwA5xds3Ru+aY!9saNK3;;mQcV7Si=$rr7 z7~mBEa6v`&hl4YKhbI95pf=U{I5=W3FsiVyDL^1R3=9tp3=jb51_0s!fJh7sD+GjG z0Kob0`|Dr;KW#rk<&U9o^3~K7s+U1kvNBN3v-tRUW@cunjvDmbjE|2G zF)^_SGjo1!?n7|U^wiXIX2wHD`;dl4I5YEXaBv$P-No40Ze``3vXtBhn!ir`i2e$xLza6R`gFf>`iruKi#_}9f`thXpHRPO5LACxj5=35~| zIC#nEheTplkn#=4Eq}ju{Niv-1Ddw~;dRH~jpi<5RR8l~vHQiS+Q>|M8Af0|d>Sz; zv_ZfiO<;Y<Om|A|^0R_u!rwYFYZE{;Uicz?StrfH}n&eL{YQkOOgg zY<%F5D1-Pe;ciYT4RNqgipRW+IEYnwX1^@j6(5>=J+F;4lfp;OM59wplF!JHV{wiI z=RJ}PyC>RT-e*qi74l-LqV`5Zn%DR7)%b$76dFhcN8g-|yM64FO&jkdh|RJoF3MX1 zvMIEa_6_7m^=Z_1k1h`B$Rv9qwX#V@LnNAq$M4hCo_eHKG-fiD9-oS@t-_c_h(dxx ztag+9S03lV~;(=37{+EZN%jrj@R^ z#_FfB?>3|%^z6=OczqxJN(vrJQ`<#naMoWuAAKL)U-=0RWM-aV9DznEA{c8A74;9- z^U#-%1@M|mq+tgF-bLN_2b#1=Nii@H@AX*RW)Jqy?VLSR_Zt*^(U*HTB#OtiEI>JX zm($irRD$FV8Rfu%oj|A|t2ntkJMd0+@%6nSw7%76*&M{&NYxZdBl@U*S6XwPOM(?@ z`7Rc}blYij>Qk>>-n$BjYRA#Qi7E#vy5aiE;frjn@{0gc{;SdNz5Fb`8TgILK*rPr zF&w@bkt9}+x?o`VNy|{?<=)NuZ_z=~Rf!l&X5B4~;yIXPf?^Wt-fa8>f6 z1jI^auxaok`>iPjC{|PI2&GzGZG-LJb(s2x`FFE1x5yz<(2-3#44xnDz(^We9j%vn z`5ZKnI%z${P_$=R>Vi`KFl#glMz;d`z4q{ySHS63w_MuR7>PGw936N zT|A%m{)`J0r;Ka?d$`JKbI3}QMv5yTwC)8%i6Fo(ax>71O~ zNQ=Lr<`*(;(LyNE!DkUG`?*I8UiGd;jv?HntO&O1s!EteH?Ptums+421#jJE&X1o8hyFh8r>fJgh>B`%)-h}5 zt>mo<3g3NiUX#ykaC|tPeUKk6-KYSA;&Fd+x6}^avEdCV%_LawFiS4YN5&gQH_f8C ziys|zuRaT*IuDA+GO;`ph3~sIk26Zyj5>ep@B7_|jE4fW>4euKd$Ub;bY3r~Md|yn zNs%Ni5_${5+wlQjF@O>TQL^W0mE7p828FK5v*oGWG6R4>gFb|TQz{cN9?27B;D;LN zyRCUokI#u*w`AncbCFoYc5j#$CSmGe_t+EsFDOm%fVtGzRoaI9XQZT-%rcSe*uQn# z!eOKQsp{*usrGeQUUYESRU{J_;)hAXTU7Bj=QzPTY630 znf!)ThpBR5cW9cqPDBb!$6AKi%Kh8(Cj|7>h6q=}R|#WM0@GW;Eg7*8INHA0mgZIM71 z!9^g(m}YOeq-;XOCiM2#jyP4yH;7H?m+-ksIY^c-8TicRX~_Okh$EkF z0EM24G?AVb;?n-U`s{4YP1D2A?cTYujRwW^N%0$NqEvXag+CS5)Go?e`Dc`3ned7Z z=F1x+9;(ucA(JQVK3%O0SsP-lX?2DT=ghN1>bB24IFWYCxCok6St8KJ7AO-b@kOqW}HZ z5z5D7ByJ5$5cbd;3Ce^d$(`$XxcbJStPc=jNH9yyRz!fN{Plw(RV*aYn&S|Lxs6fS zKZ?;y&2-0q2b#F2nt3salqG?aykn9X-A@GUMWLLbzN zVdp+*%db6?TZS8dWYN{OgJt8#Bb?LWp=I^I{s=D!rUmFH$Q+nN);A9o!a7>$dXvVp zIv3^4>ZE)^sO^cL>fQM|EI#dX*@&x)EPdBA`YjMAW`zkS0n2BTUb3(7Lt_=fX9W|g zu2jv9JY-sctB>j~0hVwE<+ljz^I7YiUjPF9`44Zpkxy&6ezXAyjd{x>YuGV)`x1tG zo)IDx!Lw0vX5IBncN(2J*6;`FpVZ(#HUb`{^Wv~+5)AQ_6{JaenAChTKKjZR5CzPu zIkJtmn=rYAga?$@H)Hb;X0V}C!U|+qyCUxUJw_7z&Ljb$$Zsz%vilTsc%*@)7^Qo` zHOK@J@>H6(x7vJ~!f0K7nCF7-AYu}uRB?A?OSO+id2;CrkY;2f2>Zno{u?RXY9q$%>PYKnvJ# zBQQ{inV1oQpHsBBa4px^boHK@t2dKOd-~-m$H!oij4zfG_)4a@|2EixKyk;UWjfWR z3D2pV-^;`vJ{0+b>n|@jA}Kn;W~$B|^{qJ4eVo=Wp6}aO!TF1MT5G*TTY_nZ_&jsnJ8M;E;j37 zZ#%p;Qm!%9b<5qS_gnd;W5rNW;+mMAI|g1KI&MYK(WhM!*7m%gxxpgY&OWqpC}2r` zu;UlKzU|`IJdJX~-Sf=t7XmHDE;kWonVZSZI(neSF7@wwi9%D%0(Q;`rWu$BBCAiP zkytBP46_g3yi677=k#t_MH{%D2N1unYo~L=ZEi&qP~QNQ2%8MQ0pB6U495}o>yA9r z6p~}zz0aCWz4cUUd`5oSy>W>4!pG!^aGt#-=Gn?}T-TjxXWrleBay-o%lR!G;x_LW zoVPo??6;eO`nz}I#WPzH)50iIg_OOXjGA=*RKgpn&K^x;jO3@>FbJEgXB z^Gt6ut8LoC-zE%^yE>cMuhw-40T-jMc@++{Dm+!FYy7b>}niH!Rzy3i7PQMXOb2wD*0@P4k z`_qNZm0h_+zgdSV3HubdYQ}{1!Tu!RWaFLCn#9ftJg#mkV+#H5VqUAPA?ZThv&w`s zviV7<&4oQ)>`Asg`Gorh+>|b0n%*H_-Er58>xGJL+U6h$p8&PufS>z&`_E$}KY&wx zqrW%&NYHMO^`8?5ZjqjlNLHpS|npp5TnS)ptk;TI_Z*W^bR$(WIzTIgqp4`aB zil;t$SKdqZkxZS}tklRmdb4LA36c8quO+m2mV8-yuWOTv{xtIZXVttgg~2s%ZM9h0 ztOQl8+>tE&+fQxWDGlA;Llt zzYQGhZvX(AciV@BG6w-&FaTeezhJ!q0H6v3lLH6a01sP^01rj^!|*UraGwtc>k0=4 zo&U@OdZ9#ls8+q(`|!~I_Ax{1w>jf)SB{%mlczxbXJzuA!v;Z~+&UVRZ;j*jyuR4ZHm2auot4`4p{Kd%3}eEDD6N&oXj|MTwd_;FcU005o&zjBR10Z=tJ zsQj5=Zr!S1h}*~I3{*tlvtwBxjfVsXMRq5vou07O9`Lcq0H?QR-!NuCR3l>KD~a@7KT90NkNvx z-L(u*(lWQcLpgnAn~k7PZka=-Cq0_OaHo2|JVAt?_K8cKI%zoELkh^?T%|?7qO&Rn z7jux1cT1wVM><`5*BxWkwA3}KkI;!0lM}#NQxTnR4x7>96MnYss=vkD%v0~u) zmYeuyw3Ybupx~sfXX7!`qExHNqp1JWD1lS%1TX8zeFZ5UcPgFb&m6b-Lu)PJNm@|z z=Yq(qKcRN&!mUN&t|h z4#5Ykv*s7fVg%-)$g7PEW`5cyaOB%Kc%Pl)N{>*q=l9|AVIGXB(Uvlg6akl5z03hb*0xkFeH5}rq{+sgdv?4DbB#on1I%*0`6 zfZ>wn-G|E|m)h{{cTN^>?+|!3qBsnj`>tEm5#`@T-+zP|YPFBHYt|v9Aga-9b4RHn zTgtkIg`TtQLEy6$+O8r+XJEiamSgP;?*=W8x{D`TWl<0l9R$mSw)DF5$YoKr6T9x| z@Y~h|(V(z*{_^j;M?plJxf9!J8=T67&3-&-+qh^eg6KrO&y>KFH>pikA{A9j6u2qr z$#60aTkNA_PDmk5One}-O_=RLjWoc|*aqqHijGcbF^){zvS;I~#HgcDp5jlWV9y@% zG)mp=?ZayBKvkxGmnY*z^UrQ!{s;~ zwDTAFSDHc+c7_Nchk;|ht|U>~@(C^&oc9bUH5zoGI#oMmGsZF|)?cKeJug;?<5~R0 ztiDiJaUZZe82phOU=C)hOZ!;#CJSFO1HL|a{W3?Fy-!l^rx{mDRwC#-Ls)bP@zvB? zxH`+72=5N{Z_O&h22LTC6!efH4s>a22bCSwN(z@ZM2NsbP7b>iWR-=_O>ka8z!bO5 zXlx0AAS+~Lym!ts?8uZha%&+Cij>Nzo4DV4tp#?*%(!S+rR0nyK40^9nb^pI7>0Um zup@WDeUynZie!H3QgkR{&VC<$rv>Y)c3mi0y-GO_nv_B)+BiuG)&2Z_o}ox{<+40j zL|G6gI<(n0z?6^1LtdU(B7zGvt6;XAW8C8>-<0 z2s{bd)A4XAADd#6fWig@_us&^-p8Fj*@oG#{YosiIA7Nox)9Wc_!bLH_5>>vS0X-C zS{Wh_taT-H3XEwlWxM0%%(!X8E{$MOI$U1lab1fScjqc}bI6k_x_Fc5Vtq&MO9nDT z;CwmEd#*a4zf{m$7dXDFd`rN^2drsSGoUDDDLYa z8k5*c0gxWW#~@mJblBX3Y;k*}A4}#eIWfLQ76#v3GCU=19fwJ>#fq;dc(Zs8V;Y;5 zw4d_9;QJT-VZpY8`1qcLE~c%#m?iYUaY`K7d1@3J3FRyTVolOO8g?3IlHa6YsZhxd z&DKT>0lq$6imTj~qUXRqyvbDuOYxJgvgD6^5O~p`hDNZGFGWK9w;j{m(ompn%)9a^ zzjgp3UoCqGrImdN1em?l&;Wk+^{VIX$%~Bvt29YfVXWUtIVpu(wSQH^)Wr19s)l*w zLCD9+8#;PtE-%r**>tSc-)$*Kiu%a2n2!{nkwgO{x7sL7m5?;MP3E`*KZE|mM6Bt> zVO_`_wAcvnZq6;&yVNM*$Bw&8qxZ-Q21kwgAqUvKzB+Vlo5jl0Cl(4u|MI=JC;3%6 zYs&W7-K&4SixBHx>6^lw6qPL+ z9zxa^r{i^aiiWGOAN)Fd9e7_$_g4lP$}ZJDyuKUtt`2+VS<_E2*X?Qaw~E5SKOtO`$!XY#9X?s;csvS*-or2GE} z_7LmjK)bp~J5^Fm$G%lMGpy)a;^DoA%CjkL!Leqy2rBMtj(3psWlOTp>WasaTa?`0 zCy4%B;euquN7C)jRwa`JGAqtXtBn)AaE;f4dB4>k>U)yJ#};DBU!h8FCHxXnW*^zAt*hvNy!psSqTXb12_It zHPQEuZ95Xoh)?n%b!m(a6x`g+v_9XAF;I~m=BCuDv$FyvO%IDHxre;-E*a6oS<818 zz9SZuWv3mb5Oc@Uu()#Je?uiYk&ME94-ZMqPbs(0pI24MC$ZvAiJo~2)JzFiPtSp| zyX`DVB&u;81vTRS(EmBmnyOTliodIroPf9fePN-~EtrU(ixK4opMHr;n}*DK|>@+SV%c}I!W?O3EVoc9#v>h=v%sczrjQ1 z)#eyapuxt6i)gDo)`{U@#)WuR{PGn^7JRgRa;9x3-^;2&Q0`E0O`jr+T!NOq7FZ1T z8ZT8SXHEG2a@xhrSv18NMyUY8$>I-Ay6n8<8_ple?IzAhPDIg()WTtW^GB)Tt>pFb zeuN6TuO0BdS&e=3Q{--!xVP}?W`8AI=}qv2ivA-?E}H;l>T5AJf(0zY>=D)h>96v* z6yLTbw1_X_yX&romwm+g3@r51=kFr-1m6utl|hVAm|k&?Q)j@*s_Pk>O%Ur%Nzkc7 zuAxfMgLC$7NUW^P?lMdfuKw(Fc2I?uHnPaeLVDD)K~%BF>W#cfC3s2{n)$E2GN5)7!5~1f7(NGb{o{ ztam%iM5opsmwJm1sFH*m7}z(A+XoNIAN9Z3A*xjp3WLEOPExa??DZeokuPe9m+I~F z?<CgqKZ7G z>%!*zi=QU7HSt2tD~HGQuXNnLWmFGHX=tCLNlwHd&!+bx->^Dxlc>pMYlDc4rhtzR zZB3Dc74>MSrx9$-@rFZFW1t9wz6Odo(Q%YD#+kBplmjiscH}^+LTue-0(2PNm00A8 zp$<-u_kFGeO@AyfSt{$or%0ja=UJtF4N5H+Bf0Ps-U5ca)7T(s7}CUjMa7b3;+T=g zrqz=q@-tlYruTr!D|<6ggBbxk|DpPkiJG?^cL&~1>)+f@QMvN9YEhttRvS8Dk>IG z?>R+4C_XoGB$-2{U2}veoCxdoS`Fh zAU+!rd`$yZ!csgQ1-|(RL4aJ~Q$|MrxLot|Bqs^L_$BTl6cOx#_1@Z>xXI0a?GZ); zF_rXes)Uo9G4l@b*_di3tah!|N_47U7J@w$M1CHRB9=B*AD#KBwUw2XD}&m3I}JNP zf)vBum6NvvEer-CLJT3KmyJ<*)8=%b+Q3=AYNN{&(5oBAy+m{a>hSx0vtSjNY%wjv zktGDf@O0Uok?c%6T@|EjSQm~J$>)_5%9(HCtbi=Oxo)r8-|Zl=LCbMfeKOF;Si^Mn z^L^3C=+OXoEFQ<*?S*x=&Z}Died8n)*9LnmBhKd~*d&*2TZ-(h^ekIJuPTY2-)u{Sk5Yvcm5@gD=0 zOCFg_yaS(3xa?biMDNy~D#IqQiI^3sIS$y`BBd15R#6nL-WXtnRnC9Vjh|QOr(>a` zciTDSYj=5Z2L;!Cuoypj+ctp2gu)XQ>iha_W% z5&H(cRlWV-t67po#!C6JAx&V;p&FLJ@BOsk0dB%V`N*iA?PFu(HJbIHjyM3=np}U@bwBj%&>=Aek8MREkDOzgH=pIV#+kcB6OSjlfR(>RZqGr_X9c@EJU` zo8H*&-e_EKe-;+%`GjXNG-$1p-o_4b?7~bjS@0TO{=&5ErE^JR_A>-NMrbQ~Jv{le zG2@lF1{zn_80$-!&#Cw!?P^r(I23(y;ZJK55XFLw z0e33^kuuo*$2Wp>bI0zakzn^B1MP3OJanPhzPZCH61xXih#0M-(Yp(9@^Gc#`X%YB zFZ9cBXgwImN2e>fn?6j+Jm*$ar$~tz#4=kA9p^mLb?iLL_YF=Tz?W5(ywTO-OF9I~ z>xM-RdOYrvk!1e7OruA3gO_tp--G<^rj^M2?W9KGWV+C>*XwQBW?O*J`S|0VXxO9m z;?qL>y6UpS+8$ z^^mKqDDZF$X3VVU2Z*}Ra5V5ej^Qj|(OyC*eOrcH3*6as8{nh#vwgjBej9Z5Q+Q`l zPFaE4e6yas-wWu~VNTq}+yyppdB2D+O{xanJvs2nycKze<>qn34tt)oun|4wCGcG5 z-BeM$&p$6Wy;RE0mJ9qAX(XV>{we)q{|6jO@LC1jrPYA|C(U9 z6g6Lcwos>1RStS6jZB-5MUsv}Uzo#4ln1PuVGc22UM{0_RC#mS46X~J8_T3icV&c9yS8g6lWd^8 zE|Qr7vQQ%-H%(zEsS9c;3YBK+h@gj(x+0w4d@|!44~Ns@09|+BLkV8c^LkKb`oC(b z2?A816xz3z!1hrG{%a7r1q%7zE|WL;3HwH82lQDc3HPuD=U328Ncgrm%|=*nf>cTjoN$ z6QP{5%K;-O;~vU6``!50Q=k<4tCfoXB}H{ohWxW$dwa{-2m0&!_IKzD1dADaLy7V= zljj-#92#VMeWe$B=U>yE23-7$VgLW5r2chpD+9EFo=aQ@LLDIfD*uB<#pYG^*F)Ch z)S!Z{-G3QH{QL431MBrQWU`LIUkm_1^ZzG2PeO=Aq(ql-a}1;Ed{uYTUo?101&UJ` z{c0!iOON$l91Z4ximhIS<4Cxu9Hx5bINR;G=xqL^I|A-~@kaRmc(%>*EKe1jh9mYX z;WxG<|HuVab?(uL=O+{t=g`~XD8q?Xqc2RMerl{_dJV`7&4_=PCa2DS_^y9AIzX~^ z6r{t3!KNHaRX3HfJ^p-Yh$mXgt{=s63QIwfOimohaTff`dAP*|dq>#m;83O~KuETl zv~tq5CHpP0{Yy%Br_AY79eJ8!TnGJddB>=5xkc}a5PHxid(8%iWMYjX(k932E5)t+ zM3$GE#XUdaw>#k!3whhbvJQit-f3f0$N5sacM8=iqnZcvHH(lI^z$3umSX4P_tgtW z>=;j-`t}8=smA#WXs2mHj{!WX*#%$j0DFfGBBcMnV#=^tpp+^ooLwG z3feBYDqJzsQ@y!A^iJS?uMNN!n1s`FUG_I2EV200fc(_Bi1+yjTG2b^UNIcoPl z|AQzsmQg%BwMkgs8?&cG7VIr1Vn;5vlISU%)}U)K7UQfWJu>MJX_0w7^*AzFsN9e_z%(8! z0i0RE4e2bp?}bXN4bkJsDHP0`bgDbTNroBtdaZH3YNNd;@M2EQqQzrLK%^UTj-bkE zUbFo^^wt2uA9F`0bNttJPmuJ3bDO}M(!T4-MCmDWW!lV|v~VX`oK!!o?lcTaVeJF< z?2Ki%q)pt3k_ssZBP1;-L*rM8G_k>{8?d1_YzeiielVT#Y7DH(UYOA)bQ;D2QYO zVnWgIZV?ZdPQr22?2sZt)XJcEG2t7!$KtlTHK3+MBsTO6zCed#aZ{zEg=4FiHcFTT zDxUEezeLq|^Hws7L{zY3fV2f;4;z^<1XP2eO*;p)$5jvukTwH?%#{SbC*Q1;ab9Dq z$g_bo2tmeT|Frr&EW&?%D;N6pwoE8fHj zp08(p^y~a501EgE^j;u5ayR?AT72V)!2rd4Bk`ELoQal_09(8dIaFUKcce18mT3{F<_oz{tID|Ic;8%+AcNw*s)4sswvP!Ou@9RtxZeCxs*E)daeXI1{#!wfnjLzX7A zm+hGGJk8B}ux(Ak%-G>SwMWz+7z+s1%=@K)%*)uyR759rQF{wZSqye#DxMxsmrIx; zO-Zy6a@0SDQHyj<92;#7yUbh6f~2vTq^o?hKD)gcghhtfdp}pHI5G!`B~pl1k9>+h zh#VvlMrs{?F!{|P|BFM=x411jv8*btPylIo?aB9dC|~L3c4out(aHpUeXt)3aUw2~ z4}j`7-=z5MhWJaK3;%97tM57uu`P~-ImJR1sjE+F_8+Iy`S)jWqcvmV-{XA!o+)-V zG8-E(7t(;!f|KjV$~Z=!Xeh>5@nugr2SlSUr8Wn-*N>E)N&aA^dTCXt#But5Y7*n1 zSf!xxBpp~IX+l=5u}xaZIsf&e)2IH)iSHyg<=2n=@rTMPvKMYKZB(jPQYLUNA^7_u zVhax~JKWMf=;C!er&s2-4W|Xh;>CU0ha=tjaZh15Tpa0= zdow;2sJ5=$B?qGWY^Fx~r`=U;DTPO{>fRR2g+sJZY1{o6hy zGC8M{u2PRrWak&>djcSnrCT03w^{4c$&lD| z_65oqkq!C7^h_~*EQ_oSB@G|=Xb*#$O)`8)932CrkxFGYKzqgf+ZrMh4HDo@7UnZs z=|skjQNY4jXLgL>61?{xsNzWDyr%*Wjv+9ogz{g1{sx)i-vQGq87XgE!~h)MN-3qL zH2ip8R7B0zL&=W>#wE|J2;=a7w(*)TeOcB^Jju!(joC48&kPuIX(Ra>6|K!beSAF9 zWQml7kv%IgQcqo;lR6TZ1~>idE7-T+aACKm_=t2*(=r%-hLO&wy?}k2@_4 zTl1~^^YK?+b>?WeheyZG^eDR|o1>7mdpK(jgYThIGCe+8@#4EWV$zjkWoFB(Z(1hB zRYqY(>PgrN_qTpQZ+p@>~FRqRlM06-Pfe6Dhzn9b3cUJ0(u?I6P;7I7hFk9 zop2U1Ra(z#_E8SMB-MiN4>IA#dKSJVa5H=j!p!2#ZguqyN<|To-9PtMf6J`L-^BSd zElgHHSQIcZHRc`b5)8f&PR$Ws6WX}H)IBy6ba`Dil{c%LGD6zt;~Adm?S&`G7?9A72YGa_Q19ic3C5Bwu+MdMX1~0?-r9;FJt98qGCvgd@KA6g-yC zw`oopRLYd(;|K3 zv|2qsTbdDnP z@FerCLikL}$g4ss#!zC(X463t68cq(JI0r1zKS8^iRYe}u!Z+H(p@1ztpyzLuEItBOUJViX8mjgUlVnCNm_f9r?RZJ8C+o6n|IlXl5zg zG1Eo8=xp;=5(yuUCFSrQv-ap+aCLnus9(5oH<39_BGGJl{OHukZiS@5*8wqpD_Br^ zPdAtii5%9)x9H=>!^pzotS#lJ4O4d#PPuBALof)=M~L#3c-HjiPJM*#8Ji-ul2gIZ zEsSl{VS?fmjJ{`+5KB`cv$cbp%ZQ0O+mGT4Ufzl0`|dy3zZ=%?4K|U*s0qv(+U@WM zO!VLQ&Jxj93&Qre;?G1=*okfNouDubKK)LJWoMl< zrQMZ%{XO}BrZ}~Q=lpfo{NEr|l+XV`QUM0`AEXN73iJP2;eB8U;}Fn7;Hfi^*~@^6 zeT15$L^dlVu1_lNd4UMK0#MeZCMhPp}LMYl!$elu<-%SkGCsarUV_{)I zGYwn~1T+$)xH!0YAUt9sVoEg88BneC@Co!D)8v(8JMf_ zDS0VyQh-d1%pz87tSoGT+Uy+coFus*ZY~}^UVdR20bwB#yetqj+d<+%$ekr?1YJXl zzwsEGtZ@*qd;N8?==}f2L5@?l0#KG6GW5FrUKV za1;*LK(dR|F^+(%aPyNJ$R+tG)%$QTsb?SVNB&R?Y`#9G{GiaCSkI~`cS_UY`aJr3 z*(aDmM#FF*?68?I`Rfmdt)3;0qsJw7BVc4T6($zl#pwjaIPf*)=f;#@7+$qNZ?Xr){mBRO}qTwUpj)0&7? zuhs93vn2;RJhZp^I3|-*Z8}u&eNm@>$UK=4$adsue!wf|JCEL2KMJC64e{H?oY_e2 zGfG%Y*dRkmaOEhT0?JPaWOWy$_NgYgVW|U^OZYj$OGu?Ue#-~GQ2V;eVO(+*5~2SV zTXl-Zx{147l1vG7=_!aSErVean@YeRSaODF`&**On*geRv?5Q2h7t-zP zf)E~qCZkE$^v0?Rv4mmLeRi&G@*r6BG)Z{kDeeo=4pZ=u^j90;D}UdsF)$Ogo^<`# zJLr~I{6rOzC{6KuoVSEJFnT^W?VYrG;t=4fgIAR{#C52y@1sydRUHq!lL$%QVk!|Y zZx_lst(>t*INNAM8ssju#yc_7(2^Dd57TuoTF9>#@q z6ODCW#vvZ1G@Bckq^v54=*_&GluIYCL~*Zq;@$)7L1u&aQcNfiaeho)A#2^}#Tr{O zym!EA2(H`W=l$P0Px0!FvjPu+2ZC8P3krL$u{#Pk1SqIPw$#sTkws5KAw&G47#*o6hAH}?B3jmiOWdr#$!fn+4^PX7ArH#!S|CCJ#M-M!kB2Q(ykPp@i)1%VY0%d0DgS7I9BPmHk9@8Bh zN=l3Hi*Nel!`7~a)qEi|DeY&p%k@W3Q|Bi5^LCPk>dQkFD>C7)M@eXAf1XVmmNF?NRX+B z+R|hWI04@b70CSSl{{?*7;E+yK}JNKkmDMzPEH<45CMKynt2|p09ukRuc<&x zxxnVu4TN61S=jt(_dtk$VLwQP_m4>2p^1{bUhAstFiZrJ2`ho!J-@#l_O{Te4>Jya zpu1P3!pjHdN_}NsYsz2%I_;snO`2yb()s)3OPc%5#ROr_&_nHgR>DD1A#cEjaS>k$ zD}empgkR|J|3UZ#*#9T|YA5vmPiilDz@%8>FNMqv?Ywz~lwr=OE)rkpjX&su7bQ~H zG;;=-!}qL85A7YQj;8>DQpW#W|tD1zmPo$)z%nKz?vBeKjhmX=ljWfg~ zuX7zj7mD}q7z->0WHYXLJ-9h|C4R{tQk!Js#+A8Sc8 zBC~}TkKmgDhH8J*AJFQveQG_r1O%65d-UL%D`}mv6RVaqJi-E^V}(+BYR}(QdXW&0 zPEtPsF6`P$Fb!(R0eM0Ey*C42_xWy|#@Y*giF^Bb=dc3V3TCC>(M*Sg;Wn5haq~`F zDDYiAbB#89C!ov@C#+f}Ax`lyM2PsPxMOvROgD67nTg=KsO|uQWpgWZHR289FrR2PT#FyZ-z%}sE? zv;tmv9gz5rye)>=(0M}4J|vb-h*{_;BY$4y=W^0dqYOx_PJfaVrjWT))`_KyG5V5C z=t<}E#O(L2bqOz%^8xpU5ozi_pHEb+okNhOzj`eg8}XNfbRTu&*4(j{ozLMT9?kN| z$BD3tU{R%9U2T?&zO6-vRRxFMdPgJbXh`uY*_Tur`9){`q7jVh$wZ$RNg|OqRjlEr z?7+8zr4aiSjpvU-OU58W`p&<#U}bW6vO(h^EYh!Ro~B8_wmBcOnQBHbXJ(jZ;Z-O?eAeCHS6v)=W* z&-Z-)&0dH5?7ipAnKQHY-uHFK)ff>k-^I~iDT33^f4=i8Vy>nWjKs#}J9m9*hgy0v z0gKum!d&<8VtG^2Tik1AN+yi+P7Nu3aJ=I*`ta9LR>iA6Dr2ZsyK*Sb>n)eYA$uiZ z)_GYJ!;Ftgx~t+7W;3;>sX5;DUNd2wXX{EKwM8=W{P7RX-hOW1%dswp6` zRTn83<~nq~a3eeXJKmnDit70Br&x>EwW<8h^)C+%T9s}wpbX;W+eig9(~z)^VLd}B zX#=!iI%dwynsIZea%}!X^KI6h_cqh(ktIJz(a>;{h`3wcDc-K2v+6ceorU=)k$6@u z18aWC3tVnWOmSizZ7YjsZxpARF3Qu!=iBgYxTya4Xi8kL=Jc@cPJ7`9z06Se6a5xcsF{}zOqtCafk=bqVu=&fLm1LT_Y~`c|k2|r$=4i zB79XnlA0t~ICXMwddWq<)znG>7`=A0l4Pt0Xqx+&*gvxF3bgs<37Pi|arBsCySCiF z91_rRGex1w5S95^u~$?_6=h`i{O#8VDqg|(f(S(X$5kOItb>d8oS78SyI&hJ{gb~3 z_xA^XlLfSN3OV@uqsY7SJR)?)Qw@Yll8ywrpum~jJ6N*>aPT9deX4mQYDJhnB4FG- z3nf1m4DC8xA1E9&azxt7vsuV7ixl9{*28p9e^Dc_8j-Zw7&FvD!Mc9)dG#&4>!yEx zvHb21oX|y{AcTSkL<6DPvA;Ck9ALW50!&{fZ9jTOv@-QpmaEn%px+2TVp~`HBS~-y zCgBg9a9Vss|Lhkz`U+D5GLkysIq6Ap80?4GZVzd2ljSHwqJ`a1D&ss2cW;RDtL;h} z5~bb20}7@N+LP7KVmZT_Rpu_Qj8P-*{UXZbsnP4PvLoH~ue%)^R9;mg%R~JinmuQO znY~bm@LURQN^Zein>_R$Xtu)9MSY!9&nf9VG1)CIf2MeP638UMeY3}a8jOU(=q+9j zAfFUOYuOKR$=k#Ka5gG8Me;wmW1ec&W%Y*uJ7FNJNwKh|CtRS~JNi z74_QtOklz7siLr`-jXK{XL_OLfkQ9J!i8gT_I@|f&8x&e2zPZeU68$oLrg8--NQAtk*4&_e{GYCLjrANVZLeq;LF{Jz6WmX%3g9~GA*m1JRb zowYq3Wqp!F4*|#Jp^;YavXFcx?O9_ZA2VbuznQ888Vc+PGdPgUEN$PEN}fZrap4Z? zg9#)i&=>M5T3=*sjysaDmoHz+Z(l}vv0g-oJqEjsv+cflVyt$5_)se1L)8b(KTAW_ZZe+-SbmnZui(OKEtY&W?umRb@sUaN@XVq9Lp>f!TX>$= zb>!JQJMUXF%CXRpPsb0oo!?h7%X&bv-QhTJQ=3t~Urf~m=st~4_^iF&dm;KU5Ymc_ zeta5oVUbPY6Dy2mWo7vCxNy0oipVV_*g`LjPMf^Gxm*v}{sy}rXo zd>@*tN!Q=X2%&Sz3-j?gKum^*y;>Z6#!PUsLC_gnFKl_W5;ehm*gaj~5v&r&4SY}H zsW)N5gIq8Tm|JTS&O*S72WxKv6C5XtKd(%_bo*r1$Y)-+_xlGEQ$~?67DdF%;EC5x zliz&TXs&Eb~_Wv4?!HT zu*qumU84t1Zvqv53|{Khnk~>Fo`q6k*_b#g8G4uS{9t+!Yh*e{qtK5dE_W0{hE29x zT33zT`t5Pp#|l~%%q3uyFrsn#`F)y6lR?8x=(4H<#H(UTn_8qLRkumE2gQ}*Mgyt- zqQtN(ZGRr@Iy?}HJKH&k21V7*nXRIn+k6DtD&Kj09?v238qs=KU9=cB5q8f#R^<5$ zWWe3o;Cl~-ce5uky$g_Qzt6lSk0O0faM_KioxK4vHy*kFRc!S(mwxZ!Kb336r z;cO2bup{W6|JtQqm()HK)j!W_g4-{5hh6*kj(o5Yfy@2*y-js=P${j1TmmQ|P~bqRq*qDfmKN zm_t=kKvA9qtu7_2u7uXvlfUGp<29r(3MVhGCTRlq@ePpgKE!XDi8@rMR9Xpo;|LM$ z_`MmBmM;7sJ-7pXcte9Yqv^OABUlqfSj7_<)6*CWMfg4Q=u1net1D>h>!@4XD7$+o z2S>p18SuLYeeMFdyaulCfV+F(ejatFUnp+_R09b9Q3I6k5BZm}E#Gv-L-OeG)+LpHA-sHmGaSUVkWc)%r5yolzlvMnGRbel;BM=l#{d9icbl z`a#S(MpVh82PmPxV(3xi_Wg6)6kZzxM%AqbvDr6H?2ooK7bY`@2eG|-WR|?*qPfoBc^HoLwRr#I zW}dDGEAViXnZArxCPTc&&hM!xO4vwMwO48}igEHg?C;zOE9Lxw!v1DiPJkARO(jXD z?GWaf=#e5@{$vPmt9L%0cliEY%6DOU6IJ76{zsOQcb)>&o0jKX8hj0tf+O#&22j5+w~sWdtB=F% z0u#gR5?#xGBqXb5%b*vW~K|G)j`+LZ62jy|qexWH&Fo zLasX@+Ql?0u1&-`OQf_9P0?l0^!h{}B|>#}G&^e?Pp741dp55$M}Lz-+bI7!DBdi- zS@YVEF-VBTzLj~Wq$iGT)KO@()OEwPf<~B1vq)WCX7IUy`2n_UY|uxe$%JzG>!PQT z(rH${>?X?XG!{*>DZO=8Xrm#Dr59np<0=(9wVGQO)9E`Mz2woNmSBu0ds*&FjMlEs zNV$ah7mlvZhe*h4tIp;51@;xfX9b0ZZa0Vsv*U5iyH+1>&CZ1j2YsF(Y1TE*8+s8dzLbn1eYHt?kHu+#r3EqhaupPAD$d2?1e2#vw!*ctI z`{d643nDqK-rMF4of~c1QULn7FWt#TJ?4Sk9p7)I4&1zmsl&vrs=Pb#(MvQn;+=cU zvXe|UJv2_pdvvFwW*wbdG)`TGH&K^ZtQs=2PrCR>)H~zhpnb~k_X&mxZG;i=fZ+q= zB}UiiQ-R}XIBH{)_$YcpcD+L8*EAW@#~v_@pUGjfLb3_%i4Gng<-TmD3TtM|c?>hc ze|AG2_u3#&d)|gK63v+`mL4;_NUV(*Q;BI>IO=H?N5@fxYyNIcc&%U7!vgal5DX(3 zB(r@?_Si!(>`90cX|GHAOLDTQ6ddRm#-IMlT0v@UT7~9@^9Gv4Q;hl%)5yowpLm6p z1xK)_#*2|v!C#V)L`5tCz-6m~KBri}mCo@p0vHEM==yIsYxB$_v?kk-fSVHq-? zS1|m;%CoxzM#WpXt^MCmPSFIV>~S8KeJqi3v`zf!S{Kr8>|kpo<%mrl>$ukJmnS{i z*`Zds=w%;NR@NyrwKu{ft-KDyX}~9`a(wR1zQfl;eaOt)JbJRtmXcx|K#^wR<{^ZB zf%<)#_Rx$hmByn&aQEk)dnL=v!mCGYNc7 zQjhRsPM0qkDA#FwgIoiy8+mv!TH#44u|0DqZJyG6G3rGxM^o1rB>0_6QZ-MGET9yp zm6J^oJ4_q3=lhhkL6C^{@?v7Vzz1>~%2;mC<-b*aKDr}H?2TlD!aP478#R%>Mb)|@ zqWxAMMXgcFNkB};ma{v8@_r^p8Rs?c2r4m-w^a7N5|+AW>Q_k*op15#SIMZ~Awrzq z150*v7e^Zq%@>I1#4Srs+aXMPyx;dR+s52%1p0|aX#87}?Tk6iKkAgH@(kvW$?K37 zRudYTcrFLUvYhrW0s_=rWeb2JR8Db=lcUcUrl`w^HZ5J6v(pchr+2;*D)C|RBpuR0 zYTfUh&d<(qe>xx8bVr5!uw)%P#C|PVM`UD5J&qGIVVq0X3R0t16HOO~ORNWvKKUOY zJdC6NWYzZnch&x1VzR*SE6|&Cb93|d_O_&?q^+%Oa&i(3!WtSHIy*Z91FtSGFTt0C z0a-^!N1#vX-rnB&`a0-+3O0g_u3+j)FqR68#gH4e@Nt(S-YCzv+;&xwmGx~&TUV4(f8#y+F$wuJHv3J4Hp-vNui z6#8CMhM{hUQj5G^=co8{&z-5_-*2NA|FF(O_3`gq6Z22%-i8@b(i)j`%(87n+E?T4 zHeFQyulXw32Ug>uWhORT$fP4}!>4>v6V=QgGz{CMa;A-ux4f9YR3?{nV!LZOe3%7e zr?krre?KsY4%Sz*$opb=$DU*HHQUvU^ZWPGvXV2pU|ra;S=$#+e#UZlav$31*f{fC zlIJhRaXudGJf6~iz9&-78Hwna2tM7mRndQRG-UUE*7mHb>N_e0E0*ZlVz)n#9KOz> z$s6ULd9mYb`-@Y--9UrEzMviX(cFU}i0}owkVG&!5(Rnzz;Wilm%tklN!W$~JrFAx*Ly^qC~2hNT|0 zp0gVC4?+}esA48DR^2SyNF$y?;$h!>4GtSWH%^|W0;AtJ2w)X2HU)+omwk*qItG_{ z@at)!?G7p(8&>S7ugyotUBm)p4!tSD17uD~0fX>5Tp-sX1b9K@%8OWX%Wh&07dJtvwz8;BF$lE!*%+hV}W!P9)`l?>^J3n#kH-UY^S<7PgCB0gpq)5q6 z>lOCE=9G#qC8FP$Bi76xC9UveF(&d0K6rGR(WH*8lzbFz&}ET_{7ArlEibo@Obi)0 zDB%XC*C2ed4S9RUJr3xas8E#w{-k$K>fv&DLyPGTm{MXt##dNO%_}E)CgM0 zTmI};u?SV8x^mRY+jM!<6TT1QZ$x_WvKZNesa&3Mtap(npjUhxP5&6@@zJ%J8+$#3 zzfykL42$YdO5C;r!m8v%z8Kak$B%}o;yHzHqmLLj=on!hj*Tx#RyO~*MgBTl(MYOX z@VL2{rL$`<5kLOZwvzlnjFZ|c!8bM@b~T*6N4njv?qiA$Idx~w0@cMV^Pk$*@lhTJ z5qsM7m2FWD1RJTRb-pBdl`T)wGC{PknqU16HcI1zK(G23k#15+?8>S}Aut+Dj8))# zMX!cmqmDjHGKm~TdEQ*+?1cLaNnLQXc)y%SX{Vd;r-F-4-$XVx%1K8!;-x+W=N&p% zP&gJ2yx{@C7|RO=x@=cW z6R1_{O)#xw&#TPDce0$8!W!A+twNtK{X7kk{EczYU?x(&|Go23wfiH>-Gn@gmsuAt zA{O7~CL%eU7D7x)64zq*$W*XicQTgI{rOrM8{Q5x5!&X>&t*(g;kMrhN+I9cQO z8DJu|oL8UjLh>WETdR1wQs1gTir9|uPyYIg4Gv7gs3=!Ngdj<7b;!+kA@85eKo;{5 zb1Psj8{J4c3(tlWzO%J}qcfWF`bH|Esw?gPVd5t~{SPL7)a!pIei;@TM=D(K2v%7b zHF#9yV1RS8{L=y+!MKFIEZ`s)0A+0fb}&A}PDug`#jubQ0fRQcUa%hief;Mo|FnQ{ z8~+F(4-hCE6#!@7(7^%6WoRIS_kBOhRWoETleI9E1MCF@FTi7j{R5D9C&gLB!-xl@ z+p$++UoL?KKH)Hb$k`Ol35J9C8Y&$Z135lI|BwfQkr}t0R5r$9_g&=o9VB0zp;KuD zJ7v&XUpz3_;xCGwR$PC5`kQ*p%W{9FM9t$9y3iwP7WKaR2WIzK1Xe9<($bfcYpo+VBH;9AOq&?(DJB&R#Kpc6zJjw?hAne7|_WC%rgL!>cAp9(98&o z!GQf(^cqrNg%KEm0+VDw6ERRv1`HSg_f(2G)6j9BSai7uZz>F5H1~YM_)F$f5?SsevkLpnw`k zr2?+~fB_1im>MXe2Hrw}5^5k83VZ_}i!!hn2GnZ;@lXH(1**h=7$}eo1>&H<)pxS- z7r=XBVD23Na+Au*$*rmasklHY7BJ%b*E0m`=l6_%aYg?5d($Du$R9rm?lBJYjpYI% zt^e#c7+df810gzx_nDwC704a*PixtKN)~i~AOElWRUo*X`QOXG*Zw~S#e?#&++Pi? z_jz?LI+=&Vko&+TOYlCbTjS-x-H~M`*m=l*$Zz>qSPWQ>?gRh&_y1LfK?CJ2*cpGn z1P;6&&b&waYm+q`NE|t94FVd4{{k0Nlb#)5th!YaKEbPEgB5YwMne5QtId-e*}gcQ z8|bT~t}=wi-E$SDGg<9FUZ~om7JGZQ3J_K`l64J=>-4#`jm#C&+aTHe&%s^MOL_{A zLqmz56StM2o2csOq8c~FWW55tXSWtzIoY7fIC@nq2soS~Q=_TR07;w20@0yG!PcD| zX8q#9rU9Rg7VnRYMCZMl4>H`LooPRQ`vtMJM4VJnI7VU?>}gqy%bqE<%G5bmpFKt* z#cJhcIeDmmgXzNMk| zp3+4I%9rJ(Y4XKgz!vG8cT^$^at;# z2@e;4zDxpl{v9jjKAlH<-Lp~O+k0`i-232d$q)ME0r$<=aZ;7`%da-AKDOqfH+gXu zabqRka67+pTb#T&?144K=QT@C=HK1zWOt3l)*mJ_r-kf`4DWs$-O22n4)I^t2EHHP z4t{%S#*jHU>#2{G*6;YKVP>{wL1ukWX+cJA)Bn*CL0EuHgNeC`tE;ZAuB(>QQ$Iy( zeRsT>*|3%mCS66nI>T|qZBgfOL$54esyn=V+0YPe#+hnk%+P~$s`)zK5we)xC?9hu z4g3j49Ds^Wsq>du5(#Z2nKElMw+;r=DE)&*BRc7vNJ)F{L%zYGgB{|~MVXXcRb(*zM>A{gqehN|hY2gNmN#=KTT^A_T-pe3s|vjZ~(|Ff_G~fnKfQLT?XE<7Q?| zB6KVgHrHqVf^VHdt%49`Y&XiE6hT$3T|*-E$&2Gd z{@|QR7?jH}I$rjXL95}GoRWVYN=sm9_6a{{i;}F~$wa&U5mmZtHb+U9Z1bF+S?B1X zJ${Lq?wmLsTu`KTCLF>+Q_)mh_!+0@E5D7`D<=kfF$jP1CK10RlC+q0A5z|iZ8R?Y ztJhbRtl><~mQ6xqRzT+|dQ`5@A=co1+?rogV|F?%3YL7DQ@WAwy#kW9=lyQ_6v}WN z_8Z3-l%CKnTbTGgr<=GF8bwh1k!?iVr46auX=T8^N54G3nVH!wRahV0;@R91o3R@q zE&4AgS}1mNGP=`Savv-K+_l=sOxF534+w{gPp~q{^G7cVm`ZK--Gu9k@TAiM*_jGz zVEuk9aaMTUfnP~cHEI<|2FxTMSNi>8wzS3%fG_Xd_j;eE^0griEKn%~?1oBiW$3XR z2-Nvs9S^XaufBjNj0+nrtfpaW+A9CCpL+Xjw(dmS+4WGu9i9VcOoY$ew1q1VVw9vB zQoR0(9^ag^UM_A!9O+HsfQ09}jp^a!i93cg@(^%0%qEK$<5(+(ST~--Y+UvL{adV< zt2G3FV0!M19QBKU!$EgS#m5D!TV}1{wCx*fU`iC<)3ZzSLXxHNyHiaTyU&o4lE*yB z8qcr&Wgh*&ER#wX3o|wv4sxrL^ZgKFa%#vDBwnHr*wEN$Hh6zke>Cq>ugNxkRQ@ey z19!0bKKx>-d*6{l$qQ8Q_4`@f7qk}mV(ZXr=hlcdJHA@;sDA!K*>Zf}=p%-{-Tp2< zRXe41zaeMbetzS)0Vk6G?OYF`&C;msDv`n9hjWEXv?UDUU~U@sr}tXF5$?C9kKvH! zGWbC`n$L|rQHy-@&6EOm=q>5Phne&5QNNG5H5_MA2}@j6)X&h7<3wV?pM2eu6Zez& zbgfH8L>cX1Fr*~E!PW71RLOhNGE!`jQ^ zO-4ruuIpy9P;lUS5cdHzY~=z~<9(wPBm^>r-S}j1sp29aA0<-l#bvEOuJ9w>)#%Fr zJx<0I9~LIpG?o5oUbJb*%SdtP}f8Oh-9&z$g? zV*=!vdq1-5trgOM+;%_3h-E=AA8WFqWO4Yyo7kR4+BkEfo0yxMn*Pv%I^weR@oa>U zik66{4~6GoL@Lt@3dq%2ANd_ z)pWlnzRi$x5l#-(Kp9(#5LV9{Wgb55lUB2Qb$8CKd*T~lkjS_%VA!<%FRf4xsGAG((ULvp5WJJwLcMEs2=*-`j z=H(J3t_#pg`g^UXFF`cm5580oYt{M{v$(fFY*cU={i${MalFnbQLcEaL%UVZK01HP z@D&@>%GcS6@beEs8tfV(LM;1=rjMN8yN~2q7ZX*9D9+vP74Wm6AVjFCy=%Qa`G~SY z!_)=dR2Qh5_4&b~G0+&G#dUEa35ALA%RQFC%> zWq*9R@fZglCjnpTVtb3I_izlTj66{W0lg_9TfU>V8W}JRFUM`?0V1lCmtWupPJz4a!eqr_g^-4y2 zh!O5jvp(un*{x{T@JS7VFPy<*Qh)YJs2wL{Uw@iCQq3(Ud~S9-@C%~(s9(e_F|EnTmy zal<#TKYO|%_5!^gI}r>^0`DSV>v%4y*sDzRy&vupeOv z3=87<#TlUJM_Oz3F;|c>MrC8Clywg{C`$^D?l^kdGj#>#kbF{!K2AdHyhUiAB&Ror z$tW_+Xd8>k)6~h$#EbPa{te)xx4!$6>;o2N<5d5eS$m2-4|xYgf3&`9Wr}PO3L;Fz zoaOL9#PRbX&x^C`tc;{Z6vDBuF-?2MN(Rw3R~j}(G=K2Jggs#I-K&YBo7er z!7)H;kc6RR4Z(!-i5XF7RP^bws6h?Z`jaj9u`O;w3XE0PEiA5d>&uq5m%Y#AqvQ&6 z<&2n34CoKiCyzY#ZG6bIr?M2*W~|l1hMh|kRjzAXqN++z=o1`W!mDTv#GKO8iDb9~ zP~RUipuNf{o*)^Fvl?(N%xt=^zRN1f%?%pnQYX*m_(GiNToyO?CTJbj<9ayb|HhhR zDN4f{2fgQW=*hnCE{)lKGzHDvJv|Nez=qq}{UP+RSA8w1PKIp2h#7j{biT%Pg^j%K zPaI5pmm9v(sWP*n8%I$%X_mR!Qd%p+Qz}tn4RWPg#+W^5*Z3;~L|KhrnM8E+?U?5k zSzkYM>TG^L40~i-%zbut-npgd<;`#QUB0Vkpz(AAC*0lr)InY@ z^Fs0MQ2OrvezicrN`19f_3vo^weQs*{A6bwYZ}ZNEPfX)8r-9e2ay_wq0*QA57-a- zf0T(E`Y-m=!^_$Ef7NjTo+V-ad43+SYgLGUQ&bQXc2pF1t*y3PT{b;Db{rk{v^6$F z1P+Xi_RXJc$w>ZsZg-@w)5gudEXdcy&blbTJIlvi!@@Mp%l(swYm$d+f}3-Ui=%>( zafE|?ke#iRp1z-z^#=^rp2^pp^UC;U6E`{DMN8GK&-ftux_9$coGiL^~Hl>TT zd{Jr3)$1sH+ErrLUExxd$ldUfYqnBou~uTONnzu=>Q=kPuWp_FA4W$*Pv)ydIx=~{ zUa;PuDp7(@^~v9;0Gmt4?)@iCP-g}eYf$t4Uy9b!|I+z)*Z)bl#V=PlL?{3NXu|)m zAp_$pAos*?+ZeY)hmyQGmOb(8=FegM`g}RAqtV07$7wQ|jx6eilUj4{QvJQhN4?aX zESfthXAg8we;EJb6OJ37kv50^Dd4fZ9hrpk;(c2KfpN9sxt7Bou1I+71Nc*ERb3RJ4hRN~sN(K~JF9Okvn1RU*9mF(!`gP-SF zdG|vq1Lx@i?XxOwQ-r7SO-~8k)eXFi1U_Mtn5e>+HL1f$<$tWx&Dv{#(EIc6k)3-e zs&De)4)Ghp__a}q15!iiv9@K|@$4i*UOm)wQ}8#*;h6P%(p49fYW*i8jJuVmN9JP& zXHSktvLolE6_U$o_^@FP+XoSiFDRK{8F6JwtFaw8Ob&Wjl!2P_kV;8O{y1*A!eGb` z*x{+1(mVF7Ke6!bJVh=;l9Q{q2BJu>@LKhB*#Ufcqg+C@E+*Og!KhAG|3B2|Yg8DHI z30|K|FuEf3C&sdORdI+KC#g?~Le(bn-tFmAoB)gUq^RFVgjDWKn+<`(Z|a=EOzwVOk-{bX~;XBYvE(Qmh=41Q)rC=g*+)dVLGXA#2ly_^xE_Pn_<$Ka{ipUl zqU>Q|0p(c_oW0M$Kk`pon%&I5(C#jIy7M}`s}>RvhW}^$uN0i~T9!#|M)35o0N9LY zx$XQ5_y_A+B>Gu3=DZKf>N}RBQWVe*a8kTe`FMi#41nw3Gwt8_ zWgrMl>VRo&kZB0P7@LOZpn5XT`1QDLb8sn_}h4ZFL z9*ETi_7*LdhH_|Uk{&G|o^n;E=nU0TzT|7*z&imrA z38S9P)<7(2qos2iPCMXe_QD`UU3;)CdR@rkH-A#2AvaEQ9DAkoJ``(Ds?hTc;mM&vb(f9DcuP#wWSgsKk9`FPui!#VoG^l|}sQ zB54Y%l5$Z0iBh>jQ>n(e<4I$g@`RkBmP#8PoB!-P((yX1iX*2vPQHLKYRf4y2N*ki z{gVKmi7*Urb$#vb{*8>E^$})yF5O_TSFb|?t3JRf*1**{otm7^{2}k9VVMmosR=X0 z^Z@1E0#ke(&5A)`)rb;;zG>tdR$s4&9>&&}MqjU-h<`0&Ox~oJK}$2Wx?-SPXbDe4 z%>8728VY8R;klC{YU*td z76XS?$thqkPC1IXn6JCxFYPAV4L@}CxgNrkYZcyl$GyvcKI3H6L_kNFgbslfkVpG8 z>P<4rH(OfLi%ZzRIXW#q26}w4KB3y|dw)~N(ip*tAwKQ6m^n(jUFGgB&99g^#Hw-G z_odj=NODm9+NE-4-q?*gdt>JKXjD65ixQrP8)sI$rU?l>dXkz{rI9m6mZs~RSQsw- zlQy0$+Hi)#%@d2x`_Xz{6Ob+v&dRSB{p^LzwsGOqL-DYNwNW8^i_gEkZ&41~8rI21DxxyAm#C8VESdf5GOStSxA zMc(I|;=R!8ikm7#g8`B325_^K!{JAZG4yZo2(O+-Y(3|zKnj0Y-Tb1Lt}e1BxtYNj z&J|gN+yiC-+D1qD)_VwU8y2Gql1#r~;&r$HT4a5^*-sRb!0(j04~CzgjN;`Y=%uf* zd1X4(#VMs~xMg>Z3VV-nXk*YBIRi($PDV41m!CI(ZVgrV!q0-DDvlE`p8WDVYvI~1 zi>O5gH)8b|$89eT_ZoodDxyXPOTCyQAr`j#6ioN=t;6)&@3?x|(L_a~#)uxr{9!9VpbMQlZ5(H2MHwliU?TYCvWSPQeYh-7z3~-2uLxrx=uB|z0 z6&U-eiUht%vZ71rG%nxHj>60i6AAF0HzPBoS=3f(5&|MtrzhtyGQGshWao+YX=%}n ztv(Y;ayyGLA0jTI*5WpG<~Dj*`lS<@;*%`Wp^SH)&ErlXFrmrV-WgY->XPa;^P?zZ zRCu+_^&5c}IV=%XL4LCJARZdDO}>{DG^%WUDA`M9wU-&BCMwq5yvc{MvmN?Fl0*io z>zD)C&+5ko7}qjG6QVgIYH5f&7hSg^U7fxavG`n?T~({%Ef8l*6(&4UC-P!lW;NQq z^PH~<_(Xf+O3N6j?v7s|e=kVb+jLJRkJb2-uk0x;P(aR~T^3N3f&n~EDg>Rfe`8tE zzWVK1F~l&)1Y~nr!5`gY&+5_6v?4rkk~NDClZieQh*wdAjDQa`3yttb`tHL{utMa&g;xVf{?J+@1s{F51NS> zxs5~;2`if3i4m-LtuO!SC%Okq3?0j{xh8OvGQ{T^#y3itkUL9;r?}}u0+(yN^eqYW>oF|7%vOBa+gZJnAg)`1{Q7A5a`YC@GDk7o7P5#^8+)}d{`GdugJ!O;bD`~?0 zo*wfbo5SKf=X)_7F+ztV$))2T~1;=m?I~!Y*&G4(;_Sz3rGnVaN$_4$< z+E(sg{NYxdKfUw_LG-D~;r3ClktKx6Z`by`vnDgDH~W~%ilR3`@i0Z(LRK+b zcFra8dO-2ZKK64XIU_!%^-fj`i?h?=Cc@r{#1F+UD2bFvL@6CUkYbH*__7d5yz$8_ zda(F>0Q4>!Nc<496^qH%ppDyuccTL@X^|OTF#m>$U{Q`Gc^N_ws5$sXEki6uF)$QQ zis)U9q6GuI{N|wLEkspW{75H7D{x?F2vrcLx3Ac|sY4nXr8tIzt!*DD?G=FSP7+5Y zw+twyJ#Hk}#+eMS-hWK@GtA4kH}AaCI^37BcR-jit@0Ytm^rA(l-Ky?lW9Xnz^|7? znby6feQMH>ok|}%#k)c6_~-Nw(dTCzlutI7Y@Ja2uy5> zU4ugAqU#r1`p3|EDdw!CAJ{OSf!oIJFR#9Pz+WLUikyklOtr88e|@{9xN1MXlJAc+Y$v zftQNRoi3CijnG;#z$&QAL9P$teADnLHRR^d?%bY};%i}Eo2QHAvZciOn<{;Z^=A_` zO7PG%^Ewff-i?kP9IFIRL8=orp1gB#W1f9mds8vTR3GmFMXVS2XsHgiEtI2f{S2YG zzzdyvwMx=Bxbq0Vrmf=S`_G4{Rtd@IJJ|gN5BYEFntbwBWk{l{rj?}3!`r%=^9yg_ zswUaWDz$!dOd)tZA+6+%*Xm3ZF&Hvg108NJ?S%0Unj7~o2`y?1f60vXK_m7NZMH)D z&RRTW4e_BZY%=bzX@mVn9dn;Pwq8<=3Wg%dogau`UD%%f3{_YzA7*B=Da{B`{4Mhq z-_NBhOW`PMRwDvK{-wB$%Z%od{3I8``pp9_zSF?(Ry=uvb(tE2XYP+>J}|0Y>~z(` zv0-0d)AIVe^j~P1p2>_A_}!d6bAq8GuTWf#y)d$0(wvK!qDZ{$q$BgP#eu+|{K794 zU2lr7nwQt!cYprV!2~rsBQ%6tR!2dSg5o~YK2!D^NH+seWrsrDUAU=Fwz$)#0tw$< zA4zBg$&qlJFB^%jr-#yd$B0SbFe4?_B1{dhR=n^7P}e8d*j=&}9C5i%d}+;W>jsDj zT`J!*G0PXKfAPJLs3~-bJMh4&)CCVdQAu)@5Y4h6E=OKH_1(lW;2Rcd4$VoTx!F7cpI-SKB z9j>lAwr2ygg$kLjThk*ij!gwwME*%{mjg5_9 z&=xqdtE;QKySu8Y3UpWnbN+*7YtU5{Ozb~DKMy*fg4Y2r0%k@9O*CL`|NZ@a(5wr3 zv4SqFAZtKgULJUbt*xzJzkY#6GmuT7sHg~}BmhIlL1)+F;}bBe>eSQ}m}eE7tY&9t zL3h?4KYoBr1i87npw}ztB?~&i_Vo0C?H3mp;G2Sq$e%xdKu_B1>+7wpLytFgsJPJ# zoFB4sI=|))L#UAiREY2GD*}?~`ldx)-J?s(`=ODYA>mC5>bc0|?xEqin!0gY$8XE7 z?tT3$3-1%Bpj2Q&pXvJgDIwAE?(SJD>v8{ppBOk(SzlMiCwB4+reGWg!y^k1fZo2}|JBkaF_N?S zA%QDS!YN+}*u|?X_xY?ZS|`Y@7I=#X1A-583eC->dn&giX&*!&d00Y^2!>z#ldhes zBtuitp%rso&2vj_+bkx!n2PpC>cJJWuhQCo>+Vy&Y_LkrwVi4B8mMHbmgz9w=A{hN zDBZ%cqEwNmy@`C`Q-BRoP}$$#uH%mC6=56a82HQ|!7d>ky^`}30kzHJ#R|hJAdw|( z2cekfCc?3&?_SI->OD5l3(Teqk7`6d|A{aZwJ6*A{r*zK=G#QARJFa@n7&~Q{;oTs z84ame_Rg27Fe=Uy?aS8`+m)&yZxPtTgjJX2k3_kT42oX?mAz{(s@?>cpk(C?K^UL^ z?4TmflGGS3Ushvd#CcrApE`D09lNHtn z{;N(=854VMCQ*5G^8ELE%4&3uk#FKXH`jdshn0*6Pp5ZAHS9jb*)Xqe? zb6#FsO<^tJ?>nFNoM52_S@tSC3n#eCIqgG7M}d(jQ aVqkz}lp|pJLT?csB-XHY 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 z

FsL+Ew{Fh~Q$NYTpm#p!;6%^2Tc5EGy?`mywEQG6gyKx?v5hRI@(Ch3s&%y&nm zjEgLuIX!56G=(R`;@l8q{cJ!kP5H+|xz#cxgboEMrq>iCt9|VN6;k&w-qeT-p^LQB z?2L*>6tI+wPYFd*st(HhB*SH+F*?8eQ?x9VkSSTO6Ha>V1*c!wM3l~=rrO6iL}E@L zS|Va3Sk)+#V>p_KHS=Re5)CI~gsPE|+H|t1B1P93iZy)C=You@Mdy9mK34wB47*V# zs1AF{gUdNFFV}8sh$DA~#Fd>nRH&{=y;FG>o2x{Q7 z!Ap$v+Xq|qbEydo9JP1G-$zuwtyY>%yJ&!umrdugEn!& z{#R(W6Yjfiu}1XkwSPNWO_9#Yn9pkN$6cz83bCs6jtQZ@aD?6tb0OJZkM2`^YoRO6 zN1n?T7OH6pp-J0ZS&e?ADTZ#9xC{qmm{!ALHy=-L*Af&a=oSPrCkB#Nd6s{V6h9Bm z@l0F7oqDyNt8lG5g;$@e*j4);XQ86?*|V9d`bJFg;o>QEY=&|SJAg)OS(CAM*Vl0) z5>#f(mx=yUGy;bBe?xPH|I!?givT1d0Bsi=Gk{|NlmR%_%?iXR{gr&s!9)+h7XWL( zp)pRDIX31&R;DHh%{NL)Aoc)YF@Vm1I0PUF0mwE0=nOzJfYj=!!Cxub{yLw6qL+pSfHDBkfbJkIt%&265kO~r zf72N!5O|Q^_>5Q~_BNrR zMX6T-V43%L!MaE`-=xD%;~F4DmhW3nJEhU;{ql40zo21J=pTl+{eF<37Ymb-Hz23p zCGgRg2T`kk))ODZa1<-9Z&&;jSHQg+BXOBogfD78|lRjz zM`+U3)edZFZbfIBWa6IwsIBRcDri!SWSYd{S~v+ zif|yPc?^4Z{u$!11c!?wEyPVW1Klthvc?Y_2m z372$v&`>1ZqUx#v)1!pGUQQ1mBE||EbkVubzDXfLm$VMA^MIjvV_^MwD*S>NZ?|~-{?2A{>)|?Pva6k8xCP;;n6fF_CyBND0M=WT|d*>H( zL0l#>?2GE=<>SB6Pde20c&TU=A#e0BcrBs2n}fb&2Li!KDJ59$E$pcNbQB_D!vnw0vdVtbb)oxN{U9gp`-i~<$}-4bMF7Ja;hrFfM~QN3r3_1S z8Zl=&bxvM&QmKs~^{-Q1CRP;Ui#fS#H{MK0)e44fky9cz+H9vbJb!Rz z#Piw1Zk@=hSMAUu(B;2!XnvYOccl_)hVWNO^W;G=r1o zke4}eJnQY%gh(pt6T2=YX4>Mk!I*;#`Pg>a62N$oNpN(IdZSmlqQ2MRv@c~b3EK{a z6xpk~lmyY!Xc#4Gt(t6VICBT3!kFT4u&p=!>A{*gw#iw=#u&N?qX{Qo4%;

6=z# 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 $aacDO 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

-

Disable logging on healthcheck

+Maximum wait timeout

-

By default, the API will add a log entry when the healthcheck endpoint is called.

+

By default, the value of the form field waitTimeout cannot be more than 30 seconds.

-

You may turn off this logging so as to avoid unnecessary entries in your logs with the environment variable DISABLE_HEALTHCHECK_LOGGING.

+

You may increase or decrease this limit thanks to the environment variable MAXIMUM_WAIT_TIMEOUT.

-

This environment variable operates in the same manner as the DISABLE_GOOGLE_CHROME and DISABLE_UNOCONV variables operate in that it accepts the strings "0" or "1" as values, where "1" is enabled.

+

It takes a string representation of a float as value (e.g "2.5" for 2.5 seconds).

-

Default listen port

+Default webhook URL timeout

-

By default, the API will listen on port 3000. For most use cases this is perfectly fine, but at times there may be cases where you need to change this due to port conflicts.

+

By default, the API will wait 10 seconds before it considers the sending of the resulting PDF to be unsuccessful.

-

You may customize this port location with the environment variable DEFAULT_LISTEN_PORT.

+
+

See the webhook section.

+
-

This environment variable accepts any string that can be turned into a port number (e.g., the string "0" up to the string "65535").

+

You may customize this timeout thanks to the environment variable DEFAULT_WEBHOOK_URL_TIMEOUT.

-

webhook timeout section.

+
+ +

Debug logging of process startup

+Maximum webhook URL timeout -

By default, stdout and stderr messages from the started processes are disabled.

+

By default, the value of the form field webhookURLTimeout cannot be more than 30 seconds.

-

You may enable some debug logging from starting the process by setting the environment variable DEBUG_PROCESS_STARTUP.

+

You may increase or decrease this limit thanks to the environment variable MAXIMUM_WEBHOOK_URL_TIMEOUT.

-

This environment variable operates in the same manner as the DISABLE_GOOGLE_CHROME and DISABLE_UNOCONV variables operate in that it accepts the strings "0" or "1" as values, where 1 means true.

+

It takes a string representation of a float as value (e.g "2.5" for 2.5 seconds).

+ +

Maximum wait delay

+ +

By default, the value of the form field waitDelay cannot be more than 10 seconds.

+ +
+

See the wait delay section.

+
+ +

You may increase or decrease this limit thanks to the environment variable MAXIMUM_WAIT_DELAY.

+ +

It takes a string representation of a float as value (e.g "2.5" for 2.5 seconds).

@@ -340,7 +390,7 @@ which will be converted to PDF.

Go -
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -422,7 +472,7 @@ Also, footer.html CSS properties override the ones from heade
 	
 Go
 
-
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -517,7 +567,7 @@ see to the fonts section.

Go -
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -583,7 +633,7 @@ $client->store($request, $dest);
 	
 Go
 
-
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -643,7 +693,7 @@ a lot on JavaScript for rendering.

Go -
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -712,7 +762,7 @@ If not, some of the content of the page might be hidden.

Go -
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -786,7 +836,7 @@ in the file index.html. This function will convert a given markdown
 	
 Go
 
-
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -869,7 +919,7 @@ See the scalability section to find how to mitigate t
 	
 Go
 
-
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -921,7 +971,7 @@ $client->store($request, $dest);
 	
 Go
 
-
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -956,7 +1006,7 @@ $client->store($request, $dest);
                 

Merge

-

Gotenberg provides the endpoint /convert/merge for merging PDFs.

+

Gotenberg provides the endpoint /merge for merging PDFs.

It accepts POST requests with a multipart/form-data Content-Type.

@@ -976,7 +1026,7 @@ will merge them and return the resulting PDF file.

cURL
$ curl --request POST \
-    --url http://localhost:3000/convert/merge \
+    --url http://localhost:3000/merge \
     --header 'Content-Type: multipart/form-data' \
     --form files=@file.pdf \
     --form files=@file2.pdf \
@@ -987,7 +1037,7 @@ will merge them and return the resulting PDF file.

Go -
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -1050,7 +1100,7 @@ $client->store($request, $dest);
 	
 Go
 
-
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -1109,7 +1159,7 @@ to given URL.

Go -
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -1132,6 +1182,67 @@ $index = DocumentFactory::makeFromPath('index.html', 'index.html'
 $request = new HTMLRequest($index);
 $request->setWebhookURL('http://myapp.com/webhook/');
 $resp = $client->post($request);
+
+ +

Timeout

+ +

If a webhookURL is provided, you may also send a form field named webhookURLTimeout.

+ +

The API will wait the given seconds before it considers the sending of the resulting PDF to be unsucessful.

+ +

It takes a float as value (e.g 2.5 for 2.5 seconds).

+ +
+

You may also define this value globally: see the environment variables section.

+
+ +

Examples

+ +

cURL

+ +
$ curl --request POST \
+    --url http://localhost:3000/convert/html \
+    --header 'Content-Type: multipart/form-data' \
+    --form files=@index.html \
+    --form webhookURL='http://myapp.com/webhook/' \
+    --form webhookURLTimeout=2.5
+
+ +

Go

+ +
import "github.com/thecodingmachine/gotenberg-go-client/v6"
+
+func main() {
+    c := &gotenberg.Client{Hostname: "http://localhost:3000"}
+    req, _ := gotenberg.NewHTMLRequest("index.html")
+    req.WebhookURL("http://myapp.com/webhook/")
+    req.WebhookURLTimeout(2.5)
+    resp, _ := c.Post(req)
+}
+
+ +

PHP

+ +
use TheCodingMachine\Gotenberg\Client;
+use TheCodingMachine\Gotenberg\DocumentFactory;
+use TheCodingMachine\Gotenberg\HTMLRequest;
+
+$client = new Client('http://localhost:3000', new \Http\Adapter\Guzzle6\Client());
+$index = DocumentFactory::makeFromPath('index.html', 'index.html');
+$request = new HTMLRequest($index);
+$request->setWebhookURL('http://myapp.com/webhook/');
+$request->setWebhookURLTimeout(2.5);
+$resp = $client->post($request);
 
@@ -1168,7 +1279,7 @@ Otherwise a random filename is used.

Go -
import "github.com/thecodingmachine/gotenberg-go-client/v5"
+
import "github.com/thecodingmachine/gotenberg-go-client/v6"
 
 func main() {
     c := &gotenberg.Client{Hostname: "http://localhost:3000"}
@@ -1211,7 +1322,7 @@ $resp = $client->post($request);
   # your others services
 
   gotenberg:
-    image: thecodingmachine/gotenberg:5
+    image: thecodingmachine/gotenberg:6
 

You may now launch your services using:

@@ -1238,6 +1349,33 @@ a simple GET request.

  • Configure Liveness and Readiness Probes
  • +

    If LOG_LEVEL is "DEBUG", it also returns details about the PM2 processes in JSON format. +For instance:

    + +
    [
    +    {
    +        "name": "google-chrome-stable",
    +        "pm2_env": {
    +            "status": "online"
    +        },
    +        "monit": {
    +            "memory": 73826304,
    +            "cpu": 0
    +        }
    +    },
    +    {
    +        "name": "unoconv",
    +        "pm2_env": {
    +            "status": "online"
    +        },
    +        "monit": {
    +            "memory": 70914048,
    +            "cpu": 0
    +        }
    +    }
    +]
    +
    +
    From 14ef3cf07c03c9301f9f72fdbe4b9df989a6f3fe Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Wed, 21 Aug 2019 11:38:50 +0200 Subject: [PATCH 070/107] fixing typo in main.go --- cmd/gotenberg/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 328ad8a9..800a8777 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -18,7 +18,7 @@ import ( var version = "snapshot" func main() { - const op = "main" + const op string = "main" config, err := conf.FromEnv() systemLogger := xlog.New(config.LogLevel(), "system") if err != nil { From a1b34d5e7b49bafb5b2da5232012b0652f3d3b1f Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Wed, 21 Aug 2019 15:28:34 +0200 Subject: [PATCH 071/107] adding 'restart_time' information about a process in ping endpoint if LOG_LEVEL=DEBUG --- build/docs/content/13-ping.md | 10 ++++++---- docs/index.html | 10 ++++++---- internal/pkg/pm2/pm2.go | 3 ++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/build/docs/content/13-ping.md b/build/docs/content/13-ping.md index 2d06f605..2039e682 100644 --- a/build/docs/content/13-ping.md +++ b/build/docs/content/13-ping.md @@ -18,20 +18,22 @@ For instance: { "name": "google-chrome-stable", "pm2_env": { - "status": "online" + "status": "online", + "restart_time": 0 }, "monit": { - "memory": 73826304, + "memory": 72294400, "cpu": 0 } }, { "name": "unoconv", "pm2_env": { - "status": "online" + "status": "online", + "restart_time": 0 }, "monit": { - "memory": 70914048, + "memory": 71000064, "cpu": 0 } } diff --git a/docs/index.html b/docs/index.html index 931fe869..02a53776 100755 --- a/docs/index.html +++ b/docs/index.html @@ -1356,20 +1356,22 @@ For instance:

    { "name": "google-chrome-stable", "pm2_env": { - "status": "online" + "status": "online", + "restart_time": 0 }, "monit": { - "memory": 73826304, + "memory": 72294400, "cpu": 0 } }, { "name": "unoconv", "pm2_env": { - "status": "online" + "status": "online", + "restart_time": 0 }, "monit": { - "memory": 70914048, + "memory": 71000064, "cpu": 0 } } diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go index d267259b..533dc0a9 100644 --- a/internal/pkg/pm2/pm2.go +++ b/internal/pkg/pm2/pm2.go @@ -41,7 +41,8 @@ of the command "pm2 jlist". type JListItem struct { Name string `json:"name"` PM2Env struct { - Status string `json:"status"` + Status string `json:"status"` + RestartTime int64 `json:"restart_time"` } `json:"pm2_env"` Monit struct { Memory int64 `json:"memory"` From fa94341b60a4363aeac2cd7648e1e8967626d49f Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Thu, 22 Aug 2019 09:45:12 +0200 Subject: [PATCH 072/107] updating to Libreoffice 6.3 @tiago-soczek --- build/base/Dockerfile | 12 +++++++----- go.mod | 17 ++++++++-------- go.sum | 45 +++++++++++++++++++++++++------------------ 3 files changed, 42 insertions(+), 32 deletions(-) diff --git a/build/base/Dockerfile b/build/base/Dockerfile index 1df68688..d074eb89 100644 --- a/build/base/Dockerfile +++ b/build/base/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:9-slim +FROM debian:buster-slim # |-------------------------------------------------------------------------- # | Common libraries @@ -7,7 +7,7 @@ FROM debian:9-slim # | Libraries used in the build process of this image. # | -RUN echo "deb http://httpredir.debian.org/debian/ stretch main contrib non-free" > /etc/apt/sources.list &&\ +RUN echo "deb http://httpredir.debian.org/debian/ buster main contrib non-free" > /etc/apt/sources.list &&\ apt-get update &&\ apt-get install -y curl wget python3-pip ttf-mscorefonts-installer @@ -19,7 +19,7 @@ RUN echo "deb http://httpredir.debian.org/debian/ stretch main contrib non-free" # | recovering. In our case: Google Chrome (headless) and unoconv. # | -RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - &&\ +RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - &&\ apt-get install -y nodejs &&\ npm install -g pm2 @@ -45,7 +45,9 @@ RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add RUN pip3 install unoconv &&\ # https://github.com/nextcloud/docker/issues/380 mkdir -p /usr/share/man/man1mkdir -p /usr/share/man/man1 &&\ - apt-get -y install libreoffice + echo "deb http://httpredir.debian.org/debian/ buster-backports main contrib non-free" >> /etc/apt/sources.list &&\ + apt-get update &&\ + apt-get -t buster-backports -y install libreoffice # |-------------------------------------------------------------------------- # | PDFtk @@ -83,7 +85,7 @@ RUN apt-get install -y \ fonts-sil-padauk \ fonts-telu \ fonts-thai-tlwg \ - ttf-liberation \ + fonts-liberation \ ttf-wqy-zenhei \ fonts-arphic-uming \ fonts-ipafont-mincho \ diff --git a/go.mod b/go.mod index 7fc1e345..b46352c2 100644 --- a/go.mod +++ b/go.mod @@ -3,21 +3,22 @@ module github.com/thecodingmachine/gotenberg go 1.12 require ( - github.com/google/go-cmp v0.3.0 // indirect + github.com/google/go-cmp v0.3.1 // indirect github.com/gorilla/websocket v1.4.0 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect - github.com/labstack/echo/v4 v4.1.6 - github.com/labstack/gommon v0.2.9 + github.com/kr/pretty v0.1.0 // indirect + github.com/labstack/echo/v4 v4.1.10 + github.com/labstack/gommon v0.3.0 github.com/mafredri/cdp v0.24.2 - github.com/mattn/go-isatty v0.0.8 + github.com/mattn/go-isatty v0.0.9 github.com/microcosm-cc/bluemonday v1.0.2 github.com/russross/blackfriday/v2 v2.0.1 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/sirupsen/logrus v1.4.2 - github.com/stretchr/testify v1.3.0 - golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 // indirect - golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 // indirect + github.com/stretchr/testify v1.4.0 + golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 // indirect + golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 // indirect golang.org/x/sync v0.0.0-20190423024810-112230192c58 - golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect golang.org/x/text v0.3.2 + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect ) diff --git a/go.sum b/go.sum index 2320b7ff..3db58652 100644 --- a/go.sum +++ b/go.sum @@ -3,24 +3,31 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/labstack/echo/v4 v4.1.6 h1:WOvLa4T1KzWCRpANwz0HGgWDelXSSGwIKtKBbFdHTv4= -github.com/labstack/echo/v4 v4.1.6/go.mod h1:kU/7PwzgNxZH4das4XNsSpBSOD09XIF5YEPzjpkGnGE= -github.com/labstack/gommon v0.2.9 h1:heVeuAYtevIQVYkGj6A41dtfT91LrvFG220lavpWhrU= -github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/labstack/echo/v4 v4.1.10 h1:/yhIpO50CBInUbE/nHJtGIyhBv0dJe2cDAYxc3V3uMo= +github.com/labstack/echo/v4 v4.1.10/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/mafredri/cdp v0.24.2 h1:Rzhj/EQw9opbiwUpNML7P+4Hvf0/nSYPaDbiCEpILOM= github.com/mafredri/cdp v0.24.2/go.mod h1:hgdiA0yp1uqhSaDOHJWPgXpMbh+LAfUdD9vbN2AM8gE= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -33,36 +40,36 @@ github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190607181551-461777fb6f67/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190609082536-301114b31cce/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 h1:LepdCS8Gf/MVejFIt8lsiexZATdoGVyp5bcyS+rYoUI= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190608022120-eacb66d2a7c3/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 7cff2e01a4ece38bfa2e1e174fc1493af40ca239 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 26 Aug 2019 10:22:39 +0200 Subject: [PATCH 073/107] reducing memory footprint --- internal/pkg/printer/chrome.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/internal/pkg/printer/chrome.go b/internal/pkg/printer/chrome.go index 61b6911c..8003a7cd 100644 --- a/internal/pkg/printer/chrome.go +++ b/internal/pkg/printer/chrome.go @@ -83,6 +83,15 @@ func (p chromePrinter) Print(destination string) error { if err != nil { return err } + /* + close the browser context when done. + we're not using the "default" context + as it may timeout before actually closing + the browser context. + see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 + */ + disposeBrowserContextArgs := target.NewDisposeBrowserContextArgs(newContextTarget.BrowserContextID) + defer devtClient.Target.DisposeBrowserContext(context.Background(), disposeBrowserContextArgs) // nolint: errcheck // create a new blank target with the new browser context. createTargetArgs := target. NewCreateTargetArgs("about:blank"). @@ -101,8 +110,14 @@ func (p chromePrinter) Print(destination string) error { // create a new CDP Client that uses newContextConn. targetClient := cdp.NewClient(newContextConn) closeTargetArgs := target.NewCloseTargetArgs(newTarget.TargetID) - // close the target when done. - defer targetClient.Target.CloseTarget(ctx, closeTargetArgs) // nolint: errcheck + /* + close the target when done. + we're not using the "default" context + as it may timeout before actually closing + the target. + see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 + */ + defer targetClient.Target.CloseTarget(context.Background(), closeTargetArgs) // nolint: errcheck // enable all events. if err := p.enableEvents(ctx, targetClient); err != nil { return err From 30eb48321c6aaa56a23385024292f9f9879fd5fb Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 26 Aug 2019 11:20:16 +0200 Subject: [PATCH 074/107] reordering code --- internal/pkg/printer/chrome.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/pkg/printer/chrome.go b/internal/pkg/printer/chrome.go index 8003a7cd..75b62db7 100644 --- a/internal/pkg/printer/chrome.go +++ b/internal/pkg/printer/chrome.go @@ -109,7 +109,6 @@ func (p chromePrinter) Print(destination string) error { defer newContextConn.Close() // nolint: errcheck // create a new CDP Client that uses newContextConn. targetClient := cdp.NewClient(newContextConn) - closeTargetArgs := target.NewCloseTargetArgs(newTarget.TargetID) /* close the target when done. we're not using the "default" context @@ -117,6 +116,7 @@ func (p chromePrinter) Print(destination string) error { the target. see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 */ + closeTargetArgs := target.NewCloseTargetArgs(newTarget.TargetID) defer targetClient.Target.CloseTarget(context.Background(), closeTargetArgs) // nolint: errcheck // enable all events. if err := p.enableEvents(ctx, targetClient); err != nil { From 8415bee5da8c4238293fd22d17d286100e3177be Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 27 Aug 2019 09:08:00 +0200 Subject: [PATCH 075/107] reducing the number of concurrent dev tools connections to Chrome --- internal/pkg/printer/chrome.go | 45 +++++++++++++++++++++++++++++++--- internal/pkg/printer/office.go | 8 +++--- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/internal/pkg/printer/chrome.go b/internal/pkg/printer/chrome.go index 75b62db7..aff21e75 100644 --- a/internal/pkg/printer/chrome.go +++ b/internal/pkg/printer/chrome.go @@ -61,6 +61,14 @@ func DefaultChromePrinterOptions(config conf.Config) ChromePrinterOptions { } } +// nolint: gochecknoglobals +var lockChrome = make(chan struct{}, 1) + +const maxDevtConnections int = 5 + +// nolint: gochecknoglobals +var devtConnections int + func (p chromePrinter) Print(destination string) error { const op string = "printer.chromePrinter.Print" logOptions(p.logger, p.opts) @@ -158,13 +166,44 @@ func (p chromePrinter) Print(destination string) error { } return nil } - if err := resolver(); err != nil { + if devtConnections < maxDevtConnections { + p.logger.DebugOp(op, "skipping lock acquisition...") + devtConnections++ + err := resolver() + devtConnections-- + if err != nil { + return xcontext.MustHandleError( + ctx, + xerror.New(op, err), + ) + } + return nil + } + p.logger.DebugOp(op, "waiting lock to be acquired...") + select { + case lockChrome <- struct{}{}: + // lock acquired. + p.logger.DebugOp(op, "lock acquired") + devtConnections++ + err := resolver() + devtConnections-- + <-lockChrome // we release the lock. + if err != nil { + return xcontext.MustHandleError( + ctx, + xerror.New(op, err), + ) + } + return nil + case <-ctx.Done(): + // failed to acquire lock before + // deadline. + p.logger.DebugOp(op, "failed to acquire lock before context.Context deadline") return xcontext.MustHandleError( ctx, - xerror.New(op, err), + ctx.Err(), ) } - return nil } func (p chromePrinter) enableEvents(ctx context.Context, client *cdp.Client) error { diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index b73a6c13..34ebdcb4 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -88,7 +88,7 @@ func (p officePrinter) Print(destination string) error { } // nolint: gochecknoglobals -var lock = make(chan struct{}, 1) +var lockUnoconv = make(chan struct{}, 1) func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, opts OfficePrinterOptions) error { const op string = "printer.unoconv" @@ -115,14 +115,14 @@ func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, } logger.DebugOp(op, "waiting lock to be acquired...") select { - case lock <- struct{}{}: + case lockUnoconv <- struct{}{}: // lock acquired. logger.DebugOp(op, "lock acquired") if err := resolver(); err != nil { - <-lock // we release the lock. + <-lockUnoconv // we release the lock. return xerror.New(op, err) } - <-lock // we release the lock. + <-lockUnoconv // we release the lock. return nil case <-ctx.Done(): // failed to acquire lock before From 8287cf386b89476fccd74c36b92b89b0a9d5ca67 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 27 Aug 2019 11:00:26 +0200 Subject: [PATCH 076/107] improving documentation on timeout issues --- .../docs/content/03-environment-variables.md | 1 + build/docs/content/04-html.md | 7 ++++ build/docs/content/07-office.md | 11 +++-- build/docs/content/09-timeout.md | 1 + build/docs/content/13-ping.md | 7 +--- build/docs/content/14-fonts.md | 2 +- docs/index.html | 41 +++++++++++++------ 7 files changed, 48 insertions(+), 22 deletions(-) diff --git a/build/docs/content/03-environment-variables.md b/build/docs/content/03-environment-variables.md index 0aedc995..ff1f8289 100644 --- a/build/docs/content/03-environment-variables.md +++ b/build/docs/content/03-environment-variables.md @@ -42,6 +42,7 @@ You may also disable LibreOffice (unoconv) with `DISABLE_UNOCONV`. ## Default wait timeout By default, the API will wait 10 seconds before it considers the conversion to be unsuccessful. +If unsucessful, it returns a `504` HTTP code. You may customize this timeout thanks to the environment variable `DEFAULT_WAIT_TIMEOUT`. diff --git a/build/docs/content/04-html.md b/build/docs/content/04-html.md index 8f1e5070..be116af8 100644 --- a/build/docs/content/04-html.md +++ b/build/docs/content/04-html.md @@ -6,6 +6,13 @@ Gotenberg provides the endpoint `/convert/html` for HTML conversions. It accepts `POST` requests with a `multipart/form-data` Content-Type. +> **Attention:** currently, Google Chrome headless misbehaves if there are too many concurrent conversions. +> That's why for HTML, [URL](#url) and [Markdown](#markdown) conversions, the API does only 6 conversions at a time. +> The more concurrent requests, the more `504` HTTP codes the API will return. +> +> See the [scalability section](#scalability) to find how to mitigate this issue. +> You may also take a look at the [timeout section](#timeout). + ## Basic The only requirement is to send a file named `index.html`: it is the file diff --git a/build/docs/content/07-office.md b/build/docs/content/07-office.md index 3a2f7fbd..aff49807 100644 --- a/build/docs/content/07-office.md +++ b/build/docs/content/07-office.md @@ -6,6 +6,13 @@ Gotenberg provides the endpoint `/convert/office` for Office document conversion It accepts `POST` requests with a `multipart/form-data` Content-Type. +> **Attention:** currently, `unoconv` cannot perform concurrent conversions. +> That's why for Office conversions, the API does only one conversion at a time. +> The more concurrent requests, the more `504` HTTP codes the API will return. +> +> See the [scalability section](#scalability) to find how to mitigate this issue. +> You may also take a look at the [timeout section](#timeout). + ## Basic You may send one or more Office documents. Following file extensions are accepted: @@ -25,9 +32,7 @@ You may send one or more Office documents. Following file extensions are accepte All files will be merged into a single resulting PDF. -> **Attention:** currently, `unoconv` cannot perform concurrent conversions. -> That's why for Office conversions, the API does only one conversion at a time. -> See the [scalability section](#scalability) to find how to mitigate this issue. +> **Attention:** Gotenberg merges the PDF files alphabetically. ### cURL diff --git a/build/docs/content/09-timeout.md b/build/docs/content/09-timeout.md index a97ee0fd..3835b99c 100644 --- a/build/docs/content/09-timeout.md +++ b/build/docs/content/09-timeout.md @@ -5,6 +5,7 @@ title: Timeout All endpoints accept a form field named `waitTimeout`. The API will wait the given **seconds** before it considers the conversion to be unsucessful. +If unsucessful, it returns a `504` HTTP code. It takes a float as value (e.g `2.5` for 2.5 seconds). diff --git a/build/docs/content/13-ping.md b/build/docs/content/13-ping.md index 2039e682..669a972e 100644 --- a/build/docs/content/13-ping.md +++ b/build/docs/content/13-ping.md @@ -5,11 +5,6 @@ title: Ping Gotenberg provides the endpoint `/ping` for checking the API availability with a simple `GET` request. -This feature is especially useful for liveness/readiness probes in Kubernetes: - -* [Pod lifecycle](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes) -* [Configure Liveness and Readiness Probes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/) - If `LOG_LEVEL` is `"DEBUG"`, it also returns details about the PM2 processes in JSON format. For instance: @@ -39,3 +34,5 @@ For instance: } ] ``` + +> if `LOG_LEVEL` is NOT `"DEBUG"`, no log entries are written. \ No newline at end of file diff --git a/build/docs/content/14-fonts.md b/build/docs/content/14-fonts.md index fa120864..752eedf9 100644 --- a/build/docs/content/14-fonts.md +++ b/build/docs/content/14-fonts.md @@ -7,7 +7,7 @@ By default, a handful of fonts are installed. Asian characters are also supporte If you wish to use more fonts, you will have to create your own image: ```Dockerfile -FROM thecodingmachine/gotenberg:5 +FROM thecodingmachine/gotenberg:6 RUN apt-get -y install yourfonts ``` \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 02a53776..721636d3 100755 --- a/docs/index.html +++ b/docs/index.html @@ -280,7 +280,8 @@ about what’s going on.

    Default wait timeout -

    By default, the API will wait 10 seconds before it considers the conversion to be unsuccessful.

    +

    By default, the API will wait 10 seconds before it considers the conversion to be unsuccessful. +If unsucessful, it returns a 504 HTTP code.

    You may customize this timeout thanks to the environment variable DEFAULT_WAIT_TIMEOUT.

    @@ -354,6 +355,15 @@ See the webhook timeout section.

    It accepts POST requests with a multipart/form-data Content-Type.

    +
    +

    Attention: currently, Google Chrome headless misbehaves if there are too many concurrent conversions. +That’s why for HTML, URL and Markdown conversions, the API does only 6 conversions at a time. +The more concurrent requests, the more 504 HTTP codes the API will return.

    + +

    See the scalability section to find how to mitigate this issue. +You may also take a look at the timeout section.

    +
    +

    Basic

    @@ -874,6 +884,15 @@ $client->store($request, $dest);

    It accepts POST requests with a multipart/form-data Content-Type.

    +
    +

    Attention: currently, unoconv cannot perform concurrent conversions. +That’s why for Office conversions, the API does only one conversion at a time. +The more concurrent requests, the more 504 HTTP codes the API will return.

    + +

    See the scalability section to find how to mitigate this issue. +You may also take a look at the timeout section.

    +
    +

    Basic

    @@ -898,9 +917,7 @@ $client->store($request, $dest);

    All files will be merged into a single resulting PDF.

    -

    Attention: currently, unoconv cannot perform concurrent conversions. -That’s why for Office conversions, the API does only one conversion at a time. -See the scalability section to find how to mitigate this issue.

    +

    Attention: Gotenberg merges the PDF files alphabetically.

    Timeout

    All endpoints accept a form field named waitTimeout.

    -

    The API will wait the given seconds before it considers the conversion to be unsucessful.

    +

    The API will wait the given seconds before it considers the conversion to be unsucessful. +If unsucessful, it returns a 504 HTTP code.

    It takes a float as value (e.g 2.5 for 2.5 seconds).

    @@ -1342,13 +1360,6 @@ redirect a request to a Gotenberg container according to the round-robin strateg

    Gotenberg provides the endpoint /ping for checking the API availability with a simple GET request.

    -

    This feature is especially useful for liveness/readiness probes in Kubernetes:

    - - -

    If LOG_LEVEL is "DEBUG", it also returns details about the PM2 processes in JSON format. For instance:

    @@ -1378,6 +1389,10 @@ For instance:

    ]
    +
    +

    if LOG_LEVEL is NOT "DEBUG", no log entries are written.

    +
    +
    @@ -1388,7 +1403,7 @@ For instance:

    If you wish to use more fonts, you will have to create your own image:

    -
    FROM thecodingmachine/gotenberg:5
    +
    FROM thecodingmachine/gotenberg:6
     
     RUN apt-get -y install yourfonts
     
    From fcd0feb7f680c2ea56e2e36e83a1d4ff5836cd46 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 27 Aug 2019 11:02:03 +0200 Subject: [PATCH 077/107] adding back Travis as GitHub actions are not yet ready --- .travis.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..c832bdc7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,23 @@ +sudo: required + +language: generic + +services: + - docker + +env: + global: + - secure: d6pliM7iR7KJ3TQkr1C0tHi0HgU6Vdmc/ycw11XrXs794/dgj6g9UDrhgcvT2mTzOVIUNouHx7gyEWAlwJv7p8PPyguHJfIsyqMWfaXNPoytTx1ETUiygl1G/UsvXVdry6I5tZF/U+/PJ3hBXoAvo8EOFe0/MxxvP3ghCeeCpeEwEdoYP2jbADGffywVUNI7OEdmS29A28GusXXp2cWCIZYSq5Gn5iu1ZMPaJA6SkRTXpS+iVVLUvlbz5HW09ETFfurTvsdz5Ze4JICiuQt///CR1uwdxD8K7Ils/mkenaMtja9NHA9RdQBa51Azn8iCLsObCTYc52Zb6atbCi/X4ae9M8GA8qaaLigNz5G4v1BHneJylYfWKj5GwqUA3VmRu1mlEw7d2sN2uFRmgIl5kgsYYyOVOLBOKaJWhyBhNnR4U8KeqwUkOnlSdmNZnjfexXXBEcKHen1SozpXwMnzZh8LZuN6BNYd6TVpKmjulGI3vqNMM0c4JJZ9pSm4q5FjbNGQArwCsujDDwY4bCGZSJJTPMXjYOrx4yJ1RY+0TpyV9oDU3ogEqaWnhrkgrphfiYBlDY2bEvrxMTMukLCxJb0Nru6LGCpg4X1P9hu9r0gceqUSnBgdJI4rYTNddenxlEd4j/Thqv835stJWz6YoV+rfvERuSUpntl8xvrk3U8= + - secure: CmLh169xwt3OC7l19lDUwdZYfw+l/+XXKjTGxnuJiXHa9hAH+nc4mEUSmqHMHwjquyYE6LnSVGZ94LH8sCaGed/TMm0Lj3DZtZ0VsjYu3sKsNrVJn5WdYEah+GvNJ8i8uzvHnGk1L2fAagLpXFUB2K9UraA1CFiHs1fF5Fua7Ra0mE7lMz0MFvyvzcmc9u8nMz71K2YVsXqn+I/rv8onJCTtc/Ds0hVrBXwG5Fh0T3xHqjOhME9ZI2hRHnnQVdBojSY3USifQ//qAKowfBVc0pebEtgFpyXx/I17A6xCm0KVtnA2tNqu1+XFkjWaBzryaLE9ujhJcTRC/YK0JUZ+QxfYbD5C7jVy9Jlx1lOEjJ42B/ImNxPP+9p3wi2MWNbcbZJPxIe635fnT17lI7CLK2Qg1xjfTQ4WTEKW5IhnYMiyfRKiripFh4PCkDm8cJlTbpntsX1n0uheydbsgf/11vS7o1WGhVQ8+Jelc4DvIbBHCqienQEOLJDBwm7FiK5JbwZJ6ZAGeDM/IhGU1h9PNjVbHUyJhUxYoPYUE9QsZFT7ENCrRQpq49KOzXBRfffyJNJRh+Ep9X5YoW0dUp0MNu5B7z2+6w9X9n/C+loa11xF42bFzniCvvbSOQ37J+EngDinVxJkNPeyivR4fye2ENhIAjAEjouTJLOSXL9nAOU= + +stages: + - tests + - publish + +jobs: + include: + - stage: tests + script: make lint tests + - stage: publish + if: tag IS present + script: make publish VERSION=$TRAVIS_TAG DOCKER_USER=$DOCKER_USER DOCKER_PASSWORD=$DOCKER_PASS \ No newline at end of file From f8b63d487aaa6051243ae6b3eee1410f067be7ea Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 27 Aug 2019 11:03:26 +0200 Subject: [PATCH 078/107] adding back travis CI badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 210d83b3..f2bfc700 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ to learn how to interact with it! ## Badges [![Docker image layers](https://images.microbadger.com/badges/image/thecodingmachine/gotenberg:6.svg)](https://microbadger.com/images/thecodingmachine/gotenberg:6) -[![Actions Status](https://github.com/thecodingmachine/gotenberg/workflows/Push/badge.svg)](https://github.com/thecodingmachine/gotenberg/actions) +[![Travis CI](https://travis-ci.org/thecodingmachine/gotenberg.svg?branch=master)](https://travis-ci.org/thecodingmachine/gotenberg) [![GoDoc](https://godoc.org/github.com/thecodingmachine/gotenberg?status.svg)](https://godoc.org/github.com/thecodingmachine/gotenberg) [![Codecov](https://codecov.io/gh/thecodingmachine/gotenberg/branch/master/graph/badge.svg)](https://codecov.io/gh/thecodingmachine/gotenberg) [![Go Report Card](https://goreportcard.com/badge/github.com/thecodingmachine/gotenberg)](https://goreportcard.com/report/thecodingmachine/gotenberg) From dd2542dcd613ad2e98783b153bc46427f03c28a9 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 27 Aug 2019 11:07:05 +0200 Subject: [PATCH 079/107] updating Travis and GitHub Actions workflows --- .github/workflows/push.yml | 6 +++--- .travis.yml | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 90591c3a..2060325a 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -7,6 +7,6 @@ jobs: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v1 - - run: make lint - - run: make tests CODE_COVERAGE=1 - - run: bash <(curl -s https://codecov.io/bash) -t ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file + #- run: make lint + #- run: make tests CODE_COVERAGE=1 + #- run: bash <(curl -s https://codecov.io/bash) -t ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index c832bdc7..2c3a2d57 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,10 @@ stages: jobs: include: - stage: tests - script: make lint tests + script: + - make lint + - make tests CODE_COVERAGE=1 + - bash <(curl -s https://codecov.io/bash) - stage: publish if: tag IS present script: make publish VERSION=$TRAVIS_TAG DOCKER_USER=$DOCKER_USER DOCKER_PASSWORD=$DOCKER_PASS \ No newline at end of file From 767b61a3bb9d863c730ae2151ac748ac0fd5e349 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 27 Aug 2019 11:11:40 +0200 Subject: [PATCH 080/107] typos in documentation --- build/docs/content/03-environment-variables.md | 3 ++- build/docs/content/04-html.md | 2 +- build/docs/content/13-ping.md | 2 +- docs/index.html | 7 ++++--- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/build/docs/content/03-environment-variables.md b/build/docs/content/03-environment-variables.md index ff1f8289..7e3c6b97 100644 --- a/build/docs/content/03-environment-variables.md +++ b/build/docs/content/03-environment-variables.md @@ -25,7 +25,8 @@ This environment variable accepts any string that can be turned into a port numb ## Disable Google Chrome -In order to save some resources, the Gotenberg image accepts the environment variable `DISABLE_GOOGLE_CHROME`. +In order to save some resources, the Gotenberg image accepts the environment variable `DISABLE_GOOGLE_CHROME` +for disabling Google Chrome. It takes the strings `"0"` or `"1"` as value where `1` means `true` diff --git a/build/docs/content/04-html.md b/build/docs/content/04-html.md index be116af8..05cd7f5b 100644 --- a/build/docs/content/04-html.md +++ b/build/docs/content/04-html.md @@ -6,7 +6,7 @@ Gotenberg provides the endpoint `/convert/html` for HTML conversions. It accepts `POST` requests with a `multipart/form-data` Content-Type. -> **Attention:** currently, Google Chrome headless misbehaves if there are too many concurrent conversions. +> **Attention:** currently, Google Chrome misbehaves if there are too many concurrent conversions. > That's why for HTML, [URL](#url) and [Markdown](#markdown) conversions, the API does only 6 conversions at a time. > The more concurrent requests, the more `504` HTTP codes the API will return. > diff --git a/build/docs/content/13-ping.md b/build/docs/content/13-ping.md index 669a972e..3da6ea70 100644 --- a/build/docs/content/13-ping.md +++ b/build/docs/content/13-ping.md @@ -35,4 +35,4 @@ For instance: ] ``` -> if `LOG_LEVEL` is NOT `"DEBUG"`, no log entries are written. \ No newline at end of file +> if `LOG_LEVEL` is **not** `"DEBUG"`, no log entries are written. \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 721636d3..7036fb32 100755 --- a/docs/index.html +++ b/docs/index.html @@ -256,7 +256,8 @@ about what’s going on.

    Disable Google Chrome -

    In order to save some resources, the Gotenberg image accepts the environment variable DISABLE_GOOGLE_CHROME.

    +

    In order to save some resources, the Gotenberg image accepts the environment variable DISABLE_GOOGLE_CHROME +for disabling Google Chrome.

    It takes the strings "0" or "1" as value where 1 means true

    @@ -356,7 +357,7 @@ See the webhook timeout section.

    It accepts POST requests with a multipart/form-data Content-Type.

    -

    Attention: currently, Google Chrome headless misbehaves if there are too many concurrent conversions. +

    Attention: currently, Google Chrome misbehaves if there are too many concurrent conversions. That’s why for HTML, URL and Markdown conversions, the API does only 6 conversions at a time. The more concurrent requests, the more 504 HTTP codes the API will return.

    @@ -1390,7 +1391,7 @@ For instance:

    -

    if LOG_LEVEL is NOT "DEBUG", no log entries are written.

    +

    if LOG_LEVEL is not "DEBUG", no log entries are written.

    From 438fd7d825f7d6bf3da78d01bc80ce9042e0f50f Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 27 Aug 2019 11:20:25 +0200 Subject: [PATCH 081/107] fixing CI permissions with coverage file --- scripts/tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/tests.sh b/scripts/tests.sh index b3f0170e..3824cc6d 100755 --- a/scripts/tests.sh +++ b/scripts/tests.sh @@ -6,6 +6,7 @@ DOCKER_REPOSITORY="$1" CODE_COVERAGE="$2" touch "$PWD/coverage.txt" +chmod 777 "$PWD/coverage.txt" docker build -t "$DOCKER_REPOSITORY/gotenberg:tests" -f build/tests/Dockerfile . if [ "$CODE_COVERAGE" = "1" ]; then From 36847e6a065e2bfde31571b447e182b922707eaa Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 27 Aug 2019 16:50:27 +0200 Subject: [PATCH 082/107] fixing wrong status code if alreay echo http error --- internal/app/xhttp/middleware.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/app/xhttp/middleware.go b/internal/app/xhttp/middleware.go index 456a7cd2..4c6f2262 100644 --- a/internal/app/xhttp/middleware.go +++ b/internal/app/xhttp/middleware.go @@ -111,6 +111,8 @@ func doErr(ctx context.Context, err error) error { // if it's an error from echo // like 404 not found and so on. if echoHTTPErr, ok := err.(*echo.HTTPError); ok { + // required to have a correct status code. + ctx.Error(echoHTTPErr) return echoHTTPErr } // we log the initial error before returning From c5429f7efa4e6541cd82449824d321723fbc3c3e Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 27 Aug 2019 16:51:03 +0200 Subject: [PATCH 083/107] test: removing unoconv listener as soffice in server mode has a memory leak --- cmd/gotenberg/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 800a8777..3ffb2696 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -31,9 +31,9 @@ func main() { if !config.DisableGoogleChrome() { processes = append(processes, pm2.NewChromeProcess(systemLogger)) } - if !config.DisableUnoconv() { + /*if !config.DisableUnoconv() { processes = append(processes, pm2.NewUnoconvProcess(systemLogger)) - } + }*/ for _, p := range processes { systemLogger.InfofOp(op, "starting '%s' with PM2...", p.Fullname()) if err := p.Start(); err != nil { From 171f93662f749a8689922ff61dbe0a227f07e059 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Thu, 19 Sep 2019 17:28:29 +0200 Subject: [PATCH 084/107] process load balancing: broken but in progress --- Makefile | 2 +- README.md | 2 +- build/docs/content/00-introduction.md | 2 +- cmd/gotenberg/main.go | 40 +-- internal/app/xhttp/handler.go | 102 +++++-- internal/app/xhttp/handler_test.go | 28 +- internal/app/xhttp/middleware.go | 12 +- internal/app/xhttp/option.go | 53 ++-- internal/app/xhttp/pkg/context/context.go | 69 ++++- internal/app/xhttp/pkg/resource/arg.go | 28 ++ internal/app/xhttp/xhttp.go | 12 +- internal/app/xhttp/xhttp_test.go | 9 +- internal/pkg/prinery/doc.go | 1 + internal/pkg/prinery/prinery.go | 123 ++++++++ internal/pkg/print/chrome.go | 265 ++++++++++++++++++ internal/pkg/print/doc.go | 1 + internal/pkg/print/html.go | 18 ++ internal/pkg/print/markdown.go | 70 +++++ internal/pkg/print/merge.go | 44 +++ internal/pkg/print/office.go | 109 ++++++++ internal/pkg/print/print.go | 13 + internal/pkg/print/url.go | 15 + internal/pkg/process/chrome.go | 106 +++++++ internal/pkg/process/doc.go | 1 + internal/pkg/process/pm2.go | 324 ++++++++++++++++++++++ internal/pkg/process/process.go | 40 +++ internal/pkg/process/soffice.go | 74 +++++ internal/pkg/xerrgroup/doc.go | 6 + internal/pkg/xerrgroup/xerrgroup.go | 20 ++ loadtesting/README.md | 113 ++++++++ loadtesting/html.js | 44 +++ loadtesting/merge.js | 18 ++ loadtesting/office.js | 34 +++ 33 files changed, 1681 insertions(+), 117 deletions(-) create mode 100644 internal/pkg/prinery/doc.go create mode 100644 internal/pkg/prinery/prinery.go create mode 100644 internal/pkg/print/chrome.go create mode 100644 internal/pkg/print/doc.go create mode 100644 internal/pkg/print/html.go create mode 100644 internal/pkg/print/markdown.go create mode 100644 internal/pkg/print/merge.go create mode 100644 internal/pkg/print/office.go create mode 100644 internal/pkg/print/print.go create mode 100644 internal/pkg/print/url.go create mode 100644 internal/pkg/process/chrome.go create mode 100644 internal/pkg/process/doc.go create mode 100644 internal/pkg/process/pm2.go create mode 100644 internal/pkg/process/process.go create mode 100644 internal/pkg/process/soffice.go create mode 100644 internal/pkg/xerrgroup/doc.go create mode 100644 internal/pkg/xerrgroup/xerrgroup.go create mode 100644 loadtesting/README.md create mode 100644 loadtesting/html.js create mode 100644 loadtesting/merge.js create mode 100644 loadtesting/office.js diff --git a/Makefile b/Makefile index 85ec5f69..ac5afacd 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,7 @@ image: # start the API using previously built Docker image. gotenberg: - docker run -it --rm -e MAXIMUM_WAIT_TIMEOUT=$(MAXIMUM_WAIT_TIMEOUT) -e MAXIMUM_WAIT_DELAY=$(MAXIMUM_WAIT_DELAY) -e MAXIMUM_WEBHOOK_URL_TIMEOUT=$(MAXIMUM_WEBHOOK_URL_TIMEOUT) -e DEFAULT_WEBHOOK_URL_TIMEOUT=$(DEFAULT_WEBHOOK_URL_TIMEOUT) -e MAXIMUM_WEBHOOK_URL_TIMEOUT=$(MAXIMUM_WEBHOOK_URL_TIMEOUT) -e DEFAULT_LISTEN_PORT=$(DEFAULT_LISTEN_PORT) -e DISABLE_GOOGLE_CHROME=$(DISABLE_GOOGLE_CHROME) -e DISABLE_UNOCONV=$(DISABLE_UNOCONV) -e LOG_LEVEL=$(LOG_LEVEL) -p "3000:$(DEFAULT_LISTEN_PORT)" $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) + docker run -it --rm -e MAXIMUM_WAIT_TIMEOUT=$(MAXIMUM_WAIT_TIMEOUT) -e MAXIMUM_WAIT_DELAY=$(MAXIMUM_WAIT_DELAY) -e MAXIMUM_WEBHOOK_URL_TIMEOUT=$(MAXIMUM_WEBHOOK_URL_TIMEOUT) -e DEFAULT_WEBHOOK_URL_TIMEOUT=$(DEFAULT_WEBHOOK_URL_TIMEOUT) -e MAXIMUM_WEBHOOK_URL_TIMEOUT=$(MAXIMUM_WEBHOOK_URL_TIMEOUT) -e DEFAULT_LISTEN_PORT=$(DEFAULT_LISTEN_PORT) -e DISABLE_GOOGLE_CHROME=$(DISABLE_GOOGLE_CHROME) -e DISABLE_UNOCONV=$(DISABLE_UNOCONV) -e LOG_LEVEL=$(LOG_LEVEL) -p "$(DEFAULT_LISTEN_PORT):$(DEFAULT_LISTEN_PORT)" $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) # publish Gotenberg images according to version. publish: diff --git a/README.md b/README.md index f2bfc700..174208ba 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ At TheCodingMachine, we build a lot of web applications (intranets, extranets an * HTML and Markdown conversions using Google Chrome headless * Office conversions (.txt, .rtf, .docx, .doc, .odt, .pptx, .ppt, .odp and so on) using [unoconv](https://github.com/dagwieers/unoconv) -* Performance :zap:: Google Chrome and LibreOffice (unoconv) started once in the background thanks to PM2 +* Performance :zap:: Google Chrome and LibreOffice started once in the background thanks to PM2 * Failure prevention :broken_heart:: PM2 automatically restarts previous processes if they fail * Assets :package:: send your header, footer, images, fonts, stylesheets and so on for converting your HTML and Markdown to beaufitul PDFs! * Easily interact with the API using our [Go](https://github.com/thecodingmachine/gotenberg-go-client) and [PHP](https://github.com/thecodingmachine/gotenberg-php-client) libraries diff --git a/build/docs/content/00-introduction.md b/build/docs/content/00-introduction.md index ac1bf49a..1c6728e1 100644 --- a/build/docs/content/00-introduction.md +++ b/build/docs/content/00-introduction.md @@ -6,7 +6,7 @@ title: Introduction * HTML and Markdown conversions using Google Chrome headless * Office conversions (.txt, .rtf, .docx, .doc, .odt, .pptx, .ppt, .odp and so on) using [unoconv](https://github.com/dagwieers/unoconv) -* Performance: Google Chrome and LibreOffice (unoconv) started once in the background thanks to PM2 +* Performance: Google Chrome and LibreOffice started once in the background thanks to PM2 * Failure prevention: PM2 automatically restarts previous processes if they fail * Assets: send your header, footer, images, fonts, stylesheets and so on for converting your HTML and Markdown to beaufitul PDFs! * Easily interact with the API using our [Go](https://github.com/thecodingmachine/gotenberg-go-client) and [PHP](https://github.com/thecodingmachine/gotenberg-php-client) libraries \ No newline at end of file diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 3ffb2696..1cbf44f2 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -8,7 +8,8 @@ import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" + "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" + "github.com/thecodingmachine/gotenberg/internal/pkg/process" "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) @@ -26,22 +27,30 @@ func main() { } systemLogger.InfofOp(op, "Gotenberg %s", version) systemLogger.DebugfOp(op, "configuration: %+v", config) - // start PM2 processes. - var processes []pm2.Process - if !config.DisableGoogleChrome() { - processes = append(processes, pm2.NewChromeProcess(systemLogger)) + // create PM2 manager and start processes. + manager := process.NewPM2Manager(systemLogger, config) + if err := manager.Start(); err != nil { + systemLogger.FatalOp(op, err) } - /*if !config.DisableUnoconv() { - processes = append(processes, pm2.NewUnoconvProcess(systemLogger)) - }*/ - for _, p := range processes { - systemLogger.InfofOp(op, "starting '%s' with PM2...", p.Fullname()) - if err := p.Start(); err != nil { + // create prineries. + var chromePrinery *prinery.Prinery + if !config.DisableGoogleChrome() { + chromePrinery, err = prinery.New(systemLogger, manager, process.ChromeKey) + if err != nil { systemLogger.FatalOp(op, err) } + go chromePrinery.Start() + } + var sofficePrinery *prinery.Prinery + if !config.DisableUnoconv() { + sofficePrinery, err = prinery.New(systemLogger, manager, process.SofficeKey) + if err != nil { + systemLogger.FatalOp(op, err) + } + go sofficePrinery.Start() } // create our API. - srv := xhttp.New(config, processes...) + srv := xhttp.New(config, manager, chromePrinery, sofficePrinery) // run our API in a goroutine so that it doesn't block. go func() { systemLogger.InfofOp(op, "http server started on port '%d'", config.DefaultListenPort()) @@ -66,13 +75,6 @@ func main() { if err := srv.Shutdown(ctx); err != nil { systemLogger.FatalOp(op, err) } - // shutdown PM2 processes. - for _, p := range processes { - systemLogger.InfofOp(op, "shutting down '%s' with PM2...", p.Fullname()) - if err := p.Stop(); err != nil { - systemLogger.FatalOp(op, err) - } - } systemLogger.InfoOp(op, "bye!") os.Exit(0) } diff --git a/internal/app/xhttp/handler.go b/internal/app/xhttp/handler.go index 345dafef..fce3bf6f 100644 --- a/internal/app/xhttp/handler.go +++ b/internal/app/xhttp/handler.go @@ -9,7 +9,9 @@ import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/context" "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" + "github.com/thecodingmachine/gotenberg/internal/pkg/print" + "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" @@ -39,6 +41,7 @@ func pingHandler(c echo.Context) error { if logger.Level() != xlog.DebugLevel { return nil } + // TODO list, err := pm2.List() if err != nil { return err @@ -59,17 +62,18 @@ func mergeHandler(c echo.Context) error { ctx := context.MustCastFromEchoContext(c) logger := ctx.XLogger() logger.DebugOp(op, "handling merge request...") + config := ctx.Config() r := ctx.MustResource() - opts, err := mergePrinterOptions(r, ctx.Config()) + timeout, err := resource.WaitTimeoutAndWaitDelayArg(r, config) if err != nil { - return xerror.New(op, err) + return err } fpaths, err := r.Fpaths(".pdf") if err != nil { return err } - p := printer.NewMergePrinter(logger, fpaths, opts) - return convert(ctx, p) + p := print.NewMergePrint(logger, fpaths) + return convert(ctx, nil, p, timeout) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -83,10 +87,16 @@ func htmlHandler(c echo.Context) error { const op string = "xhttp.htmlHandler" resolver := func() error { ctx := context.MustCastFromEchoContext(c) + prinry := ctx.MustChromePrinery() logger := ctx.XLogger() logger.DebugOp(op, "handling HTML request...") + config := ctx.Config() r := ctx.MustResource() - opts, err := chromePrinterOptions(r, ctx.Config()) + timeout, err := resource.WaitTimeoutAndWaitDelayArg(r, config) + if err != nil { + return err + } + opts, err := chromePrintOptions(r, config) if err != nil { return err } @@ -94,8 +104,8 @@ func htmlHandler(c echo.Context) error { if err != nil { return err } - p := printer.NewHTMLPrinter(logger, fpath, opts) - return convert(ctx, p) + p := print.NewHTMLPrint(logger, fpath, opts) + return convert(ctx, prinry, p, timeout) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -109,10 +119,16 @@ func urlHandler(c echo.Context) error { const op string = "xhttp.urlHandler" resolver := func() error { ctx := context.MustCastFromEchoContext(c) + prinry := ctx.MustChromePrinery() logger := ctx.XLogger() logger.DebugOp(op, "handling URL request...") + config := ctx.Config() r := ctx.MustResource() - opts, err := chromePrinterOptions(r, ctx.Config()) + timeout, err := resource.WaitTimeoutAndWaitDelayArg(r, config) + if err != nil { + return err + } + opts, err := chromePrintOptions(r, config) if err != nil { return err } @@ -127,8 +143,8 @@ func urlHandler(c echo.Context) error { if err != nil { return err } - p := printer.NewURLPrinter(logger, remoteURL, opts) - return convert(ctx, p) + p := print.NewURLPrint(logger, remoteURL, opts) + return convert(ctx, prinry, p, timeout) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -142,10 +158,16 @@ func markdownHandler(c echo.Context) error { const op string = "xhttp.markdownHandler" resolver := func() error { ctx := context.MustCastFromEchoContext(c) + prinry := ctx.MustChromePrinery() logger := ctx.XLogger() logger.DebugOp(op, "handling Markdown request...") + config := ctx.Config() r := ctx.MustResource() - opts, err := chromePrinterOptions(r, ctx.Config()) + timeout, err := resource.WaitTimeoutAndWaitDelayArg(r, config) + if err != nil { + return err + } + opts, err := chromePrintOptions(r, config) if err != nil { return err } @@ -153,11 +175,11 @@ func markdownHandler(c echo.Context) error { if err != nil { return err } - p, err := printer.NewMarkdownPrinter(logger, fpath, opts) + p, err := print.NewMarkdownPrint(logger, fpath, opts) if err != nil { return err } - return convert(ctx, p) + return convert(ctx, prinry, p, timeout) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -171,10 +193,16 @@ func officeHandler(c echo.Context) error { const op string = "xhttp.officeHandler" resolver := func() error { ctx := context.MustCastFromEchoContext(c) + prinry := ctx.MustSofficePrinery() logger := ctx.XLogger() logger.DebugOp(op, "handling Office request...") + config := ctx.Config() r := ctx.MustResource() - opts, err := officePrinterOptions(r, ctx.Config()) + timeout, err := resource.WaitTimeoutAndWaitDelayArg(r, config) + if err != nil { + return err + } + opts, err := officePrintOptions(r, config) if err != nil { return err } @@ -195,8 +223,8 @@ func officeHandler(c echo.Context) error { if err != nil { return err } - p := printer.NewOfficePrinter(logger, fpaths, opts) - return convert(ctx, p) + p := print.NewOfficePrint(logger, fpaths, opts) + return convert(ctx, prinry, p, timeout) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -204,7 +232,7 @@ func officeHandler(c echo.Context) error { return nil } -func convert(ctx context.Context, p printer.Printer) error { +func convert(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, timeout float64) error { const op string = "xhttp.convert" resolver := func() error { logger := ctx.XLogger() @@ -217,13 +245,13 @@ func convert(ctx context.Context, p printer.Printer) error { // or an error. if !r.HasArg(resource.WebhookURLArgKey) { logger.DebugfOp(op, "no '%s' found, converting synchronously", resource.WebhookURLArgKey) - return convertSync(ctx, p, filename, fpath) + return convertSync(ctx, prinry, prnt, timeout, filename, fpath) } // as a webhook URL has been given, we // run the following lines in a goroutine so that // it doesn't block. logger.DebugfOp(op, "'%s' found, converting asynchronously", resource.WebhookURLArgKey) - return convertAsync(ctx, p, filename, fpath) + return convertAsync(ctx, prinry, prnt, timeout, filename, fpath) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -231,13 +259,19 @@ func convert(ctx context.Context, p printer.Printer) error { return nil } -func convertSync(ctx context.Context, p printer.Printer, filename, fpath string) error { +func convertSync(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, timeout float64, filename, fpath string) error { const op = "xhttp.convertSync" + logger := ctx.XLogger() + r := ctx.MustResource() + timeoutCtx, cancel := xcontext.WithTimeout(logger, timeout) + defer cancel() resolver := func() error { - logger := ctx.XLogger() - r := ctx.MustResource() - - if err := p.Print(fpath); err != nil { + if prinry == nil { + // case: merge. + if err := prnt.Print(timeoutCtx, fpath, nil); err != nil { + return err + } + } else if err := prinry.PrintRequest(timeoutCtx, logger, prnt, fpath); err != nil { return err } if !r.HasArg(resource.ResultFilenameArgKey) { @@ -267,12 +301,15 @@ func convertSync(ctx context.Context, p printer.Printer, filename, fpath string) return nil } if err := resolver(); err != nil { - return xerror.New(op, err) + return xcontext.MustHandleError( + timeoutCtx, + xerror.New(op, err), + ) } return nil } -func convertAsync(ctx context.Context, p printer.Printer, filename, fpath string) error { +func convertAsync(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, timeout float64, filename, fpath string) error { const op = "xhttp.convertAsync" logger := ctx.XLogger() r := ctx.MustResource() @@ -286,7 +323,16 @@ func convertAsync(ctx context.Context, p printer.Printer, filename, fpath string } go func() { defer r.Close() // nolint: errcheck - if err := p.Print(fpath); err != nil { + timeoutCtx, cancel := xcontext.WithTimeout(logger, timeout) + defer cancel() + if prinry == nil { + // case: merge. + if err := prnt.Print(timeoutCtx, fpath, nil); err != nil { + xerr := xerror.New(op, err) + logger.ErrorOp(xerror.Op(xerr), xerr) + return + } + } else if err := prinry.PrintRequest(timeoutCtx, logger, prnt, fpath); err != nil { xerr := xerror.New(op, err) logger.ErrorOp(xerror.Op(xerr), xerr) return diff --git a/internal/app/xhttp/handler_test.go b/internal/app/xhttp/handler_test.go index c4c78add..c1a5355b 100644 --- a/internal/app/xhttp/handler_test.go +++ b/internal/app/xhttp/handler_test.go @@ -19,8 +19,8 @@ import ( func TestPingHandler(t *testing.T) { // should return 200. config := conf.DefaultConfig() - srv := New(config) - srv = New(config) + // TODO + srv := New(config, nil, nil) req := httptest.NewRequest(http.MethodGet, pingEndpoint, nil) test.AssertStatusCode(t, http.StatusOK, srv, req) // should returns a JSON as @@ -28,7 +28,8 @@ func TestPingHandler(t *testing.T) { os.Setenv(conf.LogLevelEnvVar, "DEBUG") config, err := conf.FromEnv() assert.Nil(t, err) - srv = New(config) + // TODO + srv = New(config, nil, nil) req = httptest.NewRequest(http.MethodGet, pingEndpoint, nil) rec := httptest.NewRecorder() srv.ServeHTTP(rec, req) @@ -39,7 +40,8 @@ func TestPingHandler(t *testing.T) { func TestMergeHandler(t *testing.T) { config := conf.DefaultConfig() - srv := New(config) + // TODO + srv := New(config, nil, nil) // should return 200. body, contentType := test.MergeMultipartForm(t, nil) req := httptest.NewRequest(http.MethodPost, mergeEndpoint, body) @@ -72,7 +74,8 @@ func TestMergeHandler(t *testing.T) { func TestHTMLHandler(t *testing.T) { config := conf.DefaultConfig() - srv := New(config) + // TODO + srv := New(config, nil, nil) endpoint := fmt.Sprintf("%s%s", convertGroupEndpoint, htmlEndpoint) // should return 200. body, contentType := test.HTMLMultipartForm(t, nil) @@ -202,7 +205,8 @@ func TestHTMLHandler(t *testing.T) { func TestURLHandler(t *testing.T) { config := conf.DefaultConfig() - srv := New(config) + // TODO + srv := New(config, nil, nil) endpoint := fmt.Sprintf("%s%s", convertGroupEndpoint, urlEndpoint) // should return 200. body, contentType := test.URLMultipartForm(t, nil) @@ -332,7 +336,8 @@ func TestURLHandler(t *testing.T) { func TestMarkdownHandler(t *testing.T) { config := conf.DefaultConfig() - srv := New(config) + // TODO + srv := New(config, nil, nil) endpoint := fmt.Sprintf("%s%s", convertGroupEndpoint, markdownEndpoint) // should return 200. body, contentType := test.MarkdownMultipartForm(t, nil) @@ -462,7 +467,8 @@ func TestMarkdownHandler(t *testing.T) { func TestOfficeHandler(t *testing.T) { config := conf.DefaultConfig() - srv := New(config) + // TODO + srv := New(config, nil, nil) endpoint := fmt.Sprintf("%s%s", convertGroupEndpoint, officeEndpoint) // should return 200. body, contentType := test.OfficeMultipartForm(t, nil) @@ -524,7 +530,8 @@ func TestWebhook(t *testing.T) { rcv.Start(":3001") }() config := conf.DefaultConfig() - srv := New(config) + // TODO + srv := New(config, nil, nil) // our custom server should receive the PDF. body, contentType := test.MergeMultipartForm(t, map[string]string{string(resource.WebhookURLArgKey): "http://localhost:3001/foo"}) req := httptest.NewRequest(http.MethodPost, mergeEndpoint, body) @@ -536,7 +543,8 @@ func TestWebhook(t *testing.T) { func TestResultFilename(t *testing.T) { config := conf.DefaultConfig() - srv := New(config) + // TODO + srv := New(config, nil, nil) body, contentType := test.MergeMultipartForm(t, map[string]string{string(resource.ResultFilenameArgKey): "foo.pdf"}) req := httptest.NewRequest(http.MethodPost, mergeEndpoint, body) req.Header.Set(echo.HeaderContentType, contentType) diff --git a/internal/app/xhttp/middleware.go b/internal/app/xhttp/middleware.go index 4c6f2262..69f7b232 100644 --- a/internal/app/xhttp/middleware.go +++ b/internal/app/xhttp/middleware.go @@ -7,7 +7,8 @@ import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/context" "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" + "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" + "github.com/thecodingmachine/gotenberg/internal/pkg/process" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" @@ -15,7 +16,12 @@ import ( // contextMiddleware extends the default echo.Context with // our custom context.Context. -func contextMiddleware(config conf.Config, processes ...pm2.Process) echo.MiddlewareFunc { +func contextMiddleware( + config conf.Config, + manager process.Manager, + chromePrinery *prinery.Prinery, + sofficePrinery *prinery.Prinery, +) echo.MiddlewareFunc { return func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { // generate a unique identifier for the request. @@ -25,7 +31,7 @@ func contextMiddleware(config conf.Config, processes ...pm2.Process) echo.Middle logger := xlog.New(config.LogLevel(), trace) // extend the current echo context with our custom // context. - ctx := context.New(c, logger, config, processes...) + ctx := context.New(c, logger, config, manager, chromePrinery, sofficePrinery) // if its an healthcheck request, there // is no need to create a Resource. if ctx.Path() == pingEndpoint { diff --git a/internal/app/xhttp/option.go b/internal/app/xhttp/option.go index d79841e8..0f1131a4 100644 --- a/internal/app/xhttp/option.go +++ b/internal/app/xhttp/option.go @@ -3,53 +3,37 @@ package xhttp import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/printer" + "github.com/thecodingmachine/gotenberg/internal/pkg/print" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" ) -func mergePrinterOptions(r resource.Resource, config conf.Config) (printer.MergePrinterOptions, error) { - const op string = "xhttp.mergePrinterOptions" - waitTimeout, err := resource.WaitTimeoutArg(r, config) - if err != nil { - return printer.MergePrinterOptions{}, xerror.New(op, err) - } - return printer.MergePrinterOptions{ - WaitTimeout: waitTimeout, - }, nil -} - -func chromePrinterOptions(r resource.Resource, config conf.Config) (printer.ChromePrinterOptions, error) { - const op string = "xhttp.chromePrinterOptions" - resolver := func() (printer.ChromePrinterOptions, error) { - waitTimeout, err := resource.WaitTimeoutArg(r, config) - if err != nil { - return printer.ChromePrinterOptions{}, err - } +func chromePrintOptions(r resource.Resource, config conf.Config) (print.ChromePrintOptions, error) { + const op string = "xhttp.chromePrintOptions" + resolver := func() (print.ChromePrintOptions, error) { waitDelay, err := resource.WaitDelayArg(r, config) if err != nil { - return printer.ChromePrinterOptions{}, err + return print.ChromePrintOptions{}, err } headerHTML, footerHTML, err := resource.HeaderFooterContents(r, config) if err != nil { - return printer.ChromePrinterOptions{}, err + return print.ChromePrintOptions{}, err } paperWidth, paperHeight, err := resource.PaperSizeArgs(r, config) if err != nil { - return printer.ChromePrinterOptions{}, err + return print.ChromePrintOptions{}, err } marginTop, marginBottom, marginLeft, marginRight, err := resource.MarginArgs(r, config) if err != nil { - return printer.ChromePrinterOptions{}, err + return print.ChromePrintOptions{}, err } landscape, err := r.BoolArg(resource.LandscapeArgKey, false) if err != nil { - return printer.ChromePrinterOptions{}, err + return print.ChromePrintOptions{}, err } - return printer.ChromePrinterOptions{ - WaitTimeout: waitTimeout, + return print.ChromePrintOptions{ WaitDelay: waitDelay, HeaderHTML: headerHTML, FooterHTML: footerHTML, @@ -69,20 +53,15 @@ func chromePrinterOptions(r resource.Resource, config conf.Config) (printer.Chro return opts, nil } -func officePrinterOptions(r resource.Resource, config conf.Config) (printer.OfficePrinterOptions, error) { - const op string = "xhttp.officePrinterOptions" - resolver := func() (printer.OfficePrinterOptions, error) { - waitTimeout, err := resource.WaitTimeoutArg(r, config) - if err != nil { - return printer.OfficePrinterOptions{}, err - } +func officePrintOptions(r resource.Resource, config conf.Config) (print.OfficePrintOptions, error) { + const op string = "xhttp.officePrintOptions" + resolver := func() (print.OfficePrintOptions, error) { landscape, err := r.BoolArg(resource.LandscapeArgKey, false) if err != nil { - return printer.OfficePrinterOptions{}, err + return print.OfficePrintOptions{}, err } - return printer.OfficePrinterOptions{ - WaitTimeout: waitTimeout, - Landscape: landscape, + return print.OfficePrintOptions{ + Landscape: landscape, }, nil } opts, err := resolver() diff --git a/internal/app/xhttp/pkg/context/context.go b/internal/app/xhttp/pkg/context/context.go index d702e9d8..0012b73c 100644 --- a/internal/app/xhttp/pkg/context/context.go +++ b/internal/app/xhttp/pkg/context/context.go @@ -13,7 +13,8 @@ import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" "github.com/thecodingmachine/gotenberg/internal/pkg/normalize" - "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" + "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" + "github.com/thecodingmachine/gotenberg/internal/pkg/process" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) @@ -21,20 +22,31 @@ import ( // Context extends the default echo.Context. type Context struct { echo.Context - logger xlog.Logger - config conf.Config - processes []pm2.Process - resource resource.Resource - startTime time.Time + logger xlog.Logger + config conf.Config + manager process.Manager + chromePrinery *prinery.Prinery + sofficePrinery *prinery.Prinery + resource resource.Resource + startTime time.Time } // New creates a new Context. -func New(c echo.Context, logger xlog.Logger, config conf.Config, processes ...pm2.Process) Context { +func New( + c echo.Context, + logger xlog.Logger, + config conf.Config, + manager process.Manager, + chromePrinery *prinery.Prinery, + sofficePrinery *prinery.Prinery, +) Context { return Context{ c, logger, config, - processes, + manager, + chromePrinery, + sofficePrinery, resource.Resource{}, time.Now(), } @@ -77,17 +89,52 @@ func (ctx Context) Config() conf.Config { // one of the processes is not viable. func (ctx Context) ProcessesHealthcheck() error { const op string = "context.Context.ProcessesHealthcheck" - for _, process := range ctx.processes { - if !process.IsViable() { + processes := ctx.manager.All() + for _, p := range processes { + if !ctx.manager.IsViable(p) { return xerror.New( op, - fmt.Errorf("'%s' is not viable", process.Fullname()), + fmt.Errorf("'%s' is not viable", p.ID()), ) } } return nil } +/* +MustChromePrinery returns the instance of +prinery.Prinery associated with the Context. + +This prinery.Prinery handles Google Chrome +headless. + +It panics if no instance of prinery.Prinery. +*/ +func (ctx Context) MustChromePrinery() *prinery.Prinery { + const op string = "context.Context.MustChromePrinery" + if ctx.chromePrinery == nil { + panic(fmt.Sprintf("%s: unable to retrieve the instance of Google Chrome Headless prinery.Prinery from our custom context.Context", op)) + } + return ctx.chromePrinery +} + +/* +MustSofficePrinery returns the instance of +prinery.Prinery associated with the Context. + +This prinery.Prinery handles LibreOffice +headless. + +It panics if no instance of prinery.Prinery. +*/ +func (ctx Context) MustSofficePrinery() *prinery.Prinery { + const op string = "context.Context.MustSofficePrinery" + if ctx.sofficePrinery == nil { + panic(fmt.Sprintf("%s: unable to retrieve the instance of LibreOffice Headless prinery.Prinery from our custom context.Context", op)) + } + return ctx.sofficePrinery +} + // WithResource creates a resource.Resource and // adds it to the Context. func (ctx *Context) WithResource(directoryName string) error { diff --git a/internal/app/xhttp/pkg/resource/arg.go b/internal/app/xhttp/pkg/resource/arg.go index 35c7800b..b196281d 100644 --- a/internal/app/xhttp/pkg/resource/arg.go +++ b/internal/app/xhttp/pkg/resource/arg.go @@ -76,6 +76,34 @@ func ArgKeys() []ArgKey { } } +/* +WaitTimeoutAndWaitDelayArg is a helper for retrieving +the sum of "waitTimeout" and "waitDelay" arguments +as float64. + +It also validates them against the application +configuration. +*/ +func WaitTimeoutAndWaitDelayArg(r Resource, config conf.Config) (float64, error) { + const op string = "resource.WaitTimeoutAndWaitDelayArg" + resolver := func() (float64, error) { + waitTimeout, err := WaitTimeoutArg(r, config) + if err != nil { + return waitTimeout, err + } + waitDelay, err := WaitDelayArg(r, config) + if err != nil { + return waitDelay, err + } + return waitTimeout + waitDelay, nil + } + combined, err := resolver() + if err != nil { + return combined, xerror.New(op, err) + } + return combined, nil +} + /* WaitTimeoutArg is a helper for retrieving the "waitTimeout" argument as float64. diff --git a/internal/app/xhttp/xhttp.go b/internal/app/xhttp/xhttp.go index 73241d9b..5d402964 100644 --- a/internal/app/xhttp/xhttp.go +++ b/internal/app/xhttp/xhttp.go @@ -3,15 +3,21 @@ package xhttp import ( "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" + "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" + "github.com/thecodingmachine/gotenberg/internal/pkg/process" ) // New returns a custom echo.Echo. -func New(config conf.Config, processes ...pm2.Process) *echo.Echo { +func New( + config conf.Config, + manager process.Manager, + chromePrinery *prinery.Prinery, + sofficePrinery *prinery.Prinery, +) *echo.Echo { srv := echo.New() srv.HideBanner = true srv.HidePort = true - srv.Use(contextMiddleware(config, processes...)) + srv.Use(contextMiddleware(config, manager, chromePrinery, sofficePrinery)) srv.Use(loggerMiddleware()) srv.Use(cleanupMiddleware()) srv.Use(errorMiddleware()) diff --git a/internal/app/xhttp/xhttp_test.go b/internal/app/xhttp/xhttp_test.go index 685fb0a1..0d317e3d 100644 --- a/internal/app/xhttp/xhttp_test.go +++ b/internal/app/xhttp/xhttp_test.go @@ -17,7 +17,8 @@ func TestDisableChromeEndpoints(t *testing.T) { os.Setenv(conf.DisableGoogleChromeEnvVar, "1") config, err := conf.FromEnv() assert.Nil(t, err) - srv := New(config) + // TODO + srv := New(config, nil, nil) // Ping endpoint should return 200. req := httptest.NewRequest(http.MethodGet, pingEndpoint, nil) test.AssertStatusCode(t, http.StatusOK, srv, req) @@ -54,7 +55,8 @@ func TestDisableUnoconvEndpoints(t *testing.T) { os.Setenv(conf.DisableUnoconvEnvVar, "1") config, err := conf.FromEnv() assert.Nil(t, err) - srv := New(config) + // TODO + srv := New(config, nil, nil) // Ping endpoint should return 200. req := httptest.NewRequest(http.MethodGet, pingEndpoint, nil) test.AssertStatusCode(t, http.StatusOK, srv, req) @@ -91,7 +93,8 @@ func TestDisableChromeAndUnoconvEndpoints(t *testing.T) { os.Setenv(conf.DisableUnoconvEnvVar, "1") config, err := conf.FromEnv() assert.Nil(t, err) - srv := New(config) + // TODO + srv := New(config, nil, nil) // Ping endpoint should return 200. req := httptest.NewRequest(http.MethodGet, pingEndpoint, nil) test.AssertStatusCode(t, http.StatusOK, srv, req) diff --git a/internal/pkg/prinery/doc.go b/internal/pkg/prinery/doc.go new file mode 100644 index 00000000..d16971e5 --- /dev/null +++ b/internal/pkg/prinery/doc.go @@ -0,0 +1 @@ +package prinery diff --git a/internal/pkg/prinery/prinery.go b/internal/pkg/prinery/prinery.go new file mode 100644 index 00000000..da535903 --- /dev/null +++ b/internal/pkg/prinery/prinery.go @@ -0,0 +1,123 @@ +package prinery + +import ( + "context" + "fmt" + + "github.com/thecodingmachine/gotenberg/internal/pkg/print" + "github.com/thecodingmachine/gotenberg/internal/pkg/process" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +type request struct { + ctx context.Context + logger xlog.Logger + print print.Print + dest string + result chan error +} + +type worker struct { + work chan request + proc process.Process +} + +func (w *worker) do(done chan *worker) { + for { + req := <-w.work + req.result <- req.print.Print(req.ctx, req.dest, w.proc) + done <- w + } +} + +type Prinery struct { + logger xlog.Logger + manager process.Manager + work chan request + pool chan *worker + done chan *worker +} + +func New(logger xlog.Logger, manager process.Manager, key process.Key) (*Prinery, error) { + const op string = "prinery.New" + processes := manager.Processes(key) + nWorkers := len(processes) + if nWorkers == 0 { + err := fmt.Errorf("no processes found for key '%s'", string(key)) + return nil, xerror.New(op, err) + } + logger.DebugfOp(op, "found '%d' processes for key '%s'", nWorkers, string(key)) + work := make(chan request, 1) + pool := make(chan *worker, nWorkers) + done := make(chan *worker, nWorkers) + for _, p := range processes { + w := &worker{ + work: work, + proc: p, + } + pool <- w + go w.do(done) + } + return &Prinery{ + logger: logger, + manager: manager, + work: work, + pool: pool, + done: done, + }, nil +} + +func (p *Prinery) PrintRequest(ctx context.Context, logger xlog.Logger, prnt print.Print, dest string) error { + const op string = "prinery.Prinery.PrintRequest" + req := request{ + ctx: ctx, + logger: logger, + print: prnt, + dest: dest, + result: make(chan error), + } + p.dispatch(req) + err := <-req.result + if err != nil { + return xerror.New(op, err) + } + return nil +} + +func (p *Prinery) Start() { + for { + select { + case req := <-p.work: + p.dispatch(req) + case w := <-p.done: + p.completed(w) + } + } +} + +func (p *Prinery) dispatch(req request) { + const op string = "prinery.Prinery.dispatch" + select { + case w := <-p.pool: + w.work <- req + case <-req.ctx.Done(): + req.result <- xerror.New(op, req.ctx.Err()) + } +} + +func (p *Prinery) completed(w *worker) { + const op string = "prinery.Prinerty.completed" + go func() { + // check process viability. + isViable := p.manager.IsViable(w.proc) + // check process memory usage. + // TODO handle error. + memory, _ := p.manager.Memory(w.proc) + p.logger.DebugfOp(op, "%s: isViable = %t, memory = %d", w.proc.ID(), isViable, memory) + // TODO manage viability and memory usage. + // pushing back the worker. + p.pool <- w + }() + +} diff --git a/internal/pkg/print/chrome.go b/internal/pkg/print/chrome.go new file mode 100644 index 00000000..b1abdf8a --- /dev/null +++ b/internal/pkg/print/chrome.go @@ -0,0 +1,265 @@ +package print + +import ( + "context" + "fmt" + "io/ioutil" + "time" + + "github.com/mafredri/cdp" + "github.com/mafredri/cdp/devtool" + "github.com/mafredri/cdp/protocol/network" + "github.com/mafredri/cdp/protocol/page" + "github.com/mafredri/cdp/protocol/target" + "github.com/mafredri/cdp/rpcc" + "github.com/thecodingmachine/gotenberg/internal/pkg/process" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerrgroup" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" +) + +type chromePrint struct { + logger xlog.Logger + url string + opts ChromePrintOptions +} + +// ChromePrintOptions helps customizing the +// Google Chrome Print result. +type ChromePrintOptions struct { + WaitDelay float64 + HeaderHTML string + FooterHTML string + PaperWidth float64 + PaperHeight float64 + MarginTop float64 + MarginBottom float64 + MarginLeft float64 + MarginRight float64 + Landscape bool +} + +// DefaultChromePrintOptions returns the default +// Google Chrome Print options. +func DefaultChromePrintOptions() ChromePrintOptions { + const defaultHeaderFooterHTML string = "" + return ChromePrintOptions{ + WaitDelay: 0.0, + HeaderHTML: defaultHeaderFooterHTML, + FooterHTML: defaultHeaderFooterHTML, + PaperWidth: 8.27, + PaperHeight: 11.7, + MarginTop: 1.0, + MarginBottom: 1.0, + MarginLeft: 1.0, + MarginRight: 1.0, + Landscape: false, + } +} + +func (p chromePrint) Print(ctx context.Context, dest string, proc process.Process) error { + const op string = "print.chromePrint.Print" + resolver := func() error { + devtEndpoint := fmt.Sprintf("http://%s:%d", proc.Host(), proc.Port()) + devt, err := devtool.New(devtEndpoint).Version(ctx) + if err != nil { + return err + } + // connect to WebSocket URL (page) that speaks the Chrome DevTools Protocol. + devtConn, err := rpcc.DialContext(ctx, devt.WebSocketDebuggerURL) + if err != nil { + return err + } + defer devtConn.Close() // nolint: errcheck + // create a new CDP Client that uses conn. + devtClient := cdp.NewClient(devtConn) + newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx) + if err != nil { + return err + } + /* + close the browser context when done. + we're not using the "default" context + as it may timeout before actually closing + the browser context. + see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 + */ + disposeBrowserContextArgs := target.NewDisposeBrowserContextArgs(newContextTarget.BrowserContextID) + defer devtClient.Target.DisposeBrowserContext(context.Background(), disposeBrowserContextArgs) // nolint: errcheck + // create a new blank target with the new browser context. + createTargetArgs := target. + NewCreateTargetArgs("about:blank"). + SetBrowserContextID(newContextTarget.BrowserContextID) + newTarget, err := devtClient.Target.CreateTarget(ctx, createTargetArgs) + if err != nil { + return err + } + // connect the client to the new target. + newTargetWsURL := fmt.Sprintf("ws://%s:%d/devtools/page/%s", proc.Host(), proc.Port(), newTarget.TargetID) + newContextConn, err := rpcc.DialContext(ctx, newTargetWsURL) + if err != nil { + return err + } + defer newContextConn.Close() // nolint: errcheck + // create a new CDP Client that uses newContextConn. + targetClient := cdp.NewClient(newContextConn) + /* + close the target when done. + we're not using the "default" context + as it may timeout before actually closing + the target. + see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 + */ + closeTargetArgs := target.NewCloseTargetArgs(newTarget.TargetID) + defer targetClient.Target.CloseTarget(context.Background(), closeTargetArgs) // nolint: errcheck + // enable all events. + if err := p.enableEvents(ctx, targetClient); err != nil { + return err + } + // listen for all events. + if err := p.listenEvents(ctx, targetClient); err != nil { + return err + } + // apply a wait delay (if any). + if p.opts.WaitDelay > 0.0 { + // wait for a given amount of time (useful for javascript delay). + p.logger.DebugfOp(op, "applying a wait delay of '%.2fs'...", p.opts.WaitDelay) + time.Sleep(xtime.Duration(p.opts.WaitDelay)) + } else { + p.logger.DebugOp(op, "no wait delay to apply, moving on...") + } + // print the page to PDF. + print, err := targetClient.Page.PrintToPDF( + ctx, + page.NewPrintToPDFArgs(). + SetPaperWidth(p.opts.PaperWidth). + SetPaperHeight(p.opts.PaperHeight). + SetMarginTop(p.opts.MarginTop). + SetMarginBottom(p.opts.MarginBottom). + SetMarginLeft(p.opts.MarginLeft). + SetMarginRight(p.opts.MarginRight). + SetLandscape(p.opts.Landscape). + SetDisplayHeaderFooter(true). + SetHeaderTemplate(p.opts.HeaderHTML). + SetFooterTemplate(p.opts.FooterHTML). + SetPrintBackground(true), + ) + if err != nil { + return err + } + if err := ioutil.WriteFile(dest, print.Data, 0644); err != nil { + return err + } + return nil + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (p chromePrint) enableEvents(ctx context.Context, client *cdp.Client) error { + const op string = "print.chromePrint.enableEvents" + // enable all the domain events that we're interested in. + if err := xerrgroup.Run( + func() error { return client.DOM.Enable(ctx) }, + func() error { return client.Network.Enable(ctx, network.NewEnableArgs()) }, + func() error { return client.Page.Enable(ctx) }, + func() error { + return client.Page.SetLifecycleEventsEnabled(ctx, page.NewSetLifecycleEventsEnabledArgs(true)) + }, + func() error { return client.Runtime.Enable(ctx) }, + ); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (p chromePrint) listenEvents(ctx context.Context, client *cdp.Client) error { + const op string = "print.chromePrint.listenEvents" + resolver := func() error { + // make sure Page events are enabled. + if err := client.Page.Enable(ctx); err != nil { + return err + } + // make sure Network events are enabled. + if err := client.Network.Enable(ctx, nil); err != nil { + return err + } + // create all clients for events. + domContentEventFired, err := client.Page.DOMContentEventFired(ctx) + if err != nil { + return err + } + defer domContentEventFired.Close() // nolint: errcheck + loadEventFired, err := client.Page.LoadEventFired(ctx) + if err != nil { + return err + } + defer loadEventFired.Close() // nolint: errcheck + lifecycleEvent, err := client.Page.LifecycleEvent(ctx) + if err != nil { + return err + } + defer lifecycleEvent.Close() // nolint: errcheck + loadingFinished, err := client.Network.LoadingFinished(ctx) + if err != nil { + return err + } + defer loadingFinished.Close() // nolint: errcheck + if _, err := client.Page.Navigate(ctx, page.NewNavigateArgs(p.url)); err != nil { + return err + } + // wait for all events. + return xerrgroup.Run( + func() error { + _, err := domContentEventFired.Recv() + if err != nil { + return err + } + p.logger.DebugOp(op, "event 'domContentEventFired' received") + return nil + }, + func() error { + _, err := loadEventFired.Recv() + if err != nil { + return err + } + p.logger.DebugOp(op, "event 'loadEventFired' received") + return nil + }, + func() error { + const networkIdleEventName string = "networkIdle" + for { + ev, err := lifecycleEvent.Recv() + if err != nil { + return err + } + p.logger.DebugfOp(op, "event '%s' received", ev.Name) + if ev.Name == networkIdleEventName { + break + } + } + return nil + }, + func() error { + _, err := loadingFinished.Recv() + if err != nil { + return err + } + p.logger.DebugOp(op, "event 'loadingFinished' received") + return nil + }, + ) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = Print(new(chromePrint)) +) diff --git a/internal/pkg/print/doc.go b/internal/pkg/print/doc.go new file mode 100644 index 00000000..91d3830c --- /dev/null +++ b/internal/pkg/print/doc.go @@ -0,0 +1 @@ +package print diff --git a/internal/pkg/print/html.go b/internal/pkg/print/html.go new file mode 100644 index 00000000..9a3e04f5 --- /dev/null +++ b/internal/pkg/print/html.go @@ -0,0 +1,18 @@ +package print + +import ( + "fmt" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +// NewHTMLPrint returns a Print for +// converting an HTML file to PDF. +func NewHTMLPrint(logger xlog.Logger, fpath string, opts ChromePrintOptions) Print { + URL := fmt.Sprintf("file://%s", fpath) + return chromePrint{ + logger: logger, + url: URL, + opts: opts, + } +} diff --git a/internal/pkg/print/markdown.go b/internal/pkg/print/markdown.go new file mode 100644 index 00000000..0be02349 --- /dev/null +++ b/internal/pkg/print/markdown.go @@ -0,0 +1,70 @@ +package print + +import ( + "bytes" + "fmt" + "html/template" + "io/ioutil" + "path/filepath" + + "github.com/microcosm-cc/bluemonday" + "github.com/russross/blackfriday/v2" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" +) + +// NewMarkdownPrint returns a Print for +// converting a Markdown file to PDF. +func NewMarkdownPrint(logger xlog.Logger, fpath string, opts ChromePrintOptions) (Print, error) { + const op string = "print.NewMarkdownPrint" + resolver := func() (string, error) { + tmpl, err := template. + New(filepath.Base(fpath)). + Funcs(template.FuncMap{"toHTML": markdownToHTML}). + ParseFiles(fpath) + if err != nil { + return "", err + } + dirPath := filepath.Dir(fpath) + data := &templateData{DirPath: dirPath} + logger.DebugOp(op, "converting Markdown files to HTML...") + var buffer bytes.Buffer + if err := tmpl.Execute(&buffer, data); err != nil { + return "", err + } + baseFilename := xrand.Get() + dst := fmt.Sprintf("%s/%s.html", dirPath, baseFilename) + logger.DebugOp(op, "writing the HTML from previous conversion(s) into new file...") + if err := ioutil.WriteFile(dst, buffer.Bytes(), 0644); err != nil { + return "", err + } + return fmt.Sprintf("file://%s", dst), nil + } + URL, err := resolver() + if err != nil { + return chromePrint{}, xerror.New(op, err) + } + return chromePrint{ + logger: logger, + url: URL, + opts: opts, + }, nil +} + +type templateData struct { + DirPath string +} + +func markdownToHTML(dirPath, filename string) (template.HTML, error) { + const op string = "print.markdownToHTML" + fpath := fmt.Sprintf("%s/%s", dirPath, filename) + b, err := ioutil.ReadFile(fpath) + if err != nil { + return "", xerror.New(op, err) + } + unsafe := blackfriday.Run(b) + content := bluemonday.UGCPolicy().SanitizeBytes(unsafe) + /* #nosec */ + return template.HTML(content), nil +} diff --git a/internal/pkg/print/merge.go b/internal/pkg/print/merge.go new file mode 100644 index 00000000..a961c4fd --- /dev/null +++ b/internal/pkg/print/merge.go @@ -0,0 +1,44 @@ +package print + +import ( + "context" + + "github.com/thecodingmachine/gotenberg/internal/pkg/process" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +type mergePrint struct { + logger xlog.Logger + fpaths []string +} + +// NewMergePrint returns a Print for +// merging PDF files. +func NewMergePrint(logger xlog.Logger, fpaths []string) Print { + return mergePrint{ + logger: logger, + fpaths: fpaths, + } +} + +func (p mergePrint) Print(ctx context.Context, dest string, proc process.Process) error { + const op string = "print.mergePrint.Print" + p.logger.DebugfOp(op, "merging '%v'...", p.fpaths) + resolver := func() error { + var args []string + args = append(args, p.fpaths...) + args = append(args, "cat", "output", dest) + cmd, err := xexec.CommandContext(ctx, p.logger, "pdftk", args...) + if err != nil { + return err + } + xexec.LogBeforeExecute(p.logger, cmd) + return cmd.Run() + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} diff --git a/internal/pkg/print/office.go b/internal/pkg/print/office.go new file mode 100644 index 00000000..5bc524f8 --- /dev/null +++ b/internal/pkg/print/office.go @@ -0,0 +1,109 @@ +package print + +import ( + "context" + "fmt" + "os" + "path/filepath" + + "github.com/thecodingmachine/gotenberg/internal/pkg/process" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" +) + +type officePrint struct { + logger xlog.Logger + fpaths []string + opts OfficePrintOptions +} + +// OfficePrintOptions helps customizing the +// LibreOffice Print result. +type OfficePrintOptions struct { + Landscape bool +} + +// DefaultOfficePrinterOptions returns the default +// LibreOffice Print options. +func DefaultOfficePrinterOptions() OfficePrintOptions { + return OfficePrintOptions{ + Landscape: false, + } +} + +// NewOfficePrint returns a Print for +// converting Office documents to PDF. +func NewOfficePrint(logger xlog.Logger, fpaths []string, opts OfficePrintOptions) Print { + return officePrint{ + logger: logger, + fpaths: fpaths, + opts: opts, + } +} + +func (p officePrint) Print(ctx context.Context, dest string, proc process.Process) error { + const op string = "print.officePrint.Print" + resolver := func() error { + fpaths := make([]string, len(p.fpaths)) + dirPath := filepath.Dir(dest) + for i, fpath := range p.fpaths { + baseFilename := xrand.Get() + tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) + p.logger.DebugfOp(op, "converting '%s' to PDF...", fpath) + if err := unoconv(ctx, p.logger, fpath, tmpDest, p.opts); err != nil { + return err + } + p.logger.DebugfOp(op, "'%s.pdf' created", baseFilename) + fpaths[i] = tmpDest + } + if len(fpaths) == 1 { + p.logger.DebugOp(op, "only one PDF created, nothing to merge") + if err := os.Rename(fpaths[0], dest); err != nil { + return err + } + return nil + } + merger := NewMergePrint(p.logger, fpaths) + return merger.Print(ctx, dest, nil) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func unoconv(ctx context.Context, logger xlog.Logger, fpath, dest string, opts OfficePrintOptions) error { + const op string = "print.unoconv" + resolver := func() error { + args := []string{ + "--format", + "pdf", + } + if opts.Landscape { + args = append(args, "--printer", "PaperOrientation=landscape") + } + args = append(args, "--output", dest, fpath) + cmd, err := xexec.CommandContext( + ctx, + logger, + "unoconv", + args..., + ) + if err != nil { + return err + } + xexec.LogBeforeExecute(logger, cmd) + return cmd.Run() + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = Print(new(officePrint)) +) diff --git a/internal/pkg/print/print.go b/internal/pkg/print/print.go new file mode 100644 index 00000000..4b641c8e --- /dev/null +++ b/internal/pkg/print/print.go @@ -0,0 +1,13 @@ +package print + +import ( + "context" + + "github.com/thecodingmachine/gotenberg/internal/pkg/process" +) + +// Print is a type that can create a PDF file from a source. +// The source is defined in the underlying implementation. +type Print interface { + Print(ctx context.Context, dest string, proc process.Process) error +} diff --git a/internal/pkg/print/url.go b/internal/pkg/print/url.go new file mode 100644 index 00000000..9031e21d --- /dev/null +++ b/internal/pkg/print/url.go @@ -0,0 +1,15 @@ +package print + +import ( + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +// NewURLPrint returns a Print for +// converting a URL to PDF. +func NewURLPrint(logger xlog.Logger, url string, opts ChromePrintOptions) Print { + return chromePrint{ + logger: logger, + url: url, + opts: opts, + } +} diff --git a/internal/pkg/process/chrome.go b/internal/pkg/process/chrome.go new file mode 100644 index 00000000..c93dbe51 --- /dev/null +++ b/internal/pkg/process/chrome.go @@ -0,0 +1,106 @@ +package process + +import ( + "context" + "fmt" + "time" + + "github.com/mafredri/cdp/devtool" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +const ChromeKey Key = "chrome" + +type chromeProcess struct { + id string + host string + port int +} + +// NewChromeProcess returns a Google Chrome +// headless process. +func NewChromeProcess(id, host string, port int) Process { + return chromeProcess{ + id: id, + host: host, + port: port, + } +} + +func (p chromeProcess) ID() string { + return p.id +} + +func (p chromeProcess) Host() string { + return p.host +} + +func (p chromeProcess) Port() int { + return p.port +} + +func (p chromeProcess) binary() string { + return "google-chrome-stable" +} + +func (p chromeProcess) args() []string { + return []string{ + "--no-sandbox", + "--headless", + // see https://github.com/GoogleChrome/puppeteer/issues/2410. + "--font-render-hinting=medium", + fmt.Sprintf("--remote-debugging-port=%d", p.port), + "--disable-gpu", + "--disable-translate", + "--disable-extensions", + "--disable-background-networking", + "--safebrowsing-disable-auto-update", + "--disable-sync", + "--disable-default-apps", + "--hide-scrollbars", + "--metrics-recording-only", + "--mute-audio", + "--no-first-run", + } +} + +func (p chromeProcess) warmupTime() time.Duration { + return 10 * time.Second +} + +func (p chromeProcess) viabilityFunc() func(logger xlog.Logger) bool { + const op string = "process.chromeProcess.viabilityFunc" + return func(logger xlog.Logger) bool { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + endpoint := fmt.Sprintf("http://%s:%d" /*p.host*/, "localhost", p.port) + logger.DebugfOp( + op, + "checking '%s' viability via endpoint '%s/json/version'", + p.ID(), + endpoint, + ) + v, err := devtool.New(endpoint).Version(ctx) + if err != nil { + logger.ErrorfOp( + op, + "'%s' is not viable as endpoint returned '%v'", + p.ID(), + err, + ) + return false + } + logger.DebugfOp( + op, + "'%s' is viable as endpoint returned '%v'", + p.ID(), + v, + ) + return true + } +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = Process(new(chromeProcess)) +) diff --git a/internal/pkg/process/doc.go b/internal/pkg/process/doc.go new file mode 100644 index 00000000..f2ef9d28 --- /dev/null +++ b/internal/pkg/process/doc.go @@ -0,0 +1 @@ +package process diff --git a/internal/pkg/process/pm2.go b/internal/pkg/process/pm2.go new file mode 100644 index 00000000..8be78c26 --- /dev/null +++ b/internal/pkg/process/pm2.go @@ -0,0 +1,324 @@ +package process + +import ( + "encoding/json" + "fmt" + "os/exec" + "sync" + "time" + + "github.com/thecodingmachine/gotenberg/internal/pkg/conf" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" +) + +type jlistItem struct { + Name string `json:"name"` + PM2Env struct { + Status string `json:"status"` + RestartTime int64 `json:"restart_time"` + } `json:"pm2_env"` + Monit struct { + Memory int64 `json:"memory"` + CPU float64 `json:"cpu"` + } `json:"monit"` +} + +type jlist []jlistItem + +func (list jlist) toList() List { + var result List + for _, current := range list { + item := ListItem{ + Name: current.Name, + Status: current.PM2Env.Status, + Restart: current.PM2Env.RestartTime, + Memory: current.Monit.Memory, // TODO humanize? + CPU: current.Monit.CPU, + } + result = append(result, item) + } + return result +} + +func (list jlist) isOnline(p Process) bool { + const onlineStatus string = "online" + for _, item := range list { + if item.Name == p.ID() { + return item.PM2Env.Status == onlineStatus + } + } + return false +} + +func (list jlist) memory(p Process) (int64, error) { + const op string = "process.jlist.memory" + for _, item := range list { + if item.Name == p.ID() { + return item.Monit.Memory, nil + } + } + return 0, xerror.New( + op, + fmt.Errorf("'%s' does not exist in the list of PM2 processes", p.ID()), + ) +} + +type command string + +const ( + startCommand command = "start" + restartCommand command = "restart" + stopCommand command = "stop" + logsCommand command = "logs" + jlistCommand command = "jlist" +) + +const maximumRestartAttempts uint = 3 + +type pm2Manager struct { + logger xlog.Logger + config conf.Config + pool map[Key][]Process + list *jlist + listLock *sync.Mutex +} + +// NewPM2Manager returns a PM2 manager. +func NewPM2Manager(logger xlog.Logger, config conf.Config) Manager { + const op string = "process.NewPM2Manager" + m := &pm2Manager{ + logger: logger, + config: config, + pool: make(map[Key][]Process), + listLock: &sync.Mutex{}, + } + if !config.DisableGoogleChrome() { + processes := make([]Process, 2) + availablePort := 9222 + // TODO from config + for i := 0; i < 2; i++ { + proc := chromeProcess{ + host: "127.0.0.1", + port: availablePort, + } + proc.id = fmt.Sprintf("%s-%d", proc.binary(), proc.port) + processes[i] = proc + logger.DebugfOp(op, "added new process %v", proc) + availablePort++ + } + m.pool[ChromeKey] = processes + } + if !config.DisableUnoconv() { + processes := make([]Process, 2) + availablePort := 2002 + // TODO from config + for i := 0; i < 2; i++ { + proc := sofficeProcess{ + host: "127.0.0.1", + port: availablePort, + } + proc.id = fmt.Sprintf("%s-%d", proc.binary(), proc.port) + processes[i] = proc + logger.DebugfOp(op, "added new process %v", proc) + availablePort++ + } + m.pool[SofficeKey] = processes + } + // update the manager processes list + // only if there are processes. + if !config.DisableGoogleChrome() || !config.DisableUnoconv() { + go m.jlistTimer() + } + return m +} + +func (m *pm2Manager) jlistTimer() { + const op string = "process.pm2Manager.jlistTimer" + duration := xtime.Duration(10) + resolver := func() error { + m.listLock.Lock() + defer m.listLock.Unlock() + out, err := exec. + Command("pm2", string(jlistCommand)). + Output() + if err != nil { + return err + } + data := &jlist{} + if err := json.Unmarshal(out, data); err != nil { + return err + } + m.list = data + return nil + } + // update every x seconds the + // list from the manager. + for range time.Tick(duration) { + if err := resolver(); err != nil { + m.logger.ErrorOp(op, xerror.New(op, err)) + } + } +} + +func (m *pm2Manager) Start() error { + const op string = "process.pm2Manager.Start" + for _, processes := range m.pool { + for _, proc := range processes { + if err := m.start(proc); err != nil { + return xerror.New(op, err) + } + } + } + return nil +} + +func (m *pm2Manager) start(p Process) error { + const op string = "process.pm2Manager.start" + resolver := func() error { + // first, we try to start the process. + if err := m.run(startCommand, p); err != nil { + return err + } + // we wait the process to be ready. + m.warmup(p) + // if the process failed to start correctly, + // we have to restart it. + if !m.IsViable(p) && maximumRestartAttempts > 0 { + return m.Restart(p) + } + // the process is viable, let's log its + // output. + return m.logs(p) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (m *pm2Manager) List() List { + m.listLock.Lock() + defer m.listLock.Unlock() + return m.list.toList() +} + +func (m *pm2Manager) All() []Process { + var result []Process + for _, processes := range m.pool { + result = append(result, processes...) + } + return result +} + +func (m *pm2Manager) Processes(key Key) []Process { + return m.pool[key] +} + +func (m *pm2Manager) Restart(p Process) error { + const op string = "process.pm2Manager.Restart" + resolver := func() error { + var attempts uint + for attempts < maximumRestartAttempts { + // we restart the process. + if err := m.run(restartCommand, p); err != nil { + return err + } + // we wait the process to be ready. + m.warmup(p) + attempts++ + // if the process is viable, we + // leave. + if m.IsViable(p) { + return m.logs(p) + } + } + return fmt.Errorf("failed to start '%s'", p.ID()) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (m *pm2Manager) Stop(p Process) error { + const op string = "process.pm2Manager.Stop" + if err := m.run(stopCommand, p); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (m *pm2Manager) IsViable(p Process) bool { + if !p.viabilityFunc()(m.logger) { + return false + } + m.listLock.Lock() + defer m.listLock.Unlock() + return m.list.isOnline(p) +} + +func (m *pm2Manager) Memory(p Process) (int64, error) { + const op string = "process.pm2Manager.Memory" + m.listLock.Lock() + defer m.listLock.Unlock() + memory, err := m.list.memory(p) + if err != nil { + return 0, xerror.New(op, err) + } + return memory, nil +} + +func (m *pm2Manager) warmup(p Process) { + const op string = "process.pm2Manager.warmup" + warmupTime := p.warmupTime() + m.logger.DebugfOp( + op, + "waiting '%v' for allowing '%s' to warmup", + warmupTime, + p.ID(), + ) + time.Sleep(warmupTime) +} + +func (m *pm2Manager) logs(p Process) error { + const op string = "process.pm2Manager.logs" + if m.config.LogLevel() == xlog.DebugLevel { + if err := m.run(logsCommand, p); err != nil { + return xerror.New(op, err) + } + } + return nil +} + +func (m *pm2Manager) run(pm2Cmd command, p Process) error { + const op string = "process.pm2Manager.run" + resolver := func() error { + args := []string{ + string(pm2Cmd), + p.binary(), + } + if pm2Cmd == startCommand { + args = append(args, fmt.Sprintf("--name=%s", p.ID())) + args = append(args, "--interpreter=none", "--") + args = append(args, p.args()...) + } + cmd, err := xexec.Command(m.logger, "pm2", args...) + if err != nil { + return err + } + xexec.LogBeforeExecute(m.logger, cmd) + return cmd.Start() + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = Manager(new(pm2Manager)) +) diff --git a/internal/pkg/process/process.go b/internal/pkg/process/process.go new file mode 100644 index 00000000..898d53bc --- /dev/null +++ b/internal/pkg/process/process.go @@ -0,0 +1,40 @@ +package process + +import ( + "time" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +type Process interface { + ID() string + Host() string + Port() int + binary() string + args() []string + warmupTime() time.Duration + viabilityFunc() func(logger xlog.Logger) bool +} + +type ListItem struct { + Name string `json:"name"` + Status string `json:"status"` + Restart int64 `json:"restart"` + Memory int64 `json:"memory"` + CPU float64 `json:"cpu"` +} + +type List []ListItem + +type Key string + +type Manager interface { + Start() error + List() List + All() []Process + Processes(key Key) []Process + Restart(proc Process) error + Stop(proc Process) error + IsViable(proc Process) bool + Memory(proc Process) (int64, error) +} diff --git a/internal/pkg/process/soffice.go b/internal/pkg/process/soffice.go new file mode 100644 index 00000000..4f7a3be9 --- /dev/null +++ b/internal/pkg/process/soffice.go @@ -0,0 +1,74 @@ +package process + +import ( + "fmt" + "time" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +const SofficeKey Key = "soffice" + +type sofficeProcess struct { + id string + host string + port int +} + +// NewSofficeProcess returns a LibreOffice +// headless process. +func NewSofficeProcess(id, host string, port int) Process { + return sofficeProcess{ + id: id, + host: host, + port: port, + } +} + +func (p sofficeProcess) ID() string { + return p.id +} + +func (p sofficeProcess) Host() string { + return p.host +} + +func (p sofficeProcess) Port() int { + return p.port +} + +func (p sofficeProcess) binary() string { + return "soffice" +} + +func (p sofficeProcess) args() []string { + return []string{ + // see https://ask.libreoffice.org/en/question/42975/how-can-i-run-multiple-instances-of-sofficebin-at-a-time/. + fmt.Sprintf("-env:UserInstallation=file:///tmp/%d", p.port), + "--headless", + "--invisible", + "--nocrashreport", + "--nodefault", + "--nofirststartwizard", + "--nologo", + "--norestore", + fmt.Sprintf("--accept=socket,host=%s,port=%d,tcpNoDelay=1;urp;StarOffice.ComponentContext", p.host, p.port), + } +} + +func (p sofficeProcess) warmupTime() time.Duration { + return 3 * time.Second +} + +func (p sofficeProcess) viabilityFunc() func(logger xlog.Logger) bool { + const op string = "process.sofficeProcess.viabilityFunc" + return func(logger xlog.Logger) bool { + // TODO find a way to check. + return true + } +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = Process(new(sofficeProcess)) +) diff --git a/internal/pkg/xerrgroup/doc.go b/internal/pkg/xerrgroup/doc.go new file mode 100644 index 00000000..2134c8cb --- /dev/null +++ b/internal/pkg/xerrgroup/doc.go @@ -0,0 +1,6 @@ +/* +Package xerrgroup helps running +many functions simultaneously and wait until +execution has completed or an error is encountered. +*/ +package xerrgroup diff --git a/internal/pkg/xerrgroup/xerrgroup.go b/internal/pkg/xerrgroup/xerrgroup.go new file mode 100644 index 00000000..fb4d0e24 --- /dev/null +++ b/internal/pkg/xerrgroup/xerrgroup.go @@ -0,0 +1,20 @@ +package xerrgroup + +import ( + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "golang.org/x/sync/errgroup" +) + +// Run runs all functions simultaneously and wait until +// execution has completed or an error is encountered. +func Run(fn ...func() error) error { + const op string = "xerrgroup.Run" + eg := errgroup.Group{} + for _, f := range fn { + eg.Go(f) + } + if err := eg.Wait(); err != nil { + return xerror.New(op, err) + } + return nil +} diff --git a/loadtesting/README.md b/loadtesting/README.md new file mode 100644 index 00000000..a55a3e1b --- /dev/null +++ b/loadtesting/README.md @@ -0,0 +1,113 @@ +# Load testing + +You may wonder how Gotenberg behaves under load. + +In order to help you having an idea, we created a bunch of scenarios for the +[k6](https://docs.k6.io/docs) load testing tool. + +The Gotenberg container (version `6.0.0` and default options) was hosted on a AWS EC2 `t2.micro` instance (1 vCPU and 1 Go of RAM, low to average network performances). + +The k6 scenarios have been performed on a MacBook Pro 2016 (2 GHz Intel Core i5 and 16 Go 1867 MHz LPDDR3). + +## HTML + +The HTML scenario is quite simple: + +* Ramp up from 0 to 100 virtual users, each one uploading as many time as possible the [HTML test data](../test/testdata/html). +* Stop when at least one response is not an HTTP 200 code. + +```bash +$ k6 run --env MAX_VUS=100 --env BASE_URL=http://ec2-foo.eu-west-1.compute.amazonaws.com html.js + + /\ |‾‾| /‾‾/ /‾/ + /\ / \ | |_/ / / / + / \/ \ | | / ‾‾\ + / \ | |‾\ \ | (_) | + / __________ \ |__| \__\ \___/ .io + + execution: local + output: - + script: html.js + + duration: -, iterations: - + vus: 1, max: 100 + + done [==========================================================] 1m11.9s / 10m0s + + ✗ is status 200 + ↳ 99% — ✓ 179 / ✗ 1 + ✗ is not status 504 + ↳ 99% — ✓ 179 / ✗ 1 + ✓ is not status 500 + + checks.....................: 99.62% ✓ 538 ✗ 2 + data_received..............: 41 MB 576 kB/s + data_sent..................: 8.5 MB 118 kB/s + ✗ failed requests............: 1 0.013895/s + http_req_blocked...........: avg=1.58ms min=2µs med=5µs max=59.73ms p(90)=10.19µs p(95)=20.57ms + http_req_connecting........: avg=1.56ms min=0s med=0s max=59.61ms p(90)=0s p(95)=20.48ms + http_req_duration..........: avg=2.3s min=1.32s med=1.67s max=10.2s p(90)=4.41s p(95)=7.54s + http_req_receiving.........: avg=99.01ms min=127µs med=98.4ms max=154.86ms p(90)=115.92ms p(95)=122.42ms + http_req_sending...........: avg=232.69µs min=133µs med=207µs max=1.16ms p(90)=335.4µs p(95)=382.64µs + http_req_tls_handshaking...: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s + http_req_waiting...........: avg=2.2s min=1.21s med=1.56s max=10.2s p(90)=4.32s p(95)=7.45s + http_reqs..................: 180 2.501138/s + iteration_duration.........: avg=2.3s min=1.33s med=1.67s max=10.22s p(90)=4.45s p(95)=7.54s + iterations.................: 180 2.501138/s + vus........................: 12 min=1 max=12 + vus_max....................: 100 min=100 max=100 +``` + +In our use case, when reaching 12 virtual users (~2,5 requests per second), some incoming requests cannot be fulfilled before 10 seconds (`DEFAULT_WAIT_TIMEOUT` value). +During this test, CPU usage went from 0 to 100% and memory usage stayed low (Google Chrome go from 64.1 MB to 64.9 MB). + +## Office + +The Office scenario is the same as the HTML scenario, but with a [document.docx](../test/testdata/office/document.docx). + +```bash +$ k6 run --env MAX_VUS=100 --env BASE_URL=http://ec2-foo.eu-west-1.compute.amazonaws.com office.js + + /\ |‾‾| /‾‾/ /‾/ + /\ / \ | |_/ / / / + / \/ \ | | / ‾‾\ + / \ | |‾\ \ | (_) | + / __________ \ |__| \__\ \___/ .io + + execution: local + output: - + script: office.js + + duration: -, iterations: - + vus: 1, max: 100 + + done [==========================================================] 2m7.9s / 10m0s + + ✗ is status 200 + ↳ 99% — ✓ 481 / ✗ 3 + ✗ is not status 504 + ↳ 99% — ✓ 481 / ✗ 3 + ✓ is not status 500 + + checks.....................: 99.58% ✓ 1446 ✗ 6 + data_received..............: 40 MB 312 kB/s + data_sent..................: 45 MB 348 kB/s + ✗ failed requests............: 3 0.023446/s + http_req_blocked...........: avg=1.85ms min=2µs med=5µs max=373.57ms p(90)=12.69µs p(95)=23.84µs + http_req_connecting........: avg=1.11ms min=0s med=0s max=47.62ms p(90)=0s p(95)=0s + http_req_duration..........: avg=2.65s min=289.89ms med=2.48s max=10.08s p(90)=4.51s p(95)=5.43s + http_req_receiving.........: avg=57.15ms min=79µs med=51.53ms max=200.89ms p(90)=81.12ms p(95)=91.61ms + http_req_sending...........: avg=387.86µs min=159µs med=332µs max=3.87ms p(90)=513.1µs p(95)=695µs + http_req_tls_handshaking...: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s + http_req_waiting...........: avg=2.59s min=264.48ms med=2.4s max=10.08s p(90)=4.45s p(95)=5.37s + http_reqs..................: 484 3.782635/s + iteration_duration.........: avg=2.65s min=290.24ms med=2.48s max=10.08s p(90)=4.51s p(95)=5.43s + iterations.................: 484 3.782635/s + vus........................: 22 min=1 max=22 + vus_max....................: 100 min=100 max=100 +``` + +In our use case, when reaching 22 virtual users (~3,7 requests per second), some incoming requests cannot be fulfilled before 10 seconds (`DEFAULT_WAIT_TIMEOUT` value). +During this test, CPU usage went from 0 to 100% and memory usage stayed low. + +## Merge \ No newline at end of file diff --git a/loadtesting/html.js b/loadtesting/html.js new file mode 100644 index 00000000..b6965a35 --- /dev/null +++ b/loadtesting/html.js @@ -0,0 +1,44 @@ +import http from "k6/http"; +import { Counter } from "k6/metrics"; +import { check } from "k6"; + +let indexFile = open("../test/testdata/html/index.html", "b"), + styleFile = open("../test/testdata/html/style.css", "b"), + headerFile = open("../test/testdata/html/header.html", "b"), + footerFile = open("../test/testdata/html/footer.html", "b"), + fontFile = open("../test/testdata/html/font.woff", "b"), + imgFile = open("../test/testdata/html/img.gif", "b"); + +let failCounter = new Counter("failed requests"); + +export let options = { + stages: [ + { duration: "10m", target: __ENV.MAX_VUS } + ], + thresholds: { + "failed requests": [{ + threshold: "count<1", + abortOnFail: true, + }] + } +} + +export default function() { + let data = { + "index.html": http.file(indexFile, "index.html"), + "style.css": http.file(styleFile, "style.css"), + "header.html": http.file(headerFile, "header.html"), + "footer.html": http.file(footerFile, "footer.html"), + "font.woff": http.file(fontFile, "font.woff"), + "img.gif": http.file(imgFile, "img.gif") + } + let res = http.post(__ENV.BASE_URL + '/convert/html', data); + check(res, { + "is status 200": (r) => r.status === 200, + "is not status 504": (r) => r.status !== 504, + "is not status 500": (r) => r.status !== 500 + }); + if (res.status !== 200) { + failCounter.add(1); + } +} \ No newline at end of file diff --git a/loadtesting/merge.js b/loadtesting/merge.js new file mode 100644 index 00000000..6229743a --- /dev/null +++ b/loadtesting/merge.js @@ -0,0 +1,18 @@ +import http from "k6/http"; +import { check } from "k6"; + +let pdf1File = open("../test/testdata/pdf/gotenberg.pdf", "b"), + pdf2File = open("../test/testdata/pdf/gotenberg_bis.pdf", "b"); + +export default function() { + var data = { + "gotenberg.pdf": http.file(pdf1File, "gotenberg.pdf"), + "gotenberg_bis.pdf": http.file(pdf2File, "gotenberg_bis.pdf") + } + var res = http.post(__ENV.BASE_URL + '/merge', data); + check(res, { + "is status 200": (r) => r.status === 200, + "is not status 504": (r) => r.status !== 504, + "is not status 500": (r) => r.status !== 500, + }); +} \ No newline at end of file diff --git a/loadtesting/office.js b/loadtesting/office.js new file mode 100644 index 00000000..6df88069 --- /dev/null +++ b/loadtesting/office.js @@ -0,0 +1,34 @@ +import http from "k6/http"; +import { Counter } from "k6/metrics"; +import { check } from "k6"; + +let documentFile = open("../test/testdata/office/document.docx", "b"); + +let failCounter = new Counter("failed requests"); + +export let options = { + stages: [ + { duration: "10m", target: __ENV.MAX_VUS } + ], + thresholds: { + "failed requests": [{ + threshold: "count<1", + abortOnFail: true, + }] + } +} + +export default function() { + let data = { + "document.docx": http.file(documentFile, "document.docx") + } + let res = http.post(__ENV.BASE_URL + '/convert/office', data); + check(res, { + "is status 200": (r) => r.status === 200, + "is not status 504": (r) => r.status !== 504, + "is not status 500": (r) => r.status !== 500, + }); + if (res.status !== 200) { + failCounter.add(1); + } +} \ No newline at end of file From 88f74d5e9c1d69d18f6e7783deff200f932005fa Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 23 Sep 2019 18:29:24 +0200 Subject: [PATCH 085/107] process balancing: better implementation (wip) --- cmd/gotenberg/main.go | 29 +- internal/app/xhttp/handler.go | 91 +++--- internal/app/xhttp/middleware.go | 10 +- internal/app/xhttp/option.go | 28 +- internal/app/xhttp/pkg/context/context.go | 62 +--- internal/app/xhttp/xhttp.go | 10 +- internal/pkg/conf/conf.go | 10 + internal/pkg/prinery/chrome.go | 327 +++++++++++++++++++ internal/pkg/prinery/markdown.go | 68 ++++ internal/pkg/prinery/merge.go | 39 +++ internal/pkg/prinery/pm2.go | 365 ++++++++++++++++++++++ internal/pkg/prinery/prinery.go | 171 ++++------ internal/pkg/prinery/soffice.go | 158 ++++++++++ internal/pkg/prinery/unit.go | 125 ++++++++ internal/pkg/print/html.go | 18 -- internal/pkg/print/office.go | 21 +- 16 files changed, 1270 insertions(+), 262 deletions(-) create mode 100644 internal/pkg/prinery/chrome.go create mode 100644 internal/pkg/prinery/markdown.go create mode 100644 internal/pkg/prinery/merge.go create mode 100644 internal/pkg/prinery/pm2.go create mode 100644 internal/pkg/prinery/soffice.go create mode 100644 internal/pkg/prinery/unit.go delete mode 100644 internal/pkg/print/html.go diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 1cbf44f2..d32b3440 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -9,7 +9,6 @@ import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" - "github.com/thecodingmachine/gotenberg/internal/pkg/process" "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) @@ -27,30 +26,18 @@ func main() { } systemLogger.InfofOp(op, "Gotenberg %s", version) systemLogger.DebugfOp(op, "configuration: %+v", config) - // create PM2 manager and start processes. - manager := process.NewPM2Manager(systemLogger, config) - if err := manager.Start(); err != nil { + // create our prinery. + prinry, err := prinery.NewPM2Prinery(systemLogger, config) + if err != nil { systemLogger.FatalOp(op, err) } - // create prineries. - var chromePrinery *prinery.Prinery - if !config.DisableGoogleChrome() { - chromePrinery, err = prinery.New(systemLogger, manager, process.ChromeKey) - if err != nil { - systemLogger.FatalOp(op, err) - } - go chromePrinery.Start() - } - var sofficePrinery *prinery.Prinery - if !config.DisableUnoconv() { - sofficePrinery, err = prinery.New(systemLogger, manager, process.SofficeKey) - if err != nil { - systemLogger.FatalOp(op, err) - } - go sofficePrinery.Start() + // TODO use chan + // TODO stop prinery + if err = prinry.Start(make(chan error, 1)); err != nil { + systemLogger.FatalOp(op, err) } // create our API. - srv := xhttp.New(config, manager, chromePrinery, sofficePrinery) + srv := xhttp.New(config, prinry) // run our API in a goroutine so that it doesn't block. go func() { systemLogger.InfofOp(op, "http server started on port '%d'", config.DefaultListenPort()) diff --git a/internal/app/xhttp/handler.go b/internal/app/xhttp/handler.go index fce3bf6f..7c43d537 100644 --- a/internal/app/xhttp/handler.go +++ b/internal/app/xhttp/handler.go @@ -1,6 +1,7 @@ package xhttp import ( + timeoutContext "context" "fmt" "net/http" "os" @@ -9,8 +10,6 @@ import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/context" "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" - "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" - "github.com/thecodingmachine/gotenberg/internal/pkg/print" "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" @@ -72,8 +71,11 @@ func mergeHandler(c echo.Context) error { if err != nil { return err } - p := print.NewMergePrint(logger, fpaths) - return convert(ctx, nil, p, timeout) + prinry := ctx.Prinery() + printFunc := func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error { + return prinry.Merge(ctx, logger, dest, fpaths) + } + return convert(ctx, timeout, printFunc) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -87,7 +89,6 @@ func htmlHandler(c echo.Context) error { const op string = "xhttp.htmlHandler" resolver := func() error { ctx := context.MustCastFromEchoContext(c) - prinry := ctx.MustChromePrinery() logger := ctx.XLogger() logger.DebugOp(op, "handling HTML request...") config := ctx.Config() @@ -104,8 +105,11 @@ func htmlHandler(c echo.Context) error { if err != nil { return err } - p := print.NewHTMLPrint(logger, fpath, opts) - return convert(ctx, prinry, p, timeout) + prinry := ctx.Prinery() + printFunc := func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error { + return prinry.HTML(ctx, logger, dest, fpath, opts) + } + return convert(ctx, timeout, printFunc) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -119,7 +123,6 @@ func urlHandler(c echo.Context) error { const op string = "xhttp.urlHandler" resolver := func() error { ctx := context.MustCastFromEchoContext(c) - prinry := ctx.MustChromePrinery() logger := ctx.XLogger() logger.DebugOp(op, "handling URL request...") config := ctx.Config() @@ -143,8 +146,11 @@ func urlHandler(c echo.Context) error { if err != nil { return err } - p := print.NewURLPrint(logger, remoteURL, opts) - return convert(ctx, prinry, p, timeout) + prinry := ctx.Prinery() + printFunc := func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error { + return prinry.URL(ctx, logger, dest, remoteURL, opts) + } + return convert(ctx, timeout, printFunc) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -158,7 +164,6 @@ func markdownHandler(c echo.Context) error { const op string = "xhttp.markdownHandler" resolver := func() error { ctx := context.MustCastFromEchoContext(c) - prinry := ctx.MustChromePrinery() logger := ctx.XLogger() logger.DebugOp(op, "handling Markdown request...") config := ctx.Config() @@ -175,11 +180,11 @@ func markdownHandler(c echo.Context) error { if err != nil { return err } - p, err := print.NewMarkdownPrint(logger, fpath, opts) - if err != nil { - return err + prinry := ctx.Prinery() + printFunc := func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error { + return prinry.Markdown(ctx, logger, dest, fpath, opts) } - return convert(ctx, prinry, p, timeout) + return convert(ctx, timeout, printFunc) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -193,7 +198,6 @@ func officeHandler(c echo.Context) error { const op string = "xhttp.officeHandler" resolver := func() error { ctx := context.MustCastFromEchoContext(c) - prinry := ctx.MustSofficePrinery() logger := ctx.XLogger() logger.DebugOp(op, "handling Office request...") config := ctx.Config() @@ -202,7 +206,7 @@ func officeHandler(c echo.Context) error { if err != nil { return err } - opts, err := officePrintOptions(r, config) + opts, err := unoconvPrintOptions(r, config) if err != nil { return err } @@ -223,8 +227,11 @@ func officeHandler(c echo.Context) error { if err != nil { return err } - p := print.NewOfficePrint(logger, fpaths, opts) - return convert(ctx, prinry, p, timeout) + prinry := ctx.Prinery() + printFunc := func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error { + return prinry.Office(ctx, logger, dest, fpaths, opts) + } + return convert(ctx, timeout, printFunc) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -232,7 +239,11 @@ func officeHandler(c echo.Context) error { return nil } -func convert(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, timeout float64) error { +func convert( + ctx context.Context, + timeout float64, + printFunc func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error, +) error { const op string = "xhttp.convert" resolver := func() error { logger := ctx.XLogger() @@ -245,13 +256,13 @@ func convert(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, tim // or an error. if !r.HasArg(resource.WebhookURLArgKey) { logger.DebugfOp(op, "no '%s' found, converting synchronously", resource.WebhookURLArgKey) - return convertSync(ctx, prinry, prnt, timeout, filename, fpath) + return convertSync(ctx, timeout, filename, fpath, printFunc) } // as a webhook URL has been given, we // run the following lines in a goroutine so that // it doesn't block. logger.DebugfOp(op, "'%s' found, converting asynchronously", resource.WebhookURLArgKey) - return convertAsync(ctx, prinry, prnt, timeout, filename, fpath) + return convertAsync(ctx, timeout, filename, fpath, printFunc) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -259,19 +270,19 @@ func convert(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, tim return nil } -func convertSync(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, timeout float64, filename, fpath string) error { +func convertSync( + ctx context.Context, + timeout float64, + filename, dest string, + printFunc func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error, +) error { const op = "xhttp.convertSync" logger := ctx.XLogger() r := ctx.MustResource() timeoutCtx, cancel := xcontext.WithTimeout(logger, timeout) defer cancel() resolver := func() error { - if prinry == nil { - // case: merge. - if err := prnt.Print(timeoutCtx, fpath, nil); err != nil { - return err - } - } else if err := prinry.PrintRequest(timeoutCtx, logger, prnt, fpath); err != nil { + if err := printFunc(timeoutCtx, logger, dest); err != nil { return err } if !r.HasArg(resource.ResultFilenameArgKey) { @@ -281,7 +292,7 @@ func convertSync(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, resource.RemoteURLArgKey, filename, ) - if err := ctx.Attachment(fpath, filename); err != nil { + if err := ctx.Attachment(dest, filename); err != nil { return err } return nil @@ -295,7 +306,7 @@ func convertSync(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, if err != nil { return err } - if err := ctx.Attachment(fpath, filename); err != nil { + if err := ctx.Attachment(dest, filename); err != nil { return err } return nil @@ -309,7 +320,12 @@ func convertSync(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, return nil } -func convertAsync(ctx context.Context, prinry *prinery.Prinery, prnt print.Print, timeout float64, filename, fpath string) error { +func convertAsync( + ctx context.Context, + timeout float64, + filename, dest string, + printFunc func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error, +) error { const op = "xhttp.convertAsync" logger := ctx.XLogger() r := ctx.MustResource() @@ -325,19 +341,12 @@ func convertAsync(ctx context.Context, prinry *prinery.Prinery, prnt print.Print defer r.Close() // nolint: errcheck timeoutCtx, cancel := xcontext.WithTimeout(logger, timeout) defer cancel() - if prinry == nil { - // case: merge. - if err := prnt.Print(timeoutCtx, fpath, nil); err != nil { - xerr := xerror.New(op, err) - logger.ErrorOp(xerror.Op(xerr), xerr) - return - } - } else if err := prinry.PrintRequest(timeoutCtx, logger, prnt, fpath); err != nil { + if err := printFunc(timeoutCtx, logger, dest); err != nil { xerr := xerror.New(op, err) logger.ErrorOp(xerror.Op(xerr), xerr) return } - f, err := os.Open(fpath) + f, err := os.Open(dest) if err != nil { xerr := xerror.New(op, err) logger.ErrorOp(xerror.Op(xerr), xerr) diff --git a/internal/app/xhttp/middleware.go b/internal/app/xhttp/middleware.go index 69f7b232..8119f963 100644 --- a/internal/app/xhttp/middleware.go +++ b/internal/app/xhttp/middleware.go @@ -8,7 +8,6 @@ import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" - "github.com/thecodingmachine/gotenberg/internal/pkg/process" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" @@ -16,12 +15,7 @@ import ( // contextMiddleware extends the default echo.Context with // our custom context.Context. -func contextMiddleware( - config conf.Config, - manager process.Manager, - chromePrinery *prinery.Prinery, - sofficePrinery *prinery.Prinery, -) echo.MiddlewareFunc { +func contextMiddleware(config conf.Config, prinry prinery.Prinery) echo.MiddlewareFunc { return func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { // generate a unique identifier for the request. @@ -31,7 +25,7 @@ func contextMiddleware( logger := xlog.New(config.LogLevel(), trace) // extend the current echo context with our custom // context. - ctx := context.New(c, logger, config, manager, chromePrinery, sofficePrinery) + ctx := context.New(c, logger, config, prinry) // if its an healthcheck request, there // is no need to create a Resource. if ctx.Path() == pingEndpoint { diff --git a/internal/app/xhttp/option.go b/internal/app/xhttp/option.go index 0f1131a4..1c4f8ca6 100644 --- a/internal/app/xhttp/option.go +++ b/internal/app/xhttp/option.go @@ -3,37 +3,37 @@ package xhttp import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/print" + "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" ) -func chromePrintOptions(r resource.Resource, config conf.Config) (print.ChromePrintOptions, error) { +func chromePrintOptions(r resource.Resource, config conf.Config) (prinery.ChromePrintOptions, error) { const op string = "xhttp.chromePrintOptions" - resolver := func() (print.ChromePrintOptions, error) { + resolver := func() (prinery.ChromePrintOptions, error) { waitDelay, err := resource.WaitDelayArg(r, config) if err != nil { - return print.ChromePrintOptions{}, err + return prinery.ChromePrintOptions{}, err } headerHTML, footerHTML, err := resource.HeaderFooterContents(r, config) if err != nil { - return print.ChromePrintOptions{}, err + return prinery.ChromePrintOptions{}, err } paperWidth, paperHeight, err := resource.PaperSizeArgs(r, config) if err != nil { - return print.ChromePrintOptions{}, err + return prinery.ChromePrintOptions{}, err } marginTop, marginBottom, marginLeft, marginRight, err := resource.MarginArgs(r, config) if err != nil { - return print.ChromePrintOptions{}, err + return prinery.ChromePrintOptions{}, err } landscape, err := r.BoolArg(resource.LandscapeArgKey, false) if err != nil { - return print.ChromePrintOptions{}, err + return prinery.ChromePrintOptions{}, err } - return print.ChromePrintOptions{ + return prinery.ChromePrintOptions{ WaitDelay: waitDelay, HeaderHTML: headerHTML, FooterHTML: footerHTML, @@ -53,14 +53,14 @@ func chromePrintOptions(r resource.Resource, config conf.Config) (print.ChromePr return opts, nil } -func officePrintOptions(r resource.Resource, config conf.Config) (print.OfficePrintOptions, error) { - const op string = "xhttp.officePrintOptions" - resolver := func() (print.OfficePrintOptions, error) { +func unoconvPrintOptions(r resource.Resource, config conf.Config) (prinery.UnoconvPrintOptions, error) { + const op string = "xhttp.unoconvPrintOptions" + resolver := func() (prinery.UnoconvPrintOptions, error) { landscape, err := r.BoolArg(resource.LandscapeArgKey, false) if err != nil { - return print.OfficePrintOptions{}, err + return prinery.UnoconvPrintOptions{}, err } - return print.OfficePrintOptions{ + return prinery.UnoconvPrintOptions{ Landscape: landscape, }, nil } diff --git a/internal/app/xhttp/pkg/context/context.go b/internal/app/xhttp/pkg/context/context.go index 0012b73c..75cc9add 100644 --- a/internal/app/xhttp/pkg/context/context.go +++ b/internal/app/xhttp/pkg/context/context.go @@ -14,7 +14,6 @@ import ( "github.com/thecodingmachine/gotenberg/internal/pkg/conf" "github.com/thecodingmachine/gotenberg/internal/pkg/normalize" "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" - "github.com/thecodingmachine/gotenberg/internal/pkg/process" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) @@ -22,13 +21,11 @@ import ( // Context extends the default echo.Context. type Context struct { echo.Context - logger xlog.Logger - config conf.Config - manager process.Manager - chromePrinery *prinery.Prinery - sofficePrinery *prinery.Prinery - resource resource.Resource - startTime time.Time + logger xlog.Logger + config conf.Config + prinry prinery.Prinery + resource resource.Resource + startTime time.Time } // New creates a new Context. @@ -36,17 +33,13 @@ func New( c echo.Context, logger xlog.Logger, config conf.Config, - manager process.Manager, - chromePrinery *prinery.Prinery, - sofficePrinery *prinery.Prinery, + prinry prinery.Prinery, ) Context { return Context{ c, logger, config, - manager, - chromePrinery, - sofficePrinery, + prinry, resource.Resource{}, time.Now(), } @@ -89,7 +82,8 @@ func (ctx Context) Config() conf.Config { // one of the processes is not viable. func (ctx Context) ProcessesHealthcheck() error { const op string = "context.Context.ProcessesHealthcheck" - processes := ctx.manager.All() + // TODO + /*processes := ctx.manager.All() for _, p := range processes { if !ctx.manager.IsViable(p) { return xerror.New( @@ -97,42 +91,14 @@ func (ctx Context) ProcessesHealthcheck() error { fmt.Errorf("'%s' is not viable", p.ID()), ) } - } + }*/ return nil } -/* -MustChromePrinery returns the instance of -prinery.Prinery associated with the Context. - -This prinery.Prinery handles Google Chrome -headless. - -It panics if no instance of prinery.Prinery. -*/ -func (ctx Context) MustChromePrinery() *prinery.Prinery { - const op string = "context.Context.MustChromePrinery" - if ctx.chromePrinery == nil { - panic(fmt.Sprintf("%s: unable to retrieve the instance of Google Chrome Headless prinery.Prinery from our custom context.Context", op)) - } - return ctx.chromePrinery -} - -/* -MustSofficePrinery returns the instance of -prinery.Prinery associated with the Context. - -This prinery.Prinery handles LibreOffice -headless. - -It panics if no instance of prinery.Prinery. -*/ -func (ctx Context) MustSofficePrinery() *prinery.Prinery { - const op string = "context.Context.MustSofficePrinery" - if ctx.sofficePrinery == nil { - panic(fmt.Sprintf("%s: unable to retrieve the instance of LibreOffice Headless prinery.Prinery from our custom context.Context", op)) - } - return ctx.sofficePrinery +// Prinery returns the instance of prinery.Prinery +// associated with the Context. +func (ctx Context) Prinery() prinery.Prinery { + return ctx.prinry } // WithResource creates a resource.Resource and diff --git a/internal/app/xhttp/xhttp.go b/internal/app/xhttp/xhttp.go index 5d402964..6b0da703 100644 --- a/internal/app/xhttp/xhttp.go +++ b/internal/app/xhttp/xhttp.go @@ -4,20 +4,14 @@ import ( "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" - "github.com/thecodingmachine/gotenberg/internal/pkg/process" ) // New returns a custom echo.Echo. -func New( - config conf.Config, - manager process.Manager, - chromePrinery *prinery.Prinery, - sofficePrinery *prinery.Prinery, -) *echo.Echo { +func New(config conf.Config, prinry prinery.Prinery) *echo.Echo { srv := echo.New() srv.HideBanner = true srv.HidePort = true - srv.Use(contextMiddleware(config, manager, chromePrinery, sofficePrinery)) + srv.Use(contextMiddleware(config, prinry)) srv.Use(loggerMiddleware()) srv.Use(cleanupMiddleware()) srv.Use(errorMiddleware()) diff --git a/internal/pkg/conf/conf.go b/internal/pkg/conf/conf.go index d0aca24a..b3f76cbd 100644 --- a/internal/pkg/conf/conf.go +++ b/internal/pkg/conf/conf.go @@ -201,6 +201,16 @@ func (c Config) DefaultListenPort() int64 { return c.defaultListenPort } +func (c Config) GoogleChromeInstances() int64 { + // TODO: replace DisableGoogleChrome + return 2 +} + +func (c Config) SofficeInstances() int64 { + // TODO: replace DisableUnoconv + return 2 +} + /* DisableGoogleChrome returns true if Google Chrome is disabled in the diff --git a/internal/pkg/prinery/chrome.go b/internal/pkg/prinery/chrome.go new file mode 100644 index 00000000..8731054e --- /dev/null +++ b/internal/pkg/prinery/chrome.go @@ -0,0 +1,327 @@ +package prinery + +import ( + "context" + "fmt" + "io/ioutil" + "time" + + "github.com/mafredri/cdp" + "github.com/mafredri/cdp/devtool" + "github.com/mafredri/cdp/protocol/network" + "github.com/mafredri/cdp/protocol/page" + "github.com/mafredri/cdp/protocol/target" + "github.com/mafredri/cdp/rpcc" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerrgroup" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" +) + +type chromeProcess struct { + devtPort uint +} + +func newChromeProcesses(nInstances int64) []process { + processes := make([]process, nInstances) + var i int64 + var currentPort uint = 9222 + for i = 0; i < nInstances; i++ { + processes[i] = chromeProcess{ + devtPort: currentPort, + } + currentPort++ + } + return processes +} + +func (p chromeProcess) id() string { + return fmt.Sprintf("%s-%d", p.binary(), p.port()) +} + +func (p chromeProcess) host() string { + return "127.0.0.1" +} + +func (p chromeProcess) port() uint { + return p.devtPort +} + +func (p chromeProcess) spec() processSpec { + return p +} + +func (p chromeProcess) binary() string { + return "google-chrome-stable" +} + +func (p chromeProcess) args() []string { + return []string{ + "--no-sandbox", + "--headless", + // see https://github.com/GoogleChrome/puppeteer/issues/2410. + "--font-render-hinting=medium", + fmt.Sprintf("--remote-debugging-port=%d", p.port()), + "--disable-gpu", + "--disable-translate", + "--disable-extensions", + "--disable-background-networking", + "--safebrowsing-disable-auto-update", + "--disable-sync", + "--disable-default-apps", + "--hide-scrollbars", + "--metrics-recording-only", + "--mute-audio", + "--no-first-run", + } +} + +func (p chromeProcess) warmupTime() time.Duration { + return 10 * time.Second +} + +func (p chromeProcess) viabilityFunc() func(logger xlog.Logger) bool { + const op string = "prinery.chromeProcess.viabilityFunc" + return func(logger xlog.Logger) bool { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + endpoint := fmt.Sprintf("http://%s:%d" /*p.host()*/, "localhost", p.port()) + logger.DebugfOp( + op, + "checking '%s' viability via endpoint '%s/json/version'", + p.id(), + endpoint, + ) + v, err := devtool.New(endpoint).Version(ctx) + if err != nil { + logger.ErrorfOp( + op, + "'%s' is not viable as endpoint returned '%v'", + p.id(), + err, + ) + return false + } + logger.DebugfOp( + op, + "'%s' is viable as endpoint returned '%v'", + p.id(), + v, + ) + return true + } +} + +type chromePrinter struct { + logger xlog.Logger + url string + opts ChromePrintOptions +} + +func (p chromePrinter) print(ctx context.Context, spec processSpec, dest string) error { + const op string = "prinery.chromePrinter.print" + resolver := func() error { + devtEndpoint := fmt.Sprintf("http://%s:%d", spec.host(), spec.port()) + devt, err := devtool.New(devtEndpoint).Version(ctx) + if err != nil { + return err + } + // connect to WebSocket URL (page) that speaks the Chrome DevTools Protocol. + devtConn, err := rpcc.DialContext(ctx, devt.WebSocketDebuggerURL) + if err != nil { + return err + } + defer devtConn.Close() // nolint: errcheck + // create a new CDP Client that uses conn. + devtClient := cdp.NewClient(devtConn) + newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx) + if err != nil { + return err + } + /* + close the browser context when done. + we're not using the "default" context + as it may timeout before actually closing + the browser context. + see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 + */ + disposeBrowserContextArgs := target.NewDisposeBrowserContextArgs(newContextTarget.BrowserContextID) + defer devtClient.Target.DisposeBrowserContext(context.Background(), disposeBrowserContextArgs) // nolint: errcheck + // create a new blank target with the new browser context. + createTargetArgs := target. + NewCreateTargetArgs("about:blank"). + SetBrowserContextID(newContextTarget.BrowserContextID) + newTarget, err := devtClient.Target.CreateTarget(ctx, createTargetArgs) + if err != nil { + return err + } + // connect the client to the new target. + newTargetWsURL := fmt.Sprintf("ws://%s:%d/devtools/page/%s", spec.host(), spec.port(), newTarget.TargetID) + newContextConn, err := rpcc.DialContext(ctx, newTargetWsURL) + if err != nil { + return err + } + defer newContextConn.Close() // nolint: errcheck + // create a new CDP Client that uses newContextConn. + targetClient := cdp.NewClient(newContextConn) + /* + close the target when done. + we're not using the "default" context + as it may timeout before actually closing + the target. + see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 + */ + closeTargetArgs := target.NewCloseTargetArgs(newTarget.TargetID) + defer targetClient.Target.CloseTarget(context.Background(), closeTargetArgs) // nolint: errcheck + // enable all events. + if err := p.enableEvents(ctx, targetClient); err != nil { + return err + } + // listen for all events. + if err := p.listenEvents(ctx, targetClient); err != nil { + return err + } + // apply a wait delay (if any). + if p.opts.WaitDelay > 0.0 { + // wait for a given amount of time (useful for javascript delay). + p.logger.DebugfOp(op, "applying a wait delay of '%.2fs'...", p.opts.WaitDelay) + time.Sleep(xtime.Duration(p.opts.WaitDelay)) + } else { + p.logger.DebugOp(op, "no wait delay to apply, moving on...") + } + // print the page to PDF. + print, err := targetClient.Page.PrintToPDF( + ctx, + page.NewPrintToPDFArgs(). + SetPaperWidth(p.opts.PaperWidth). + SetPaperHeight(p.opts.PaperHeight). + SetMarginTop(p.opts.MarginTop). + SetMarginBottom(p.opts.MarginBottom). + SetMarginLeft(p.opts.MarginLeft). + SetMarginRight(p.opts.MarginRight). + SetLandscape(p.opts.Landscape). + SetDisplayHeaderFooter(true). + SetHeaderTemplate(p.opts.HeaderHTML). + SetFooterTemplate(p.opts.FooterHTML). + SetPrintBackground(true), + ) + if err != nil { + return err + } + if err := ioutil.WriteFile(dest, print.Data, 0644); err != nil { + return err + } + return nil + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (p chromePrinter) enableEvents(ctx context.Context, client *cdp.Client) error { + const op string = "prinery.chromePrinter.enableEvents" + // enable all the domain events that we're interested in. + if err := xerrgroup.Run( + func() error { return client.DOM.Enable(ctx) }, + func() error { return client.Network.Enable(ctx, network.NewEnableArgs()) }, + func() error { return client.Page.Enable(ctx) }, + func() error { + return client.Page.SetLifecycleEventsEnabled(ctx, page.NewSetLifecycleEventsEnabledArgs(true)) + }, + func() error { return client.Runtime.Enable(ctx) }, + ); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (p chromePrinter) listenEvents(ctx context.Context, client *cdp.Client) error { + const op string = "prinery.chromePrinter.listenEvents" + resolver := func() error { + // make sure Page events are enabled. + if err := client.Page.Enable(ctx); err != nil { + return err + } + // make sure Network events are enabled. + if err := client.Network.Enable(ctx, nil); err != nil { + return err + } + // create all clients for events. + domContentEventFired, err := client.Page.DOMContentEventFired(ctx) + if err != nil { + return err + } + defer domContentEventFired.Close() // nolint: errcheck + loadEventFired, err := client.Page.LoadEventFired(ctx) + if err != nil { + return err + } + defer loadEventFired.Close() // nolint: errcheck + lifecycleEvent, err := client.Page.LifecycleEvent(ctx) + if err != nil { + return err + } + defer lifecycleEvent.Close() // nolint: errcheck + loadingFinished, err := client.Network.LoadingFinished(ctx) + if err != nil { + return err + } + defer loadingFinished.Close() // nolint: errcheck + if _, err := client.Page.Navigate(ctx, page.NewNavigateArgs(p.url)); err != nil { + return err + } + // wait for all events. + return xerrgroup.Run( + func() error { + _, err := domContentEventFired.Recv() + if err != nil { + return err + } + p.logger.DebugOp(op, "event 'domContentEventFired' received") + return nil + }, + func() error { + _, err := loadEventFired.Recv() + if err != nil { + return err + } + p.logger.DebugOp(op, "event 'loadEventFired' received") + return nil + }, + func() error { + const networkIdleEventName string = "networkIdle" + for { + ev, err := lifecycleEvent.Recv() + if err != nil { + return err + } + p.logger.DebugfOp(op, "event '%s' received", ev.Name) + if ev.Name == networkIdleEventName { + break + } + } + return nil + }, + func() error { + _, err := loadingFinished.Recv() + if err != nil { + return err + } + p.logger.DebugOp(op, "event 'loadingFinished' received") + return nil + }, + ) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = processSpec(new(chromeProcess)) + _ = process(new(chromeProcess)) + _ = printer(new(chromePrinter)) +) diff --git a/internal/pkg/prinery/markdown.go b/internal/pkg/prinery/markdown.go new file mode 100644 index 00000000..0c3cdfcb --- /dev/null +++ b/internal/pkg/prinery/markdown.go @@ -0,0 +1,68 @@ +package prinery + +import ( + "bytes" + "fmt" + "html/template" + "io/ioutil" + "path/filepath" + + "github.com/microcosm-cc/bluemonday" + "github.com/russross/blackfriday/v2" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" +) + +func newMarkdownPrinter(logger xlog.Logger, fpath string, opts ChromePrintOptions) (printer, error) { + const op string = "prinery.newMarkdownPrinter" + resolver := func() (string, error) { + tmpl, err := template. + New(filepath.Base(fpath)). + Funcs(template.FuncMap{"toHTML": markdownToHTML}). + ParseFiles(fpath) + if err != nil { + return "", err + } + dirPath := filepath.Dir(fpath) + data := &templateData{DirPath: dirPath} + logger.DebugOp(op, "converting Markdown files to HTML...") + var buffer bytes.Buffer + if err := tmpl.Execute(&buffer, data); err != nil { + return "", err + } + baseFilename := xrand.Get() + dst := fmt.Sprintf("%s/%s.html", dirPath, baseFilename) + logger.DebugOp(op, "writing the HTML from previous conversion(s) into new file...") + if err := ioutil.WriteFile(dst, buffer.Bytes(), 0644); err != nil { + return "", err + } + return fmt.Sprintf("file://%s", dst), nil + } + URL, err := resolver() + if err != nil { + return nil, xerror.New(op, err) + } + return chromePrinter{ + logger: logger, + url: URL, + opts: opts, + }, nil +} + +type templateData struct { + DirPath string +} + +func markdownToHTML(dirPath, filename string) (template.HTML, error) { + const op string = "prinery.markdownToHTML" + fpath := fmt.Sprintf("%s/%s", dirPath, filename) + b, err := ioutil.ReadFile(fpath) + if err != nil { + return "", xerror.New(op, err) + } + unsafe := blackfriday.Run(b) + content := bluemonday.UGCPolicy().SanitizeBytes(unsafe) + /* #nosec */ + return template.HTML(content), nil +} diff --git a/internal/pkg/prinery/merge.go b/internal/pkg/prinery/merge.go new file mode 100644 index 00000000..377c6fc0 --- /dev/null +++ b/internal/pkg/prinery/merge.go @@ -0,0 +1,39 @@ +package prinery + +import ( + "context" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +type mergePrinter struct { + logger xlog.Logger + fpaths []string +} + +func (p mergePrinter) print(ctx context.Context, spec processSpec, dest string) error { + const op string = "prinery.mergePrinter.print" + p.logger.DebugfOp(op, "merging '%v'...", p.fpaths) + resolver := func() error { + var args []string + args = append(args, p.fpaths...) + args = append(args, "cat", "output", dest) + cmd, err := xexec.CommandContext(ctx, p.logger, "pdftk", args...) + if err != nil { + return err + } + xexec.LogBeforeExecute(p.logger, cmd) + return cmd.Run() + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = printer(new(mergePrinter)) +) diff --git a/internal/pkg/prinery/pm2.go b/internal/pkg/prinery/pm2.go new file mode 100644 index 00000000..8e4b954c --- /dev/null +++ b/internal/pkg/prinery/pm2.go @@ -0,0 +1,365 @@ +package prinery + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/thecodingmachine/gotenberg/internal/pkg/conf" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +type command string + +const ( + startCommand command = "start" + restartCommand command = "restart" + stopCommand command = "stop" + logsCommand command = "logs" + jlistCommand command = "jlist" +) + +const maximumRestartAttempts uint = 3 + +type pm2 struct { + logger xlog.Logger + config conf.Config + chromeUnit *unit + sofficeUnit *unit + processes []process +} + +func NewPM2Prinery(logger xlog.Logger, config conf.Config) (Prinery, error) { + const op string = "prinery.NewPM2Prinery" + resolver := func() (*pm2, error) { + m := &pm2{ + logger: logger, + config: config, + } + chromeProcesses := newChromeProcesses(config.GoogleChromeInstances()) + if len(chromeProcesses) > 0 { + unit, err := newUnit(logger, processesToSpecs(chromeProcesses)) + if err != nil { + return nil, err + } + m.chromeUnit = unit + } + sofficeProcesses := newSofficesProcesses(config.SofficeInstances()) + if len(sofficeProcesses) > 0 { + unit, err := newUnit(logger, processesToSpecs(sofficeProcesses)) + if err != nil { + return nil, err + } + m.sofficeUnit = unit + } + m.processes = append(chromeProcesses, sofficeProcesses...) + return m, nil + } + p, err := resolver() + if err != nil { + return nil, xerror.New(op, err) + } + return p, nil +} + +func (m *pm2) Start(emergency chan error) error { + const op string = "prinery.pm2.Start" + // start processes. + // those lines "works" but processes + // fail to start... + /*var wg sync.WaitGroup + result := make(chan error, len(m.processes)) + for _, proc := range m.processes { + wg.Add(1) + go func(proc process, result chan error) { + result <- m.start(proc) + wg.Done() + }(proc, result) + } + wg.Wait() + close(result) + for err := range result { + if err != nil { + return xerror.New(op, err) + } + }*/ + for _, proc := range m.processes { + if err := m.start(proc); err != nil { + return xerror.New(op, err) + } + } + // start units. + if m.chromeUnit != nil { + go m.chromeUnit.start(emergency) + } + if m.sofficeUnit != nil { + go m.sofficeUnit.start(emergency) + } + return nil +} + +func (m *pm2) HTML( + ctx context.Context, + logger xlog.Logger, + dest, fpath string, + opts ChromePrintOptions, +) error { + const op string = "prinery.pm2.HTML" + resolver := func() error { + if m.chromeUnit == nil { + return errors.New("cannot handle HTML print request as there is no chromeUnit") + } + URL := fmt.Sprintf("file://%s", fpath) + p := chromePrinter{ + logger: logger, + url: URL, + opts: opts, + } + req := request{ + ctx: ctx, + logger: logger, + printer: p, + dest: dest, + result: make(chan error), + } + m.chromeUnit.dispatch(req) + err := <-req.result + return err + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (m *pm2) URL( + ctx context.Context, + logger xlog.Logger, dest, URL string, + opts ChromePrintOptions, +) error { + const op string = "prinery.pm2.URL" + resolver := func() error { + if m.chromeUnit == nil { + return errors.New("cannot handle URL print request as there is no chromeUnit") + } + p := chromePrinter{ + logger: logger, + url: URL, + opts: opts, + } + req := request{ + ctx: ctx, + logger: logger, + printer: p, + dest: dest, + result: make(chan error), + } + m.chromeUnit.dispatch(req) + err := <-req.result + return err + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (m *pm2) Markdown( + ctx context.Context, + logger xlog.Logger, + dest, fpath string, + opts ChromePrintOptions, +) error { + const op string = "prinery.pm2.Markdown" + resolver := func() error { + if m.chromeUnit == nil { + return errors.New("cannot handle Markdown print request as there is no chromeUnit") + } + p, err := newMarkdownPrinter(logger, fpath, opts) + if err != nil { + return err + } + req := request{ + ctx: ctx, + logger: logger, + printer: p, + dest: dest, + result: make(chan error), + } + m.chromeUnit.dispatch(req) + err = <-req.result + return err + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (m *pm2) Office( + ctx context.Context, + logger xlog.Logger, + dest string, + fpaths []string, + opts UnoconvPrintOptions, +) error { + const op string = "prinery.pm2.Office" + resolver := func() error { + if m.sofficeUnit == nil { + return errors.New("cannot handle Office print request as there is no sofficeUnit") + } + p := unoconvPrinter{ + logger: logger, + fpaths: fpaths, + opts: opts, + } + req := request{ + ctx: ctx, + logger: logger, + printer: p, + dest: dest, + result: make(chan error), + } + m.sofficeUnit.dispatch(req) + err := <-req.result + return err + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (m *pm2) Merge( + ctx context.Context, + logger xlog.Logger, + dest string, + fpaths []string, +) error { + const op string = "prinery.pm2.Merge" + p := mergePrinter{ + logger: logger, + fpaths: fpaths, + } + if err := p.print(ctx, nil, dest); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (m *pm2) start(p process) error { + const op string = "prinery.pm2.start" + resolver := func() error { + // first, we try to start the process. + if err := m.run(startCommand, p); err != nil { + return err + } + // we wait the process to be ready. + m.warmup(p) + // if the process failed to start correctly, + // we have to restart it. + if !m.isViable(p) && maximumRestartAttempts > 0 { + return m.restart(p) + } + // the process is viable, let's log its + // output. + return m.logs(p) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (m *pm2) restart(p process) error { + const op string = "prinery.pm2.restart" + resolver := func() error { + var attempts uint + for attempts < maximumRestartAttempts { + // we restart the process. + if err := m.run(restartCommand, p); err != nil { + return err + } + // we wait the process to be ready. + m.warmup(p) + attempts++ + // if the process is viable, we + // leave. + if m.isViable(p) { + return m.logs(p) + } + } + return fmt.Errorf("failed to start '%s'", p.spec().id()) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (m *pm2) isViable(p process) bool { + if !p.viabilityFunc()(m.logger) { + return false + } + /*m.listLock.Lock() + defer m.listLock.Unlock() + return m.list.isOnline(p)*/ + return true +} + +func (m *pm2) warmup(p process) { + const op string = "prinery.pm2.warmup" + warmupTime := p.warmupTime() + m.logger.DebugfOp( + op, + "waiting '%v' for allowing '%s' to warmup", + warmupTime, + p.spec().id(), + ) + time.Sleep(warmupTime) +} + +func (m *pm2) logs(p process) error { + const op string = "prinery.pm2.logs" + if m.config.LogLevel() == xlog.DebugLevel { + if err := m.run(logsCommand, p); err != nil { + return xerror.New(op, err) + } + } + return nil +} + +func (m *pm2) run(pm2Cmd command, p process) error { + const op string = "prinery.pm2.run" + resolver := func() error { + args := []string{ + string(pm2Cmd), + } + if pm2Cmd == startCommand { + args = append(args, p.binary()) + args = append(args, fmt.Sprintf("--name=%s", p.spec().id())) + args = append(args, "--interpreter=none", "--") + args = append(args, p.args()...) + } else { + args = append(args, p.spec().id()) + } + cmd, err := xexec.Command(m.logger, "pm2", args...) + if err != nil { + return err + } + xexec.LogBeforeExecute(m.logger, cmd) + return cmd.Start() + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = Prinery(new(pm2)) +) diff --git a/internal/pkg/prinery/prinery.go b/internal/pkg/prinery/prinery.go index da535903..e21bc03b 100644 --- a/internal/pkg/prinery/prinery.go +++ b/internal/pkg/prinery/prinery.go @@ -2,122 +2,89 @@ package prinery import ( "context" - "fmt" + "time" - "github.com/thecodingmachine/gotenberg/internal/pkg/print" - "github.com/thecodingmachine/gotenberg/internal/pkg/process" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) -type request struct { - ctx context.Context - logger xlog.Logger - print print.Print - dest string - result chan error +type processSpec interface { + id() string + host() string + port() uint } -type worker struct { - work chan request - proc process.Process +type process interface { + spec() processSpec + binary() string + args() []string + warmupTime() time.Duration + viabilityFunc() func(logger xlog.Logger) bool } -func (w *worker) do(done chan *worker) { - for { - req := <-w.work - req.result <- req.print.Print(req.ctx, req.dest, w.proc) - done <- w +func processesToSpecs(processes []process) []processSpec { + specs := make([]processSpec, len(processes)) + for i, p := range processes { + specs[i] = p.spec() + } + return specs +} + +type printer interface { + print(ctx context.Context, spec processSpec, dest string) error +} + +// ChromePrintOptions helps customizing the +// Google Chrome print result. +type ChromePrintOptions struct { + WaitDelay float64 + HeaderHTML string + FooterHTML string + PaperWidth float64 + PaperHeight float64 + MarginTop float64 + MarginBottom float64 + MarginLeft float64 + MarginRight float64 + Landscape bool +} + +// DefaultChromePrintOptions returns the default +// Google Chrome print options. +func DefaultChromePrintOptions() ChromePrintOptions { + const defaultHeaderFooterHTML string = "" + return ChromePrintOptions{ + WaitDelay: 0.0, + HeaderHTML: defaultHeaderFooterHTML, + FooterHTML: defaultHeaderFooterHTML, + PaperWidth: 8.27, + PaperHeight: 11.7, + MarginTop: 1.0, + MarginBottom: 1.0, + MarginLeft: 1.0, + MarginRight: 1.0, + Landscape: false, } } -type Prinery struct { - logger xlog.Logger - manager process.Manager - work chan request - pool chan *worker - done chan *worker +// UnoconvPrintOptions helps customizing the +// LibreOffice print result. +type UnoconvPrintOptions struct { + Landscape bool } -func New(logger xlog.Logger, manager process.Manager, key process.Key) (*Prinery, error) { - const op string = "prinery.New" - processes := manager.Processes(key) - nWorkers := len(processes) - if nWorkers == 0 { - err := fmt.Errorf("no processes found for key '%s'", string(key)) - return nil, xerror.New(op, err) - } - logger.DebugfOp(op, "found '%d' processes for key '%s'", nWorkers, string(key)) - work := make(chan request, 1) - pool := make(chan *worker, nWorkers) - done := make(chan *worker, nWorkers) - for _, p := range processes { - w := &worker{ - work: work, - proc: p, - } - pool <- w - go w.do(done) - } - return &Prinery{ - logger: logger, - manager: manager, - work: work, - pool: pool, - done: done, - }, nil -} - -func (p *Prinery) PrintRequest(ctx context.Context, logger xlog.Logger, prnt print.Print, dest string) error { - const op string = "prinery.Prinery.PrintRequest" - req := request{ - ctx: ctx, - logger: logger, - print: prnt, - dest: dest, - result: make(chan error), - } - p.dispatch(req) - err := <-req.result - if err != nil { - return xerror.New(op, err) - } - return nil -} - -func (p *Prinery) Start() { - for { - select { - case req := <-p.work: - p.dispatch(req) - case w := <-p.done: - p.completed(w) - } +// DefaultUnoconvPrinterOptions returns the default +// LibreOffice print options. +func DefaultUnoconvPrinterOptions() UnoconvPrintOptions { + return UnoconvPrintOptions{ + Landscape: false, } } -func (p *Prinery) dispatch(req request) { - const op string = "prinery.Prinery.dispatch" - select { - case w := <-p.pool: - w.work <- req - case <-req.ctx.Done(): - req.result <- xerror.New(op, req.ctx.Err()) - } -} - -func (p *Prinery) completed(w *worker) { - const op string = "prinery.Prinerty.completed" - go func() { - // check process viability. - isViable := p.manager.IsViable(w.proc) - // check process memory usage. - // TODO handle error. - memory, _ := p.manager.Memory(w.proc) - p.logger.DebugfOp(op, "%s: isViable = %t, memory = %d", w.proc.ID(), isViable, memory) - // TODO manage viability and memory usage. - // pushing back the worker. - p.pool <- w - }() - +type Prinery interface { + Start(emergency chan error) error + HTML(ctx context.Context, logger xlog.Logger, dest, fpath string, opts ChromePrintOptions) error + URL(ctx context.Context, logger xlog.Logger, dest, URL string, opts ChromePrintOptions) error + Markdown(ctx context.Context, logger xlog.Logger, dest, fpath string, opts ChromePrintOptions) error + Office(ctx context.Context, logger xlog.Logger, dest string, fpaths []string, opts UnoconvPrintOptions) error + Merge(ctx context.Context, logger xlog.Logger, dest string, fpaths []string) error } diff --git a/internal/pkg/prinery/soffice.go b/internal/pkg/prinery/soffice.go new file mode 100644 index 00000000..8a4db4ab --- /dev/null +++ b/internal/pkg/prinery/soffice.go @@ -0,0 +1,158 @@ +package prinery + +import ( + "context" + "fmt" + "os" + "path/filepath" + "time" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" +) + +type sofficeProcess struct { + unoPort uint +} + +func newSofficesProcesses(nInstances int64) []process { + processes := make([]process, nInstances) + var i int64 + var currentPort uint = 2002 + for i = 0; i < nInstances; i++ { + processes[i] = sofficeProcess{ + unoPort: currentPort, + } + currentPort++ + } + return processes +} + +func (p sofficeProcess) id() string { + return fmt.Sprintf("%s-%d", p.binary(), p.port()) +} + +func (p sofficeProcess) host() string { + return "127.0.0.1" +} + +func (p sofficeProcess) port() uint { + return p.unoPort +} + +func (p sofficeProcess) spec() processSpec { + return p +} + +func (p sofficeProcess) binary() string { + return "soffice" +} + +func (p sofficeProcess) args() []string { + return []string{ + // see https://ask.libreoffice.org/en/question/42975/how-can-i-run-multiple-instances-of-sofficebin-at-a-time/. + fmt.Sprintf("-env:UserInstallation=file:///tmp/%d", p.port()), + "--headless", + "--invisible", + "--nocrashreport", + "--nodefault", + "--nofirststartwizard", + "--nologo", + "--norestore", + fmt.Sprintf("--accept=socket,host=%s,port=%d,tcpNoDelay=1;urp;StarOffice.ComponentContext", p.host(), p.port()), + } +} + +func (p sofficeProcess) warmupTime() time.Duration { + return 3 * time.Second +} + +func (p sofficeProcess) viabilityFunc() func(logger xlog.Logger) bool { + const op string = "prinery.sofficeProcess.viabilityFunc" + return func(logger xlog.Logger) bool { + // TODO find a way to check. + return true + } +} + +type unoconvPrinter struct { + logger xlog.Logger + fpaths []string + opts UnoconvPrintOptions +} + +func (p unoconvPrinter) print(ctx context.Context, spec processSpec, dest string) error { + const op string = "prinery.unoconvPrinter.print" + resolver := func() error { + fpaths := make([]string, len(p.fpaths)) + dirPath := filepath.Dir(dest) + for i, fpath := range p.fpaths { + baseFilename := xrand.Get() + tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) + p.logger.DebugfOp(op, "converting '%s' to PDF...", fpath) + if err := p.unoconv(ctx, spec, fpath, tmpDest); err != nil { + return err + } + p.logger.DebugfOp(op, "'%s.pdf' created", baseFilename) + fpaths[i] = tmpDest + } + if len(fpaths) == 1 { + p.logger.DebugOp(op, "only one PDF created, nothing to merge") + if err := os.Rename(fpaths[0], dest); err != nil { + return err + } + return nil + } + merger := mergePrinter{ + logger: p.logger, + fpaths: fpaths, + } + return merger.print(ctx, nil, dest) + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func (p unoconvPrinter) unoconv(ctx context.Context, spec processSpec, fpath, dest string) error { + const op string = "prinery.unoconvPrinter.unoconv" + resolver := func() error { + args := []string{ + "--server", + spec.host(), + "--port", + fmt.Sprintf("%d", spec.port()), + "--format", + "pdf", + } + if p.opts.Landscape { + args = append(args, "--printer", "PaperOrientation=landscape") + } + args = append(args, "--output", dest, fpath) + cmd, err := xexec.CommandContext( + ctx, + p.logger, + "unoconv", + args..., + ) + if err != nil { + return err + } + xexec.LogBeforeExecute(p.logger, cmd) + return cmd.Run() + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +// Compile-time checks to ensure type implements desired interfaces. +var ( + _ = processSpec(new(sofficeProcess)) + _ = process(new(sofficeProcess)) + _ = printer(new(unoconvPrinter)) +) diff --git a/internal/pkg/prinery/unit.go b/internal/pkg/prinery/unit.go new file mode 100644 index 00000000..58d49414 --- /dev/null +++ b/internal/pkg/prinery/unit.go @@ -0,0 +1,125 @@ +package prinery + +import ( + "context" + "errors" + + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +type request struct { + ctx context.Context + logger xlog.Logger + printer printer + dest string + result chan error +} + +type worker struct { + work chan request + spec processSpec +} + +func (w *worker) do(done chan *worker) { + for { + req := <-w.work + req.result <- req.printer.print(req.ctx, w.spec, req.dest) + done <- w + } +} + +type unit struct { + logger xlog.Logger + workers []*worker + work chan request + pool chan *worker + done chan *worker +} + +func newUnit(logger xlog.Logger, specs []processSpec) (*unit, error) { + const op string = "prinery.newUnit" + resolver := func() (*unit, error) { + nWorkers := len(specs) + if nWorkers == 0 { + return nil, errors.New("no workers to create") + } + logger.DebugfOp(op, "creating '%d' workers...", nWorkers) + workers := make([]*worker, nWorkers) + work := make(chan request, 1) + pool := make(chan *worker, nWorkers) + done := make(chan *worker, nWorkers) + for i, spec := range specs { + w := &worker{ + work: work, + spec: spec, + } + logger.DebugfOp(op, "worker '%s' created", w.spec.id()) + workers[i] = w + } + return &unit{ + logger: logger, + workers: workers, + work: work, + pool: pool, + done: done, + }, nil + } + u, err := resolver() + if err != nil { + return nil, xerror.New(op, err) + } + return u, nil +} + +func (u *unit) start(emergency chan error) { + const op string = "prinery.unit.start" + for _, w := range u.workers { + u.logger.DebugfOp(op, "starting worker '%s'...", w.spec.id()) + go w.do(u.done) + u.pool <- w + } + for { + select { + case req := <-u.work: + u.dispatch(req) + case w := <-u.done: + u.completed(w, emergency) + } + } +} + +func (u *unit) request(ctx context.Context, logger xlog.Logger, printer printer, dest string) error { + const op string = "prinery.unit.request" + req := request{ + ctx: ctx, + logger: logger, + printer: printer, + dest: dest, + result: make(chan error), + } + u.dispatch(req) + err := <-req.result + if err != nil { + return xerror.New(op, err) + } + return nil +} + +func (u *unit) dispatch(req request) { + const op string = "prinery.unit.dispatch" + select { + case w := <-u.pool: + u.logger.DebugfOp(op, "worker '%s' is now in use", w.spec.id()) + w.work <- req + case <-req.ctx.Done(): + req.result <- xerror.New(op, req.ctx.Err()) + } +} + +func (u *unit) completed(w *worker, emergency chan error) { + const op string = "prinery.unit.completed" + // TODO check viability, handles errors via emergency chan. + u.logger.DebugfOp(op, "worker '%s' is ready for a new request", w.spec.id()) + u.pool <- w +} diff --git a/internal/pkg/print/html.go b/internal/pkg/print/html.go deleted file mode 100644 index 9a3e04f5..00000000 --- a/internal/pkg/print/html.go +++ /dev/null @@ -1,18 +0,0 @@ -package print - -import ( - "fmt" - - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -// NewHTMLPrint returns a Print for -// converting an HTML file to PDF. -func NewHTMLPrint(logger xlog.Logger, fpath string, opts ChromePrintOptions) Print { - URL := fmt.Sprintf("file://%s", fpath) - return chromePrint{ - logger: logger, - url: URL, - opts: opts, - } -} diff --git a/internal/pkg/print/office.go b/internal/pkg/print/office.go index 5bc524f8..1ec02792 100644 --- a/internal/pkg/print/office.go +++ b/internal/pkg/print/office.go @@ -52,7 +52,14 @@ func (p officePrint) Print(ctx context.Context, dest string, proc process.Proces baseFilename := xrand.Get() tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) p.logger.DebugfOp(op, "converting '%s' to PDF...", fpath) - if err := unoconv(ctx, p.logger, fpath, tmpDest, p.opts); err != nil { + if err := unoconv( + ctx, + p.logger, + proc, + p.opts, + fpath, + tmpDest, + ); err != nil { return err } p.logger.DebugfOp(op, "'%s.pdf' created", baseFilename) @@ -74,10 +81,20 @@ func (p officePrint) Print(ctx context.Context, dest string, proc process.Proces return nil } -func unoconv(ctx context.Context, logger xlog.Logger, fpath, dest string, opts OfficePrintOptions) error { +func unoconv( + ctx context.Context, + logger xlog.Logger, + proc process.Process, + opts OfficePrintOptions, + fpath, dest string, +) error { const op string = "print.unoconv" resolver := func() error { args := []string{ + "--server", + proc.Host(), + "--port", + fmt.Sprintf("%d", proc.Port()), "--format", "pdf", } From 24e6a86bf57a6e3efb5b5d3a6a2c162ed4be15a3 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Thu, 26 Sep 2019 18:07:43 +0200 Subject: [PATCH 086/107] rolling back from previous implementation, now using master version of unoconv --- build/base/Dockerfile | 40 +- build/tests/docker-entrypoint.sh | 1 + cmd/gotenberg/main.go | 15 +- go.mod | 2 + go.sum | 4 + internal/app/xhttp/handler.go | 139 ++----- internal/app/xhttp/handler_test.go | 28 +- internal/app/xhttp/middleware.go | 5 +- internal/app/xhttp/option.go | 53 ++- internal/app/xhttp/pkg/context/context.go | 33 +- .../app/xhttp/pkg/context/context_test.go | 22 -- internal/app/xhttp/pkg/resource/arg.go | 28 -- internal/app/xhttp/xhttp.go | 5 +- internal/app/xhttp/xhttp_test.go | 9 +- internal/pkg/chrome/chrome.go | 143 +++++++ internal/pkg/chrome/doc.go | 1 + internal/pkg/conf/conf.go | 10 - internal/pkg/pm2/chrome.go | 114 ------ internal/pkg/pm2/doc.go | 12 - internal/pkg/pm2/dummy.go | 46 --- internal/pkg/pm2/pm2.go | 165 -------- internal/pkg/pm2/unoconv.go | 103 ----- internal/pkg/prinery/chrome.go | 327 ---------------- internal/pkg/prinery/doc.go | 1 - internal/pkg/prinery/markdown.go | 68 ---- internal/pkg/prinery/merge.go | 39 -- internal/pkg/prinery/pm2.go | 365 ------------------ internal/pkg/prinery/prinery.go | 90 ----- internal/pkg/prinery/soffice.go | 158 -------- internal/pkg/prinery/unit.go | 125 ------ internal/pkg/print/chrome.go | 265 ------------- internal/pkg/print/doc.go | 1 - internal/pkg/print/markdown.go | 70 ---- internal/pkg/print/merge.go | 44 --- internal/pkg/print/office.go | 126 ------ internal/pkg/print/print.go | 13 - internal/pkg/print/url.go | 15 - internal/pkg/printer/office.go | 57 +-- internal/pkg/process/chrome.go | 106 ----- internal/pkg/process/doc.go | 1 - internal/pkg/process/pm2.go | 324 ---------------- internal/pkg/process/process.go | 40 -- internal/pkg/process/soffice.go | 74 ---- internal/pkg/xassert/xassert.go | 49 +++ internal/pkg/xerrgroup/doc.go | 6 - internal/pkg/xerrgroup/xerrgroup.go | 20 - test/cmd/pm2/pm2.go | 18 - 47 files changed, 346 insertions(+), 3034 deletions(-) create mode 100644 internal/pkg/chrome/chrome.go create mode 100644 internal/pkg/chrome/doc.go delete mode 100644 internal/pkg/pm2/chrome.go delete mode 100644 internal/pkg/pm2/doc.go delete mode 100644 internal/pkg/pm2/dummy.go delete mode 100644 internal/pkg/pm2/pm2.go delete mode 100644 internal/pkg/pm2/unoconv.go delete mode 100644 internal/pkg/prinery/chrome.go delete mode 100644 internal/pkg/prinery/doc.go delete mode 100644 internal/pkg/prinery/markdown.go delete mode 100644 internal/pkg/prinery/merge.go delete mode 100644 internal/pkg/prinery/pm2.go delete mode 100644 internal/pkg/prinery/prinery.go delete mode 100644 internal/pkg/prinery/soffice.go delete mode 100644 internal/pkg/prinery/unit.go delete mode 100644 internal/pkg/print/chrome.go delete mode 100644 internal/pkg/print/doc.go delete mode 100644 internal/pkg/print/markdown.go delete mode 100644 internal/pkg/print/merge.go delete mode 100644 internal/pkg/print/office.go delete mode 100644 internal/pkg/print/print.go delete mode 100644 internal/pkg/print/url.go delete mode 100644 internal/pkg/process/chrome.go delete mode 100644 internal/pkg/process/doc.go delete mode 100644 internal/pkg/process/pm2.go delete mode 100644 internal/pkg/process/process.go delete mode 100644 internal/pkg/process/soffice.go delete mode 100644 internal/pkg/xerrgroup/doc.go delete mode 100644 internal/pkg/xerrgroup/xerrgroup.go delete mode 100644 test/cmd/pm2/pm2.go diff --git a/build/base/Dockerfile b/build/base/Dockerfile index d074eb89..fe323674 100644 --- a/build/base/Dockerfile +++ b/build/base/Dockerfile @@ -9,19 +9,7 @@ FROM debian:buster-slim RUN echo "deb http://httpredir.debian.org/debian/ buster main contrib non-free" > /etc/apt/sources.list &&\ apt-get update &&\ - apt-get install -y curl wget python3-pip ttf-mscorefonts-installer - -# |-------------------------------------------------------------------------- -# | PM2 -# |-------------------------------------------------------------------------- -# | -# | Installs PM2 for launching programs in background and with failure -# | recovering. In our case: Google Chrome (headless) and unoconv. -# | - -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - &&\ - apt-get install -y nodejs &&\ - npm install -g pm2 + apt-get install -y curl wget gnupg ttf-mscorefonts-installer # |-------------------------------------------------------------------------- # | Chrome @@ -36,19 +24,33 @@ RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add apt-get -y --allow-unauthenticated install google-chrome-stable # |-------------------------------------------------------------------------- -# | Unoconv +# | LibreOffice # |-------------------------------------------------------------------------- # | -# | Installs unoconv and LibreOffice. +# | Installs LibreOffice. # | -RUN pip3 install unoconv &&\ - # https://github.com/nextcloud/docker/issues/380 - mkdir -p /usr/share/man/man1mkdir -p /usr/share/man/man1 &&\ +# https://github.com/nextcloud/docker/issues/380 +RUN mkdir -p /usr/share/man/man1mkdir -p /usr/share/man/man1 &&\ echo "deb http://httpredir.debian.org/debian/ buster-backports main contrib non-free" >> /etc/apt/sources.list &&\ apt-get update &&\ apt-get -t buster-backports -y install libreoffice +# |-------------------------------------------------------------------------- +# | Unoconv +# |-------------------------------------------------------------------------- +# | +# | Installs unoconv. +# | + +ENV UNO_URL=https://raw.githubusercontent.com/dagwieers/unoconv/master/unoconv + +RUN apt-get install -y python3 &&\ + curl -Ls $UNO_URL -o /usr/bin/unoconv &&\ + chmod +x /usr/bin/unoconv &&\ + ln -s /usr/bin/python3 /usr/bin/python &&\ + unoconv --version + # |-------------------------------------------------------------------------- # | PDFtk # |-------------------------------------------------------------------------- @@ -108,4 +110,4 @@ RUN groupadd --gid 1001 gotenberg \ && mkdir /gotenberg \ && chown gotenberg: /gotenberg -ENV PM2_HOME=/gotenberg/.pm2 +RUN apt-get install -y procps \ No newline at end of file diff --git a/build/tests/docker-entrypoint.sh b/build/tests/docker-entrypoint.sh index ad81d21f..32294499 100755 --- a/build/tests/docker-entrypoint.sh +++ b/build/tests/docker-entrypoint.sh @@ -11,6 +11,7 @@ fi # Start the PM2 processes # (Google Chrome headless & unoconv listener). +# TODO just start chrome go run github.com/thecodingmachine/gotenberg/test/cmd/pm2 # Run our tests. diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index d32b3440..8d27da5a 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -1,14 +1,15 @@ package main import ( + "context" "fmt" "net/http" "os" "os/signal" "github.com/thecodingmachine/gotenberg/internal/app/xhttp" + "github.com/thecodingmachine/gotenberg/internal/pkg/chrome" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) @@ -26,18 +27,14 @@ func main() { } systemLogger.InfofOp(op, "Gotenberg %s", version) systemLogger.DebugfOp(op, "configuration: %+v", config) - // create our prinery. - prinry, err := prinery.NewPM2Prinery(systemLogger, config) + // start Google Chrome. + // TODO kill proc. + _, err = chrome.Start(context.Background(), systemLogger) if err != nil { systemLogger.FatalOp(op, err) } - // TODO use chan - // TODO stop prinery - if err = prinry.Start(make(chan error, 1)); err != nil { - systemLogger.FatalOp(op, err) - } // create our API. - srv := xhttp.New(config, prinry) + srv := xhttp.New(config) // run our API in a goroutine so that it doesn't block. go func() { systemLogger.InfofOp(op, "http server started on port '%d'", config.DefaultListenPort()) diff --git a/go.mod b/go.mod index b46352c2..575bad5a 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/thecodingmachine/gotenberg go 1.12 require ( + github.com/dustin/go-humanize v1.0.0 github.com/google/go-cmp v0.3.1 // indirect github.com/gorilla/websocket v1.4.0 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect @@ -12,6 +13,7 @@ require ( github.com/mafredri/cdp v0.24.2 github.com/mattn/go-isatty v0.0.9 github.com/microcosm-cc/bluemonday v1.0.2 + github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 github.com/russross/blackfriday/v2 v2.0.1 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/sirupsen/logrus v1.4.2 diff --git a/go.sum b/go.sum index 3db58652..933fa201 100644 --- a/go.sum +++ b/go.sum @@ -3,6 +3,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= @@ -30,6 +32,8 @@ github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= diff --git a/internal/app/xhttp/handler.go b/internal/app/xhttp/handler.go index 7c43d537..dda5d68e 100644 --- a/internal/app/xhttp/handler.go +++ b/internal/app/xhttp/handler.go @@ -1,7 +1,6 @@ package xhttp import ( - timeoutContext "context" "fmt" "net/http" "os" @@ -9,10 +8,8 @@ import ( "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/context" "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" - "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" - "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" ) @@ -33,23 +30,6 @@ func pingHandler(c echo.Context) error { ctx := context.MustCastFromEchoContext(c) logger := ctx.XLogger() logger.DebugOp(op, "handling ping request...") - resolver := func() error { - if err := ctx.ProcessesHealthcheck(); err != nil { - return err - } - if logger.Level() != xlog.DebugLevel { - return nil - } - // TODO - list, err := pm2.List() - if err != nil { - return err - } - return ctx.JSON(http.StatusOK, list) - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } return nil } @@ -61,21 +41,17 @@ func mergeHandler(c echo.Context) error { ctx := context.MustCastFromEchoContext(c) logger := ctx.XLogger() logger.DebugOp(op, "handling merge request...") - config := ctx.Config() r := ctx.MustResource() - timeout, err := resource.WaitTimeoutAndWaitDelayArg(r, config) + opts, err := mergePrinterOptions(r, ctx.Config()) if err != nil { - return err + return xerror.New(op, err) } fpaths, err := r.Fpaths(".pdf") if err != nil { return err } - prinry := ctx.Prinery() - printFunc := func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error { - return prinry.Merge(ctx, logger, dest, fpaths) - } - return convert(ctx, timeout, printFunc) + p := printer.NewMergePrinter(logger, fpaths, opts) + return convert(ctx, p) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -91,13 +67,8 @@ func htmlHandler(c echo.Context) error { ctx := context.MustCastFromEchoContext(c) logger := ctx.XLogger() logger.DebugOp(op, "handling HTML request...") - config := ctx.Config() r := ctx.MustResource() - timeout, err := resource.WaitTimeoutAndWaitDelayArg(r, config) - if err != nil { - return err - } - opts, err := chromePrintOptions(r, config) + opts, err := chromePrinterOptions(r, ctx.Config()) if err != nil { return err } @@ -105,11 +76,8 @@ func htmlHandler(c echo.Context) error { if err != nil { return err } - prinry := ctx.Prinery() - printFunc := func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error { - return prinry.HTML(ctx, logger, dest, fpath, opts) - } - return convert(ctx, timeout, printFunc) + p := printer.NewHTMLPrinter(logger, fpath, opts) + return convert(ctx, p) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -125,13 +93,8 @@ func urlHandler(c echo.Context) error { ctx := context.MustCastFromEchoContext(c) logger := ctx.XLogger() logger.DebugOp(op, "handling URL request...") - config := ctx.Config() r := ctx.MustResource() - timeout, err := resource.WaitTimeoutAndWaitDelayArg(r, config) - if err != nil { - return err - } - opts, err := chromePrintOptions(r, config) + opts, err := chromePrinterOptions(r, ctx.Config()) if err != nil { return err } @@ -146,11 +109,8 @@ func urlHandler(c echo.Context) error { if err != nil { return err } - prinry := ctx.Prinery() - printFunc := func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error { - return prinry.URL(ctx, logger, dest, remoteURL, opts) - } - return convert(ctx, timeout, printFunc) + p := printer.NewURLPrinter(logger, remoteURL, opts) + return convert(ctx, p) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -166,13 +126,8 @@ func markdownHandler(c echo.Context) error { ctx := context.MustCastFromEchoContext(c) logger := ctx.XLogger() logger.DebugOp(op, "handling Markdown request...") - config := ctx.Config() r := ctx.MustResource() - timeout, err := resource.WaitTimeoutAndWaitDelayArg(r, config) - if err != nil { - return err - } - opts, err := chromePrintOptions(r, config) + opts, err := chromePrinterOptions(r, ctx.Config()) if err != nil { return err } @@ -180,11 +135,11 @@ func markdownHandler(c echo.Context) error { if err != nil { return err } - prinry := ctx.Prinery() - printFunc := func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error { - return prinry.Markdown(ctx, logger, dest, fpath, opts) + p, err := printer.NewMarkdownPrinter(logger, fpath, opts) + if err != nil { + return err } - return convert(ctx, timeout, printFunc) + return convert(ctx, p) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -200,13 +155,8 @@ func officeHandler(c echo.Context) error { ctx := context.MustCastFromEchoContext(c) logger := ctx.XLogger() logger.DebugOp(op, "handling Office request...") - config := ctx.Config() r := ctx.MustResource() - timeout, err := resource.WaitTimeoutAndWaitDelayArg(r, config) - if err != nil { - return err - } - opts, err := unoconvPrintOptions(r, config) + opts, err := officePrinterOptions(r, ctx.Config()) if err != nil { return err } @@ -227,11 +177,8 @@ func officeHandler(c echo.Context) error { if err != nil { return err } - prinry := ctx.Prinery() - printFunc := func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error { - return prinry.Office(ctx, logger, dest, fpaths, opts) - } - return convert(ctx, timeout, printFunc) + p := printer.NewOfficePrinter(logger, fpaths, opts) + return convert(ctx, p) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -239,11 +186,7 @@ func officeHandler(c echo.Context) error { return nil } -func convert( - ctx context.Context, - timeout float64, - printFunc func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error, -) error { +func convert(ctx context.Context, p printer.Printer) error { const op string = "xhttp.convert" resolver := func() error { logger := ctx.XLogger() @@ -256,13 +199,13 @@ func convert( // or an error. if !r.HasArg(resource.WebhookURLArgKey) { logger.DebugfOp(op, "no '%s' found, converting synchronously", resource.WebhookURLArgKey) - return convertSync(ctx, timeout, filename, fpath, printFunc) + return convertSync(ctx, p, filename, fpath) } // as a webhook URL has been given, we // run the following lines in a goroutine so that // it doesn't block. logger.DebugfOp(op, "'%s' found, converting asynchronously", resource.WebhookURLArgKey) - return convertAsync(ctx, timeout, filename, fpath, printFunc) + return convertAsync(ctx, p, filename, fpath) } if err := resolver(); err != nil { return xerror.New(op, err) @@ -270,19 +213,13 @@ func convert( return nil } -func convertSync( - ctx context.Context, - timeout float64, - filename, dest string, - printFunc func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error, -) error { +func convertSync(ctx context.Context, p printer.Printer, filename, fpath string) error { const op = "xhttp.convertSync" - logger := ctx.XLogger() - r := ctx.MustResource() - timeoutCtx, cancel := xcontext.WithTimeout(logger, timeout) - defer cancel() resolver := func() error { - if err := printFunc(timeoutCtx, logger, dest); err != nil { + logger := ctx.XLogger() + r := ctx.MustResource() + + if err := p.Print(fpath); err != nil { return err } if !r.HasArg(resource.ResultFilenameArgKey) { @@ -292,7 +229,7 @@ func convertSync( resource.RemoteURLArgKey, filename, ) - if err := ctx.Attachment(dest, filename); err != nil { + if err := ctx.Attachment(fpath, filename); err != nil { return err } return nil @@ -306,26 +243,18 @@ func convertSync( if err != nil { return err } - if err := ctx.Attachment(dest, filename); err != nil { + if err := ctx.Attachment(fpath, filename); err != nil { return err } return nil } if err := resolver(); err != nil { - return xcontext.MustHandleError( - timeoutCtx, - xerror.New(op, err), - ) + return xerror.New(op, err) } return nil } -func convertAsync( - ctx context.Context, - timeout float64, - filename, dest string, - printFunc func(ctx timeoutContext.Context, logger xlog.Logger, dest string) error, -) error { +func convertAsync(ctx context.Context, p printer.Printer, filename, fpath string) error { const op = "xhttp.convertAsync" logger := ctx.XLogger() r := ctx.MustResource() @@ -339,14 +268,12 @@ func convertAsync( } go func() { defer r.Close() // nolint: errcheck - timeoutCtx, cancel := xcontext.WithTimeout(logger, timeout) - defer cancel() - if err := printFunc(timeoutCtx, logger, dest); err != nil { + if err := p.Print(fpath); err != nil { xerr := xerror.New(op, err) logger.ErrorOp(xerror.Op(xerr), xerr) return } - f, err := os.Open(dest) + f, err := os.Open(fpath) if err != nil { xerr := xerror.New(op, err) logger.ErrorOp(xerror.Op(xerr), xerr) diff --git a/internal/app/xhttp/handler_test.go b/internal/app/xhttp/handler_test.go index c1a5355b..c4c78add 100644 --- a/internal/app/xhttp/handler_test.go +++ b/internal/app/xhttp/handler_test.go @@ -19,8 +19,8 @@ import ( func TestPingHandler(t *testing.T) { // should return 200. config := conf.DefaultConfig() - // TODO - srv := New(config, nil, nil) + srv := New(config) + srv = New(config) req := httptest.NewRequest(http.MethodGet, pingEndpoint, nil) test.AssertStatusCode(t, http.StatusOK, srv, req) // should returns a JSON as @@ -28,8 +28,7 @@ func TestPingHandler(t *testing.T) { os.Setenv(conf.LogLevelEnvVar, "DEBUG") config, err := conf.FromEnv() assert.Nil(t, err) - // TODO - srv = New(config, nil, nil) + srv = New(config) req = httptest.NewRequest(http.MethodGet, pingEndpoint, nil) rec := httptest.NewRecorder() srv.ServeHTTP(rec, req) @@ -40,8 +39,7 @@ func TestPingHandler(t *testing.T) { func TestMergeHandler(t *testing.T) { config := conf.DefaultConfig() - // TODO - srv := New(config, nil, nil) + srv := New(config) // should return 200. body, contentType := test.MergeMultipartForm(t, nil) req := httptest.NewRequest(http.MethodPost, mergeEndpoint, body) @@ -74,8 +72,7 @@ func TestMergeHandler(t *testing.T) { func TestHTMLHandler(t *testing.T) { config := conf.DefaultConfig() - // TODO - srv := New(config, nil, nil) + srv := New(config) endpoint := fmt.Sprintf("%s%s", convertGroupEndpoint, htmlEndpoint) // should return 200. body, contentType := test.HTMLMultipartForm(t, nil) @@ -205,8 +202,7 @@ func TestHTMLHandler(t *testing.T) { func TestURLHandler(t *testing.T) { config := conf.DefaultConfig() - // TODO - srv := New(config, nil, nil) + srv := New(config) endpoint := fmt.Sprintf("%s%s", convertGroupEndpoint, urlEndpoint) // should return 200. body, contentType := test.URLMultipartForm(t, nil) @@ -336,8 +332,7 @@ func TestURLHandler(t *testing.T) { func TestMarkdownHandler(t *testing.T) { config := conf.DefaultConfig() - // TODO - srv := New(config, nil, nil) + srv := New(config) endpoint := fmt.Sprintf("%s%s", convertGroupEndpoint, markdownEndpoint) // should return 200. body, contentType := test.MarkdownMultipartForm(t, nil) @@ -467,8 +462,7 @@ func TestMarkdownHandler(t *testing.T) { func TestOfficeHandler(t *testing.T) { config := conf.DefaultConfig() - // TODO - srv := New(config, nil, nil) + srv := New(config) endpoint := fmt.Sprintf("%s%s", convertGroupEndpoint, officeEndpoint) // should return 200. body, contentType := test.OfficeMultipartForm(t, nil) @@ -530,8 +524,7 @@ func TestWebhook(t *testing.T) { rcv.Start(":3001") }() config := conf.DefaultConfig() - // TODO - srv := New(config, nil, nil) + srv := New(config) // our custom server should receive the PDF. body, contentType := test.MergeMultipartForm(t, map[string]string{string(resource.WebhookURLArgKey): "http://localhost:3001/foo"}) req := httptest.NewRequest(http.MethodPost, mergeEndpoint, body) @@ -543,8 +536,7 @@ func TestWebhook(t *testing.T) { func TestResultFilename(t *testing.T) { config := conf.DefaultConfig() - // TODO - srv := New(config, nil, nil) + srv := New(config) body, contentType := test.MergeMultipartForm(t, map[string]string{string(resource.ResultFilenameArgKey): "foo.pdf"}) req := httptest.NewRequest(http.MethodPost, mergeEndpoint, body) req.Header.Set(echo.HeaderContentType, contentType) diff --git a/internal/app/xhttp/middleware.go b/internal/app/xhttp/middleware.go index 8119f963..12aada23 100644 --- a/internal/app/xhttp/middleware.go +++ b/internal/app/xhttp/middleware.go @@ -7,7 +7,6 @@ import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/context" "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" @@ -15,7 +14,7 @@ import ( // contextMiddleware extends the default echo.Context with // our custom context.Context. -func contextMiddleware(config conf.Config, prinry prinery.Prinery) echo.MiddlewareFunc { +func contextMiddleware(config conf.Config) echo.MiddlewareFunc { return func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { // generate a unique identifier for the request. @@ -25,7 +24,7 @@ func contextMiddleware(config conf.Config, prinry prinery.Prinery) echo.Middlewa logger := xlog.New(config.LogLevel(), trace) // extend the current echo context with our custom // context. - ctx := context.New(c, logger, config, prinry) + ctx := context.New(c, logger, config) // if its an healthcheck request, there // is no need to create a Resource. if ctx.Path() == pingEndpoint { diff --git a/internal/app/xhttp/option.go b/internal/app/xhttp/option.go index 1c4f8ca6..d79841e8 100644 --- a/internal/app/xhttp/option.go +++ b/internal/app/xhttp/option.go @@ -3,37 +3,53 @@ package xhttp import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" + "github.com/thecodingmachine/gotenberg/internal/pkg/printer" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" ) -func chromePrintOptions(r resource.Resource, config conf.Config) (prinery.ChromePrintOptions, error) { - const op string = "xhttp.chromePrintOptions" - resolver := func() (prinery.ChromePrintOptions, error) { +func mergePrinterOptions(r resource.Resource, config conf.Config) (printer.MergePrinterOptions, error) { + const op string = "xhttp.mergePrinterOptions" + waitTimeout, err := resource.WaitTimeoutArg(r, config) + if err != nil { + return printer.MergePrinterOptions{}, xerror.New(op, err) + } + return printer.MergePrinterOptions{ + WaitTimeout: waitTimeout, + }, nil +} + +func chromePrinterOptions(r resource.Resource, config conf.Config) (printer.ChromePrinterOptions, error) { + const op string = "xhttp.chromePrinterOptions" + resolver := func() (printer.ChromePrinterOptions, error) { + waitTimeout, err := resource.WaitTimeoutArg(r, config) + if err != nil { + return printer.ChromePrinterOptions{}, err + } waitDelay, err := resource.WaitDelayArg(r, config) if err != nil { - return prinery.ChromePrintOptions{}, err + return printer.ChromePrinterOptions{}, err } headerHTML, footerHTML, err := resource.HeaderFooterContents(r, config) if err != nil { - return prinery.ChromePrintOptions{}, err + return printer.ChromePrinterOptions{}, err } paperWidth, paperHeight, err := resource.PaperSizeArgs(r, config) if err != nil { - return prinery.ChromePrintOptions{}, err + return printer.ChromePrinterOptions{}, err } marginTop, marginBottom, marginLeft, marginRight, err := resource.MarginArgs(r, config) if err != nil { - return prinery.ChromePrintOptions{}, err + return printer.ChromePrinterOptions{}, err } landscape, err := r.BoolArg(resource.LandscapeArgKey, false) if err != nil { - return prinery.ChromePrintOptions{}, err + return printer.ChromePrinterOptions{}, err } - return prinery.ChromePrintOptions{ + return printer.ChromePrinterOptions{ + WaitTimeout: waitTimeout, WaitDelay: waitDelay, HeaderHTML: headerHTML, FooterHTML: footerHTML, @@ -53,15 +69,20 @@ func chromePrintOptions(r resource.Resource, config conf.Config) (prinery.Chrome return opts, nil } -func unoconvPrintOptions(r resource.Resource, config conf.Config) (prinery.UnoconvPrintOptions, error) { - const op string = "xhttp.unoconvPrintOptions" - resolver := func() (prinery.UnoconvPrintOptions, error) { +func officePrinterOptions(r resource.Resource, config conf.Config) (printer.OfficePrinterOptions, error) { + const op string = "xhttp.officePrinterOptions" + resolver := func() (printer.OfficePrinterOptions, error) { + waitTimeout, err := resource.WaitTimeoutArg(r, config) + if err != nil { + return printer.OfficePrinterOptions{}, err + } landscape, err := r.BoolArg(resource.LandscapeArgKey, false) if err != nil { - return prinery.UnoconvPrintOptions{}, err + return printer.OfficePrinterOptions{}, err } - return prinery.UnoconvPrintOptions{ - Landscape: landscape, + return printer.OfficePrinterOptions{ + WaitTimeout: waitTimeout, + Landscape: landscape, }, nil } opts, err := resolver() diff --git a/internal/app/xhttp/pkg/context/context.go b/internal/app/xhttp/pkg/context/context.go index 75cc9add..d1065b58 100644 --- a/internal/app/xhttp/pkg/context/context.go +++ b/internal/app/xhttp/pkg/context/context.go @@ -13,7 +13,6 @@ import ( "github.com/thecodingmachine/gotenberg/internal/app/xhttp/pkg/resource" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" "github.com/thecodingmachine/gotenberg/internal/pkg/normalize" - "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" ) @@ -23,23 +22,16 @@ type Context struct { echo.Context logger xlog.Logger config conf.Config - prinry prinery.Prinery resource resource.Resource startTime time.Time } // New creates a new Context. -func New( - c echo.Context, - logger xlog.Logger, - config conf.Config, - prinry prinery.Prinery, -) Context { +func New(c echo.Context, logger xlog.Logger, config conf.Config) Context { return Context{ c, logger, config, - prinry, resource.Resource{}, time.Now(), } @@ -78,29 +70,6 @@ func (ctx Context) Config() conf.Config { return ctx.config } -// ProcessesHealthcheck returns an error if -// one of the processes is not viable. -func (ctx Context) ProcessesHealthcheck() error { - const op string = "context.Context.ProcessesHealthcheck" - // TODO - /*processes := ctx.manager.All() - for _, p := range processes { - if !ctx.manager.IsViable(p) { - return xerror.New( - op, - fmt.Errorf("'%s' is not viable", p.ID()), - ) - } - }*/ - return nil -} - -// Prinery returns the instance of prinery.Prinery -// associated with the Context. -func (ctx Context) Prinery() prinery.Prinery { - return ctx.prinry -} - // WithResource creates a resource.Resource and // adds it to the Context. func (ctx *Context) WithResource(directoryName string) error { diff --git a/internal/app/xhttp/pkg/context/context_test.go b/internal/app/xhttp/pkg/context/context_test.go index f6a1ac3e..9b803460 100644 --- a/internal/app/xhttp/pkg/context/context_test.go +++ b/internal/app/xhttp/pkg/context/context_test.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" "github.com/thecodingmachine/gotenberg/test" ) @@ -27,27 +26,6 @@ func TestMustCastFromEchoContext(t *testing.T) { }) } -func TestProcessesHealthcheck(t *testing.T) { - // process is viable. - ctx := New( - test.DummyEchoContext(), - test.DebugLogger(), - conf.DefaultConfig(), - pm2.NewDummyProcess(true), - ) - err := ctx.ProcessesHealthcheck() - assert.Nil(t, err) - // process is not viable. - ctx = New( - test.DummyEchoContext(), - test.DebugLogger(), - conf.DefaultConfig(), - pm2.NewDummyProcess(false), - ) - err = ctx.ProcessesHealthcheck() - test.AssertError(t, err) -} - func TestLogRequestResult(t *testing.T) { ctx := New( test.DummyEchoContext(), diff --git a/internal/app/xhttp/pkg/resource/arg.go b/internal/app/xhttp/pkg/resource/arg.go index b196281d..35c7800b 100644 --- a/internal/app/xhttp/pkg/resource/arg.go +++ b/internal/app/xhttp/pkg/resource/arg.go @@ -76,34 +76,6 @@ func ArgKeys() []ArgKey { } } -/* -WaitTimeoutAndWaitDelayArg is a helper for retrieving -the sum of "waitTimeout" and "waitDelay" arguments -as float64. - -It also validates them against the application -configuration. -*/ -func WaitTimeoutAndWaitDelayArg(r Resource, config conf.Config) (float64, error) { - const op string = "resource.WaitTimeoutAndWaitDelayArg" - resolver := func() (float64, error) { - waitTimeout, err := WaitTimeoutArg(r, config) - if err != nil { - return waitTimeout, err - } - waitDelay, err := WaitDelayArg(r, config) - if err != nil { - return waitDelay, err - } - return waitTimeout + waitDelay, nil - } - combined, err := resolver() - if err != nil { - return combined, xerror.New(op, err) - } - return combined, nil -} - /* WaitTimeoutArg is a helper for retrieving the "waitTimeout" argument as float64. diff --git a/internal/app/xhttp/xhttp.go b/internal/app/xhttp/xhttp.go index 6b0da703..7324997e 100644 --- a/internal/app/xhttp/xhttp.go +++ b/internal/app/xhttp/xhttp.go @@ -3,15 +3,14 @@ package xhttp import ( "github.com/labstack/echo/v4" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/prinery" ) // New returns a custom echo.Echo. -func New(config conf.Config, prinry prinery.Prinery) *echo.Echo { +func New(config conf.Config) *echo.Echo { srv := echo.New() srv.HideBanner = true srv.HidePort = true - srv.Use(contextMiddleware(config, prinry)) + srv.Use(contextMiddleware(config)) srv.Use(loggerMiddleware()) srv.Use(cleanupMiddleware()) srv.Use(errorMiddleware()) diff --git a/internal/app/xhttp/xhttp_test.go b/internal/app/xhttp/xhttp_test.go index 0d317e3d..685fb0a1 100644 --- a/internal/app/xhttp/xhttp_test.go +++ b/internal/app/xhttp/xhttp_test.go @@ -17,8 +17,7 @@ func TestDisableChromeEndpoints(t *testing.T) { os.Setenv(conf.DisableGoogleChromeEnvVar, "1") config, err := conf.FromEnv() assert.Nil(t, err) - // TODO - srv := New(config, nil, nil) + srv := New(config) // Ping endpoint should return 200. req := httptest.NewRequest(http.MethodGet, pingEndpoint, nil) test.AssertStatusCode(t, http.StatusOK, srv, req) @@ -55,8 +54,7 @@ func TestDisableUnoconvEndpoints(t *testing.T) { os.Setenv(conf.DisableUnoconvEnvVar, "1") config, err := conf.FromEnv() assert.Nil(t, err) - // TODO - srv := New(config, nil, nil) + srv := New(config) // Ping endpoint should return 200. req := httptest.NewRequest(http.MethodGet, pingEndpoint, nil) test.AssertStatusCode(t, http.StatusOK, srv, req) @@ -93,8 +91,7 @@ func TestDisableChromeAndUnoconvEndpoints(t *testing.T) { os.Setenv(conf.DisableUnoconvEnvVar, "1") config, err := conf.FromEnv() assert.Nil(t, err) - // TODO - srv := New(config, nil, nil) + srv := New(config) // Ping endpoint should return 200. req := httptest.NewRequest(http.MethodGet, pingEndpoint, nil) test.AssertStatusCode(t, http.StatusOK, srv, req) diff --git a/internal/pkg/chrome/chrome.go b/internal/pkg/chrome/chrome.go new file mode 100644 index 00000000..1be662ac --- /dev/null +++ b/internal/pkg/chrome/chrome.go @@ -0,0 +1,143 @@ +package chrome + +import ( + "context" + "os" + "os/exec" + "time" + + "github.com/mafredri/cdp/devtool" + "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" + "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" + "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" +) + +func Start(ctx context.Context, logger xlog.Logger) (*os.Process, error) { + const op string = "chrome.Start" + logger.DebugOp(op, "starting new Google Chrome process on port 9222...") + resolver := func() (*os.Process, error) { + binary := "google-chrome-stable" + args := []string{ + "--no-sandbox", + "--headless", + // see https://github.com/GoogleChrome/puppeteer/issues/2410. + "--font-render-hinting=medium", + "--remote-debugging-port=9222", + "--disable-gpu", + "--disable-translate", + "--disable-extensions", + "--disable-background-networking", + "--safebrowsing-disable-auto-update", + "--disable-sync", + "--disable-default-apps", + "--hide-scrollbars", + "--metrics-recording-only", + "--mute-audio", + "--no-first-run", + } + cmd, err := xexec.CommandContext(ctx, logger, binary, args...) + if err != nil { + return nil, err + } + // we try to start the process. + xexec.LogBeforeExecute(logger, cmd) + if err := cmd.Start(); err != nil { + return cmd.Process, err + } + // we wait the process to be ready. + warmup(logger) + // if the process failed to start correctly, + // we have to restart it. + if !isViable(logger) { + return restart(ctx, logger, cmd) + } + return cmd.Process, nil + } + proc, err := resolver() + if err != nil { + if errKill := Kill(logger, proc); errKill != nil { + logger.ErrorOp(op, errKill) + } + return nil, xerror.New(op, err) + } + return proc, nil +} + +func Kill(logger xlog.Logger, proc *os.Process) error { + const op string = "chrome.Kill" + resolver := func() error { + logger.DebugOp(op, "removing Google Chrome process using port 9222...") + if proc == nil { + logger.DebugOp(op, "no Google Chrome process using port 9222 found, skipping") + return nil + } + return proc.Kill() + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func restart(ctx context.Context, logger xlog.Logger, cmd *exec.Cmd) (*os.Process, error) { + const op string = "chrome.restart" + resolver := func() (*os.Process, error) { + // we try to restart the process. + xexec.LogBeforeExecute(logger, cmd) + if err := cmd.Start(); err != nil { + return cmd.Process, err + } + // we wait the process to be ready. + warmup(logger) + // if the process failed to restart correctly, + // we have to restart it again. + if !isViable(logger) { + return restart(ctx, logger, cmd) + } + return cmd.Process, nil + } + proc, err := resolver() + if err != nil { + return proc, xerror.New(op, err) + } + return proc, err +} + +func isViable(logger xlog.Logger) bool { + const op string = "chrome.isViable" + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + endpoint := "http://localhost:9222" + logger.DebugfOp( + op, + "checking Google Chrome process viability via endpoint '%s/json/version'", + endpoint, + ) + v, err := devtool.New(endpoint).Version(ctx) + if err != nil { + logger.ErrorfOp( + op, + "Google Chrome is not viable as endpoint returned '%v'", + err, + ) + return false + } + logger.DebugfOp( + op, + "Google Chrome is viable as endpoint returned '%v'", + v, + ) + return true +} + +func warmup(logger xlog.Logger) { + const op string = "chrome.warmup" + warmupTime := xtime.Duration(10) + logger.DebugfOp( + op, + "waiting '%v' for allowing Google Chrome to warmup", + warmupTime, + ) + time.Sleep(warmupTime) +} diff --git a/internal/pkg/chrome/doc.go b/internal/pkg/chrome/doc.go new file mode 100644 index 00000000..7b442802 --- /dev/null +++ b/internal/pkg/chrome/doc.go @@ -0,0 +1 @@ +package chrome diff --git a/internal/pkg/conf/conf.go b/internal/pkg/conf/conf.go index b3f76cbd..d0aca24a 100644 --- a/internal/pkg/conf/conf.go +++ b/internal/pkg/conf/conf.go @@ -201,16 +201,6 @@ func (c Config) DefaultListenPort() int64 { return c.defaultListenPort } -func (c Config) GoogleChromeInstances() int64 { - // TODO: replace DisableGoogleChrome - return 2 -} - -func (c Config) SofficeInstances() int64 { - // TODO: replace DisableUnoconv - return 2 -} - /* DisableGoogleChrome returns true if Google Chrome is disabled in the diff --git a/internal/pkg/pm2/chrome.go b/internal/pkg/pm2/chrome.go deleted file mode 100644 index 0a599dd9..00000000 --- a/internal/pkg/pm2/chrome.go +++ /dev/null @@ -1,114 +0,0 @@ -package pm2 - -import ( - "context" - "time" - - "github.com/mafredri/cdp/devtool" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -type chromeProcess struct { - logger xlog.Logger -} - -// NewChromeProcess returns a Google Chrome -// headless process. -func NewChromeProcess(logger xlog.Logger) Process { - return chromeProcess{ - logger: logger, - } -} - -func (p chromeProcess) Fullname() string { - return "Google Chrome headless" -} - -func (p chromeProcess) Start() error { - const op string = "pm2.chromeProcess.Start" - if err := start(p.logger, p); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (p chromeProcess) IsViable() bool { - const op string = "pm2.chromeProcess.IsViable" - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - p.logger.DebugfOp( - op, - "checking '%s' viability via endpoint '%s'", - p.Fullname(), - "http://localhost:9222/json/version", - ) - v, err := devtool.New("http://localhost:9222").Version(ctx) - if err != nil { - p.logger.ErrorfOp( - op, - "'%s' is not viable as endpoint returned '%v'", - p.Fullname(), - err, - ) - return false - } - p.logger.DebugfOp( - op, - "'%s' is viable as endpoint returned '%v'", - p.Fullname(), - v, - ) - return true -} - -func (p chromeProcess) Stop() error { - const op string = "pm2.chromeProcess.Stop" - if err := stop(p.logger, p); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (p chromeProcess) args() []string { - return []string{ - "--no-sandbox", - "--headless", - "--font-render-hinting=medium", - "--remote-debugging-port=9222", - "--disable-gpu", - "--disable-translate", - "--disable-extensions", - "--disable-background-networking", - "--safebrowsing-disable-auto-update", - "--disable-sync", - "--disable-default-apps", - "--hide-scrollbars", - "--metrics-recording-only", - "--mute-audio", - "--no-first-run", - } -} - -func (p chromeProcess) binary() string { - return "google-chrome-stable" -} - -func (p chromeProcess) warmup() { - const ( - op string = "pm2.chromeProcess.warmup" - warmupTime time.Duration = 10 * time.Second - ) - p.logger.DebugfOp( - op, - "waiting '%v' for allowing '%s' to warmup", - warmupTime, - p.Fullname(), - ) - time.Sleep(warmupTime) -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = Process(new(chromeProcess)) -) diff --git a/internal/pkg/pm2/doc.go b/internal/pkg/pm2/doc.go deleted file mode 100644 index d64ac2a0..00000000 --- a/internal/pkg/pm2/doc.go +++ /dev/null @@ -1,12 +0,0 @@ -/* -Package pm2 facilitates starting external -processes on which our application depends. - -For instance, it may start Google Chrome headless and -unoconv listener with PM2. - -The PM2 process manager launch those processes and keep -them running in the background. If for some reason they -crash, it will also restart them. -*/ -package pm2 diff --git a/internal/pkg/pm2/dummy.go b/internal/pkg/pm2/dummy.go deleted file mode 100644 index a65376e4..00000000 --- a/internal/pkg/pm2/dummy.go +++ /dev/null @@ -1,46 +0,0 @@ -package pm2 - -type dummyProcess struct { - isViable bool -} - -// NewDummyProcess returns a dummy -// process. -func NewDummyProcess(isViable bool) Process { - return dummyProcess{ - isViable: isViable, - } -} - -func (p dummyProcess) Fullname() string { - return "dummy process" -} - -func (p dummyProcess) Start() error { - return nil -} - -func (p dummyProcess) IsViable() bool { - return p.isViable -} - -func (p dummyProcess) Stop() error { - return nil -} - -func (p dummyProcess) args() []string { - return []string{} -} - -func (p dummyProcess) binary() string { - return "dummy" -} - -func (p dummyProcess) warmup() { - // let's do nothing. -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = Process(new(dummyProcess)) -) diff --git a/internal/pkg/pm2/pm2.go b/internal/pkg/pm2/pm2.go deleted file mode 100644 index 533dc0a9..00000000 --- a/internal/pkg/pm2/pm2.go +++ /dev/null @@ -1,165 +0,0 @@ -package pm2 - -import ( - "encoding/json" - "fmt" - "os/exec" - - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -// Process is a type that can start or -// stop a process with PM2. -type Process interface { - Fullname() string - Start() error - IsViable() bool - Stop() error - args() []string - binary() string - warmup() -} - -type pm2Command string - -const ( - startCommand pm2Command = "start" - restartCommand pm2Command = "restart" - stopCommand pm2Command = "stop" - logsCommand pm2Command = "logs" - jlistCommand pm2Command = "jlist" -) - -/* -JListItem is a struct -used for unmarshaling -ONE item of the result -of the command "pm2 jlist". -*/ -type JListItem struct { - Name string `json:"name"` - PM2Env struct { - Status string `json:"status"` - RestartTime int64 `json:"restart_time"` - } `json:"pm2_env"` - Monit struct { - Memory int64 `json:"memory"` - CPU float64 `json:"cpu"` - } `json:"monit"` -} - -/* -JList is a struct -used for unmarshaling -the result of the command -"pm2 jlist". -*/ -type JList []JListItem - -func (list JList) isOnline(p Process) bool { - const onlineStatus string = "online" - for _, item := range list { - if item.Name == p.binary() { - return item.PM2Env.Status == onlineStatus - } - } - return false -} - -// List returns the -// processes details. -func List() (*JList, error) { - const op = "pm2.List" - resolver := func() (*JList, error) { - out, err := exec. - Command("pm2", string(jlistCommand)). - Output() - if err != nil { - return nil, err - } - data := &JList{} - if err := json.Unmarshal(out, data); err != nil { - return nil, err - } - return data, nil - } - list, err := resolver() - if err != nil { - return nil, xerror.New(op, err) - } - return list, nil -} - -func start(logger xlog.Logger, process Process) error { - const ( - op string = "pm2.start" - maximumAttempts int = 3 - ) - resolver := func() error { - // first, we try to start the process. - if err := run(logger, startCommand, process); err != nil { - return err - } - // we wait the process to be ready. - process.warmup() - // if the process failed to start correctly, - // we have to restart it. - if !process.IsViable() { - attempts := 0 - for attempts < maximumAttempts && !process.IsViable() { - if err := run(logger, restartCommand, process); err != nil { - return err - } - process.warmup() - attempts++ - } - if !process.IsViable() { - return fmt.Errorf("failed to start '%s'", process.Fullname()) - } - } - // the process is viable, let's log its - // output. - if err := run(logger, logsCommand, process); err != nil { - return err - } - return nil - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func stop(logger xlog.Logger, process Process) error { - const op string = "pm2.stop" - if err := run(logger, stopCommand, process); err != nil { - return xerror.New(op, err) - } - return nil -} - -func run(logger xlog.Logger, pm2Cmd pm2Command, process Process) error { - const op string = "pm2.run" - resolver := func() error { - args := []string{ - string(pm2Cmd), - process.binary(), - } - if pm2Cmd == startCommand { - args = append(args, "--interpreter=none", "--") - args = append(args, process.args()...) - } - cmd, err := xexec.Command(logger, "pm2", args...) - if err != nil { - return err - } - xexec.LogBeforeExecute(logger, cmd) - return cmd.Start() - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} diff --git a/internal/pkg/pm2/unoconv.go b/internal/pkg/pm2/unoconv.go deleted file mode 100644 index 219dc554..00000000 --- a/internal/pkg/pm2/unoconv.go +++ /dev/null @@ -1,103 +0,0 @@ -package pm2 - -import ( - "time" - - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -type unoconvProcess struct { - logger xlog.Logger -} - -// NewUnoconvProcess returns a unoconv listener -// process. -func NewUnoconvProcess(logger xlog.Logger) Process { - return unoconvProcess{ - logger: logger, - } -} - -func (p unoconvProcess) Fullname() string { - return "unoconv listener" -} - -func (p unoconvProcess) Start() error { - const op string = "pm2.unoconvProcess.Start" - if err := start(p.logger, p); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (p unoconvProcess) IsViable() bool { - const op string = "pm2.unoconvProcess.IsViable" - p.logger.DebugfOp( - op, - "checking '%s' viability via PM2", - p.Fullname(), - ) - list, err := List() - if err != nil { - p.logger.ErrorfOp( - op, - "'%s' seems not viable as retrieving the list of processes via 'pm2 jlist' returned '%v'", - p.Fullname(), - err, - ) - return false - } - if list.isOnline(p) { - p.logger.DebugfOp( - op, - "'%s' is viable as its status is 'online'", - p.Fullname(), - ) - return true - } - p.logger.DebugfOp( - op, - "'%s' is not viable as its status is not 'online'", - p.Fullname(), - ) - return false -} - -func (p unoconvProcess) Stop() error { - const op string = "pm2.unoconvProcess.Stop" - if err := stop(p.logger, p); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (p unoconvProcess) args() []string { - return []string{ - "--listener", - "--verbose", - } -} - -func (p unoconvProcess) binary() string { - return "unoconv" -} - -func (p unoconvProcess) warmup() { - const ( - op string = "pm2.unoconvProcess.warmup" - warmupTime time.Duration = 3 * time.Second - ) - p.logger.DebugfOp( - op, - "waiting '%v' for allowing '%s' to warmup", - warmupTime, - p.Fullname(), - ) - time.Sleep(warmupTime) -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = Process(new(unoconvProcess)) -) diff --git a/internal/pkg/prinery/chrome.go b/internal/pkg/prinery/chrome.go deleted file mode 100644 index 8731054e..00000000 --- a/internal/pkg/prinery/chrome.go +++ /dev/null @@ -1,327 +0,0 @@ -package prinery - -import ( - "context" - "fmt" - "io/ioutil" - "time" - - "github.com/mafredri/cdp" - "github.com/mafredri/cdp/devtool" - "github.com/mafredri/cdp/protocol/network" - "github.com/mafredri/cdp/protocol/page" - "github.com/mafredri/cdp/protocol/target" - "github.com/mafredri/cdp/rpcc" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerrgroup" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" - "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" -) - -type chromeProcess struct { - devtPort uint -} - -func newChromeProcesses(nInstances int64) []process { - processes := make([]process, nInstances) - var i int64 - var currentPort uint = 9222 - for i = 0; i < nInstances; i++ { - processes[i] = chromeProcess{ - devtPort: currentPort, - } - currentPort++ - } - return processes -} - -func (p chromeProcess) id() string { - return fmt.Sprintf("%s-%d", p.binary(), p.port()) -} - -func (p chromeProcess) host() string { - return "127.0.0.1" -} - -func (p chromeProcess) port() uint { - return p.devtPort -} - -func (p chromeProcess) spec() processSpec { - return p -} - -func (p chromeProcess) binary() string { - return "google-chrome-stable" -} - -func (p chromeProcess) args() []string { - return []string{ - "--no-sandbox", - "--headless", - // see https://github.com/GoogleChrome/puppeteer/issues/2410. - "--font-render-hinting=medium", - fmt.Sprintf("--remote-debugging-port=%d", p.port()), - "--disable-gpu", - "--disable-translate", - "--disable-extensions", - "--disable-background-networking", - "--safebrowsing-disable-auto-update", - "--disable-sync", - "--disable-default-apps", - "--hide-scrollbars", - "--metrics-recording-only", - "--mute-audio", - "--no-first-run", - } -} - -func (p chromeProcess) warmupTime() time.Duration { - return 10 * time.Second -} - -func (p chromeProcess) viabilityFunc() func(logger xlog.Logger) bool { - const op string = "prinery.chromeProcess.viabilityFunc" - return func(logger xlog.Logger) bool { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - endpoint := fmt.Sprintf("http://%s:%d" /*p.host()*/, "localhost", p.port()) - logger.DebugfOp( - op, - "checking '%s' viability via endpoint '%s/json/version'", - p.id(), - endpoint, - ) - v, err := devtool.New(endpoint).Version(ctx) - if err != nil { - logger.ErrorfOp( - op, - "'%s' is not viable as endpoint returned '%v'", - p.id(), - err, - ) - return false - } - logger.DebugfOp( - op, - "'%s' is viable as endpoint returned '%v'", - p.id(), - v, - ) - return true - } -} - -type chromePrinter struct { - logger xlog.Logger - url string - opts ChromePrintOptions -} - -func (p chromePrinter) print(ctx context.Context, spec processSpec, dest string) error { - const op string = "prinery.chromePrinter.print" - resolver := func() error { - devtEndpoint := fmt.Sprintf("http://%s:%d", spec.host(), spec.port()) - devt, err := devtool.New(devtEndpoint).Version(ctx) - if err != nil { - return err - } - // connect to WebSocket URL (page) that speaks the Chrome DevTools Protocol. - devtConn, err := rpcc.DialContext(ctx, devt.WebSocketDebuggerURL) - if err != nil { - return err - } - defer devtConn.Close() // nolint: errcheck - // create a new CDP Client that uses conn. - devtClient := cdp.NewClient(devtConn) - newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx) - if err != nil { - return err - } - /* - close the browser context when done. - we're not using the "default" context - as it may timeout before actually closing - the browser context. - see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 - */ - disposeBrowserContextArgs := target.NewDisposeBrowserContextArgs(newContextTarget.BrowserContextID) - defer devtClient.Target.DisposeBrowserContext(context.Background(), disposeBrowserContextArgs) // nolint: errcheck - // create a new blank target with the new browser context. - createTargetArgs := target. - NewCreateTargetArgs("about:blank"). - SetBrowserContextID(newContextTarget.BrowserContextID) - newTarget, err := devtClient.Target.CreateTarget(ctx, createTargetArgs) - if err != nil { - return err - } - // connect the client to the new target. - newTargetWsURL := fmt.Sprintf("ws://%s:%d/devtools/page/%s", spec.host(), spec.port(), newTarget.TargetID) - newContextConn, err := rpcc.DialContext(ctx, newTargetWsURL) - if err != nil { - return err - } - defer newContextConn.Close() // nolint: errcheck - // create a new CDP Client that uses newContextConn. - targetClient := cdp.NewClient(newContextConn) - /* - close the target when done. - we're not using the "default" context - as it may timeout before actually closing - the target. - see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 - */ - closeTargetArgs := target.NewCloseTargetArgs(newTarget.TargetID) - defer targetClient.Target.CloseTarget(context.Background(), closeTargetArgs) // nolint: errcheck - // enable all events. - if err := p.enableEvents(ctx, targetClient); err != nil { - return err - } - // listen for all events. - if err := p.listenEvents(ctx, targetClient); err != nil { - return err - } - // apply a wait delay (if any). - if p.opts.WaitDelay > 0.0 { - // wait for a given amount of time (useful for javascript delay). - p.logger.DebugfOp(op, "applying a wait delay of '%.2fs'...", p.opts.WaitDelay) - time.Sleep(xtime.Duration(p.opts.WaitDelay)) - } else { - p.logger.DebugOp(op, "no wait delay to apply, moving on...") - } - // print the page to PDF. - print, err := targetClient.Page.PrintToPDF( - ctx, - page.NewPrintToPDFArgs(). - SetPaperWidth(p.opts.PaperWidth). - SetPaperHeight(p.opts.PaperHeight). - SetMarginTop(p.opts.MarginTop). - SetMarginBottom(p.opts.MarginBottom). - SetMarginLeft(p.opts.MarginLeft). - SetMarginRight(p.opts.MarginRight). - SetLandscape(p.opts.Landscape). - SetDisplayHeaderFooter(true). - SetHeaderTemplate(p.opts.HeaderHTML). - SetFooterTemplate(p.opts.FooterHTML). - SetPrintBackground(true), - ) - if err != nil { - return err - } - if err := ioutil.WriteFile(dest, print.Data, 0644); err != nil { - return err - } - return nil - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (p chromePrinter) enableEvents(ctx context.Context, client *cdp.Client) error { - const op string = "prinery.chromePrinter.enableEvents" - // enable all the domain events that we're interested in. - if err := xerrgroup.Run( - func() error { return client.DOM.Enable(ctx) }, - func() error { return client.Network.Enable(ctx, network.NewEnableArgs()) }, - func() error { return client.Page.Enable(ctx) }, - func() error { - return client.Page.SetLifecycleEventsEnabled(ctx, page.NewSetLifecycleEventsEnabledArgs(true)) - }, - func() error { return client.Runtime.Enable(ctx) }, - ); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (p chromePrinter) listenEvents(ctx context.Context, client *cdp.Client) error { - const op string = "prinery.chromePrinter.listenEvents" - resolver := func() error { - // make sure Page events are enabled. - if err := client.Page.Enable(ctx); err != nil { - return err - } - // make sure Network events are enabled. - if err := client.Network.Enable(ctx, nil); err != nil { - return err - } - // create all clients for events. - domContentEventFired, err := client.Page.DOMContentEventFired(ctx) - if err != nil { - return err - } - defer domContentEventFired.Close() // nolint: errcheck - loadEventFired, err := client.Page.LoadEventFired(ctx) - if err != nil { - return err - } - defer loadEventFired.Close() // nolint: errcheck - lifecycleEvent, err := client.Page.LifecycleEvent(ctx) - if err != nil { - return err - } - defer lifecycleEvent.Close() // nolint: errcheck - loadingFinished, err := client.Network.LoadingFinished(ctx) - if err != nil { - return err - } - defer loadingFinished.Close() // nolint: errcheck - if _, err := client.Page.Navigate(ctx, page.NewNavigateArgs(p.url)); err != nil { - return err - } - // wait for all events. - return xerrgroup.Run( - func() error { - _, err := domContentEventFired.Recv() - if err != nil { - return err - } - p.logger.DebugOp(op, "event 'domContentEventFired' received") - return nil - }, - func() error { - _, err := loadEventFired.Recv() - if err != nil { - return err - } - p.logger.DebugOp(op, "event 'loadEventFired' received") - return nil - }, - func() error { - const networkIdleEventName string = "networkIdle" - for { - ev, err := lifecycleEvent.Recv() - if err != nil { - return err - } - p.logger.DebugfOp(op, "event '%s' received", ev.Name) - if ev.Name == networkIdleEventName { - break - } - } - return nil - }, - func() error { - _, err := loadingFinished.Recv() - if err != nil { - return err - } - p.logger.DebugOp(op, "event 'loadingFinished' received") - return nil - }, - ) - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = processSpec(new(chromeProcess)) - _ = process(new(chromeProcess)) - _ = printer(new(chromePrinter)) -) diff --git a/internal/pkg/prinery/doc.go b/internal/pkg/prinery/doc.go deleted file mode 100644 index d16971e5..00000000 --- a/internal/pkg/prinery/doc.go +++ /dev/null @@ -1 +0,0 @@ -package prinery diff --git a/internal/pkg/prinery/markdown.go b/internal/pkg/prinery/markdown.go deleted file mode 100644 index 0c3cdfcb..00000000 --- a/internal/pkg/prinery/markdown.go +++ /dev/null @@ -1,68 +0,0 @@ -package prinery - -import ( - "bytes" - "fmt" - "html/template" - "io/ioutil" - "path/filepath" - - "github.com/microcosm-cc/bluemonday" - "github.com/russross/blackfriday/v2" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" - "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" -) - -func newMarkdownPrinter(logger xlog.Logger, fpath string, opts ChromePrintOptions) (printer, error) { - const op string = "prinery.newMarkdownPrinter" - resolver := func() (string, error) { - tmpl, err := template. - New(filepath.Base(fpath)). - Funcs(template.FuncMap{"toHTML": markdownToHTML}). - ParseFiles(fpath) - if err != nil { - return "", err - } - dirPath := filepath.Dir(fpath) - data := &templateData{DirPath: dirPath} - logger.DebugOp(op, "converting Markdown files to HTML...") - var buffer bytes.Buffer - if err := tmpl.Execute(&buffer, data); err != nil { - return "", err - } - baseFilename := xrand.Get() - dst := fmt.Sprintf("%s/%s.html", dirPath, baseFilename) - logger.DebugOp(op, "writing the HTML from previous conversion(s) into new file...") - if err := ioutil.WriteFile(dst, buffer.Bytes(), 0644); err != nil { - return "", err - } - return fmt.Sprintf("file://%s", dst), nil - } - URL, err := resolver() - if err != nil { - return nil, xerror.New(op, err) - } - return chromePrinter{ - logger: logger, - url: URL, - opts: opts, - }, nil -} - -type templateData struct { - DirPath string -} - -func markdownToHTML(dirPath, filename string) (template.HTML, error) { - const op string = "prinery.markdownToHTML" - fpath := fmt.Sprintf("%s/%s", dirPath, filename) - b, err := ioutil.ReadFile(fpath) - if err != nil { - return "", xerror.New(op, err) - } - unsafe := blackfriday.Run(b) - content := bluemonday.UGCPolicy().SanitizeBytes(unsafe) - /* #nosec */ - return template.HTML(content), nil -} diff --git a/internal/pkg/prinery/merge.go b/internal/pkg/prinery/merge.go deleted file mode 100644 index 377c6fc0..00000000 --- a/internal/pkg/prinery/merge.go +++ /dev/null @@ -1,39 +0,0 @@ -package prinery - -import ( - "context" - - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -type mergePrinter struct { - logger xlog.Logger - fpaths []string -} - -func (p mergePrinter) print(ctx context.Context, spec processSpec, dest string) error { - const op string = "prinery.mergePrinter.print" - p.logger.DebugfOp(op, "merging '%v'...", p.fpaths) - resolver := func() error { - var args []string - args = append(args, p.fpaths...) - args = append(args, "cat", "output", dest) - cmd, err := xexec.CommandContext(ctx, p.logger, "pdftk", args...) - if err != nil { - return err - } - xexec.LogBeforeExecute(p.logger, cmd) - return cmd.Run() - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = printer(new(mergePrinter)) -) diff --git a/internal/pkg/prinery/pm2.go b/internal/pkg/prinery/pm2.go deleted file mode 100644 index 8e4b954c..00000000 --- a/internal/pkg/prinery/pm2.go +++ /dev/null @@ -1,365 +0,0 @@ -package prinery - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -type command string - -const ( - startCommand command = "start" - restartCommand command = "restart" - stopCommand command = "stop" - logsCommand command = "logs" - jlistCommand command = "jlist" -) - -const maximumRestartAttempts uint = 3 - -type pm2 struct { - logger xlog.Logger - config conf.Config - chromeUnit *unit - sofficeUnit *unit - processes []process -} - -func NewPM2Prinery(logger xlog.Logger, config conf.Config) (Prinery, error) { - const op string = "prinery.NewPM2Prinery" - resolver := func() (*pm2, error) { - m := &pm2{ - logger: logger, - config: config, - } - chromeProcesses := newChromeProcesses(config.GoogleChromeInstances()) - if len(chromeProcesses) > 0 { - unit, err := newUnit(logger, processesToSpecs(chromeProcesses)) - if err != nil { - return nil, err - } - m.chromeUnit = unit - } - sofficeProcesses := newSofficesProcesses(config.SofficeInstances()) - if len(sofficeProcesses) > 0 { - unit, err := newUnit(logger, processesToSpecs(sofficeProcesses)) - if err != nil { - return nil, err - } - m.sofficeUnit = unit - } - m.processes = append(chromeProcesses, sofficeProcesses...) - return m, nil - } - p, err := resolver() - if err != nil { - return nil, xerror.New(op, err) - } - return p, nil -} - -func (m *pm2) Start(emergency chan error) error { - const op string = "prinery.pm2.Start" - // start processes. - // those lines "works" but processes - // fail to start... - /*var wg sync.WaitGroup - result := make(chan error, len(m.processes)) - for _, proc := range m.processes { - wg.Add(1) - go func(proc process, result chan error) { - result <- m.start(proc) - wg.Done() - }(proc, result) - } - wg.Wait() - close(result) - for err := range result { - if err != nil { - return xerror.New(op, err) - } - }*/ - for _, proc := range m.processes { - if err := m.start(proc); err != nil { - return xerror.New(op, err) - } - } - // start units. - if m.chromeUnit != nil { - go m.chromeUnit.start(emergency) - } - if m.sofficeUnit != nil { - go m.sofficeUnit.start(emergency) - } - return nil -} - -func (m *pm2) HTML( - ctx context.Context, - logger xlog.Logger, - dest, fpath string, - opts ChromePrintOptions, -) error { - const op string = "prinery.pm2.HTML" - resolver := func() error { - if m.chromeUnit == nil { - return errors.New("cannot handle HTML print request as there is no chromeUnit") - } - URL := fmt.Sprintf("file://%s", fpath) - p := chromePrinter{ - logger: logger, - url: URL, - opts: opts, - } - req := request{ - ctx: ctx, - logger: logger, - printer: p, - dest: dest, - result: make(chan error), - } - m.chromeUnit.dispatch(req) - err := <-req.result - return err - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (m *pm2) URL( - ctx context.Context, - logger xlog.Logger, dest, URL string, - opts ChromePrintOptions, -) error { - const op string = "prinery.pm2.URL" - resolver := func() error { - if m.chromeUnit == nil { - return errors.New("cannot handle URL print request as there is no chromeUnit") - } - p := chromePrinter{ - logger: logger, - url: URL, - opts: opts, - } - req := request{ - ctx: ctx, - logger: logger, - printer: p, - dest: dest, - result: make(chan error), - } - m.chromeUnit.dispatch(req) - err := <-req.result - return err - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (m *pm2) Markdown( - ctx context.Context, - logger xlog.Logger, - dest, fpath string, - opts ChromePrintOptions, -) error { - const op string = "prinery.pm2.Markdown" - resolver := func() error { - if m.chromeUnit == nil { - return errors.New("cannot handle Markdown print request as there is no chromeUnit") - } - p, err := newMarkdownPrinter(logger, fpath, opts) - if err != nil { - return err - } - req := request{ - ctx: ctx, - logger: logger, - printer: p, - dest: dest, - result: make(chan error), - } - m.chromeUnit.dispatch(req) - err = <-req.result - return err - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (m *pm2) Office( - ctx context.Context, - logger xlog.Logger, - dest string, - fpaths []string, - opts UnoconvPrintOptions, -) error { - const op string = "prinery.pm2.Office" - resolver := func() error { - if m.sofficeUnit == nil { - return errors.New("cannot handle Office print request as there is no sofficeUnit") - } - p := unoconvPrinter{ - logger: logger, - fpaths: fpaths, - opts: opts, - } - req := request{ - ctx: ctx, - logger: logger, - printer: p, - dest: dest, - result: make(chan error), - } - m.sofficeUnit.dispatch(req) - err := <-req.result - return err - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (m *pm2) Merge( - ctx context.Context, - logger xlog.Logger, - dest string, - fpaths []string, -) error { - const op string = "prinery.pm2.Merge" - p := mergePrinter{ - logger: logger, - fpaths: fpaths, - } - if err := p.print(ctx, nil, dest); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (m *pm2) start(p process) error { - const op string = "prinery.pm2.start" - resolver := func() error { - // first, we try to start the process. - if err := m.run(startCommand, p); err != nil { - return err - } - // we wait the process to be ready. - m.warmup(p) - // if the process failed to start correctly, - // we have to restart it. - if !m.isViable(p) && maximumRestartAttempts > 0 { - return m.restart(p) - } - // the process is viable, let's log its - // output. - return m.logs(p) - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (m *pm2) restart(p process) error { - const op string = "prinery.pm2.restart" - resolver := func() error { - var attempts uint - for attempts < maximumRestartAttempts { - // we restart the process. - if err := m.run(restartCommand, p); err != nil { - return err - } - // we wait the process to be ready. - m.warmup(p) - attempts++ - // if the process is viable, we - // leave. - if m.isViable(p) { - return m.logs(p) - } - } - return fmt.Errorf("failed to start '%s'", p.spec().id()) - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (m *pm2) isViable(p process) bool { - if !p.viabilityFunc()(m.logger) { - return false - } - /*m.listLock.Lock() - defer m.listLock.Unlock() - return m.list.isOnline(p)*/ - return true -} - -func (m *pm2) warmup(p process) { - const op string = "prinery.pm2.warmup" - warmupTime := p.warmupTime() - m.logger.DebugfOp( - op, - "waiting '%v' for allowing '%s' to warmup", - warmupTime, - p.spec().id(), - ) - time.Sleep(warmupTime) -} - -func (m *pm2) logs(p process) error { - const op string = "prinery.pm2.logs" - if m.config.LogLevel() == xlog.DebugLevel { - if err := m.run(logsCommand, p); err != nil { - return xerror.New(op, err) - } - } - return nil -} - -func (m *pm2) run(pm2Cmd command, p process) error { - const op string = "prinery.pm2.run" - resolver := func() error { - args := []string{ - string(pm2Cmd), - } - if pm2Cmd == startCommand { - args = append(args, p.binary()) - args = append(args, fmt.Sprintf("--name=%s", p.spec().id())) - args = append(args, "--interpreter=none", "--") - args = append(args, p.args()...) - } else { - args = append(args, p.spec().id()) - } - cmd, err := xexec.Command(m.logger, "pm2", args...) - if err != nil { - return err - } - xexec.LogBeforeExecute(m.logger, cmd) - return cmd.Start() - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = Prinery(new(pm2)) -) diff --git a/internal/pkg/prinery/prinery.go b/internal/pkg/prinery/prinery.go deleted file mode 100644 index e21bc03b..00000000 --- a/internal/pkg/prinery/prinery.go +++ /dev/null @@ -1,90 +0,0 @@ -package prinery - -import ( - "context" - "time" - - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -type processSpec interface { - id() string - host() string - port() uint -} - -type process interface { - spec() processSpec - binary() string - args() []string - warmupTime() time.Duration - viabilityFunc() func(logger xlog.Logger) bool -} - -func processesToSpecs(processes []process) []processSpec { - specs := make([]processSpec, len(processes)) - for i, p := range processes { - specs[i] = p.spec() - } - return specs -} - -type printer interface { - print(ctx context.Context, spec processSpec, dest string) error -} - -// ChromePrintOptions helps customizing the -// Google Chrome print result. -type ChromePrintOptions struct { - WaitDelay float64 - HeaderHTML string - FooterHTML string - PaperWidth float64 - PaperHeight float64 - MarginTop float64 - MarginBottom float64 - MarginLeft float64 - MarginRight float64 - Landscape bool -} - -// DefaultChromePrintOptions returns the default -// Google Chrome print options. -func DefaultChromePrintOptions() ChromePrintOptions { - const defaultHeaderFooterHTML string = "" - return ChromePrintOptions{ - WaitDelay: 0.0, - HeaderHTML: defaultHeaderFooterHTML, - FooterHTML: defaultHeaderFooterHTML, - PaperWidth: 8.27, - PaperHeight: 11.7, - MarginTop: 1.0, - MarginBottom: 1.0, - MarginLeft: 1.0, - MarginRight: 1.0, - Landscape: false, - } -} - -// UnoconvPrintOptions helps customizing the -// LibreOffice print result. -type UnoconvPrintOptions struct { - Landscape bool -} - -// DefaultUnoconvPrinterOptions returns the default -// LibreOffice print options. -func DefaultUnoconvPrinterOptions() UnoconvPrintOptions { - return UnoconvPrintOptions{ - Landscape: false, - } -} - -type Prinery interface { - Start(emergency chan error) error - HTML(ctx context.Context, logger xlog.Logger, dest, fpath string, opts ChromePrintOptions) error - URL(ctx context.Context, logger xlog.Logger, dest, URL string, opts ChromePrintOptions) error - Markdown(ctx context.Context, logger xlog.Logger, dest, fpath string, opts ChromePrintOptions) error - Office(ctx context.Context, logger xlog.Logger, dest string, fpaths []string, opts UnoconvPrintOptions) error - Merge(ctx context.Context, logger xlog.Logger, dest string, fpaths []string) error -} diff --git a/internal/pkg/prinery/soffice.go b/internal/pkg/prinery/soffice.go deleted file mode 100644 index 8a4db4ab..00000000 --- a/internal/pkg/prinery/soffice.go +++ /dev/null @@ -1,158 +0,0 @@ -package prinery - -import ( - "context" - "fmt" - "os" - "path/filepath" - "time" - - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" - "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" -) - -type sofficeProcess struct { - unoPort uint -} - -func newSofficesProcesses(nInstances int64) []process { - processes := make([]process, nInstances) - var i int64 - var currentPort uint = 2002 - for i = 0; i < nInstances; i++ { - processes[i] = sofficeProcess{ - unoPort: currentPort, - } - currentPort++ - } - return processes -} - -func (p sofficeProcess) id() string { - return fmt.Sprintf("%s-%d", p.binary(), p.port()) -} - -func (p sofficeProcess) host() string { - return "127.0.0.1" -} - -func (p sofficeProcess) port() uint { - return p.unoPort -} - -func (p sofficeProcess) spec() processSpec { - return p -} - -func (p sofficeProcess) binary() string { - return "soffice" -} - -func (p sofficeProcess) args() []string { - return []string{ - // see https://ask.libreoffice.org/en/question/42975/how-can-i-run-multiple-instances-of-sofficebin-at-a-time/. - fmt.Sprintf("-env:UserInstallation=file:///tmp/%d", p.port()), - "--headless", - "--invisible", - "--nocrashreport", - "--nodefault", - "--nofirststartwizard", - "--nologo", - "--norestore", - fmt.Sprintf("--accept=socket,host=%s,port=%d,tcpNoDelay=1;urp;StarOffice.ComponentContext", p.host(), p.port()), - } -} - -func (p sofficeProcess) warmupTime() time.Duration { - return 3 * time.Second -} - -func (p sofficeProcess) viabilityFunc() func(logger xlog.Logger) bool { - const op string = "prinery.sofficeProcess.viabilityFunc" - return func(logger xlog.Logger) bool { - // TODO find a way to check. - return true - } -} - -type unoconvPrinter struct { - logger xlog.Logger - fpaths []string - opts UnoconvPrintOptions -} - -func (p unoconvPrinter) print(ctx context.Context, spec processSpec, dest string) error { - const op string = "prinery.unoconvPrinter.print" - resolver := func() error { - fpaths := make([]string, len(p.fpaths)) - dirPath := filepath.Dir(dest) - for i, fpath := range p.fpaths { - baseFilename := xrand.Get() - tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) - p.logger.DebugfOp(op, "converting '%s' to PDF...", fpath) - if err := p.unoconv(ctx, spec, fpath, tmpDest); err != nil { - return err - } - p.logger.DebugfOp(op, "'%s.pdf' created", baseFilename) - fpaths[i] = tmpDest - } - if len(fpaths) == 1 { - p.logger.DebugOp(op, "only one PDF created, nothing to merge") - if err := os.Rename(fpaths[0], dest); err != nil { - return err - } - return nil - } - merger := mergePrinter{ - logger: p.logger, - fpaths: fpaths, - } - return merger.print(ctx, nil, dest) - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (p unoconvPrinter) unoconv(ctx context.Context, spec processSpec, fpath, dest string) error { - const op string = "prinery.unoconvPrinter.unoconv" - resolver := func() error { - args := []string{ - "--server", - spec.host(), - "--port", - fmt.Sprintf("%d", spec.port()), - "--format", - "pdf", - } - if p.opts.Landscape { - args = append(args, "--printer", "PaperOrientation=landscape") - } - args = append(args, "--output", dest, fpath) - cmd, err := xexec.CommandContext( - ctx, - p.logger, - "unoconv", - args..., - ) - if err != nil { - return err - } - xexec.LogBeforeExecute(p.logger, cmd) - return cmd.Run() - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = processSpec(new(sofficeProcess)) - _ = process(new(sofficeProcess)) - _ = printer(new(unoconvPrinter)) -) diff --git a/internal/pkg/prinery/unit.go b/internal/pkg/prinery/unit.go deleted file mode 100644 index 58d49414..00000000 --- a/internal/pkg/prinery/unit.go +++ /dev/null @@ -1,125 +0,0 @@ -package prinery - -import ( - "context" - "errors" - - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -type request struct { - ctx context.Context - logger xlog.Logger - printer printer - dest string - result chan error -} - -type worker struct { - work chan request - spec processSpec -} - -func (w *worker) do(done chan *worker) { - for { - req := <-w.work - req.result <- req.printer.print(req.ctx, w.spec, req.dest) - done <- w - } -} - -type unit struct { - logger xlog.Logger - workers []*worker - work chan request - pool chan *worker - done chan *worker -} - -func newUnit(logger xlog.Logger, specs []processSpec) (*unit, error) { - const op string = "prinery.newUnit" - resolver := func() (*unit, error) { - nWorkers := len(specs) - if nWorkers == 0 { - return nil, errors.New("no workers to create") - } - logger.DebugfOp(op, "creating '%d' workers...", nWorkers) - workers := make([]*worker, nWorkers) - work := make(chan request, 1) - pool := make(chan *worker, nWorkers) - done := make(chan *worker, nWorkers) - for i, spec := range specs { - w := &worker{ - work: work, - spec: spec, - } - logger.DebugfOp(op, "worker '%s' created", w.spec.id()) - workers[i] = w - } - return &unit{ - logger: logger, - workers: workers, - work: work, - pool: pool, - done: done, - }, nil - } - u, err := resolver() - if err != nil { - return nil, xerror.New(op, err) - } - return u, nil -} - -func (u *unit) start(emergency chan error) { - const op string = "prinery.unit.start" - for _, w := range u.workers { - u.logger.DebugfOp(op, "starting worker '%s'...", w.spec.id()) - go w.do(u.done) - u.pool <- w - } - for { - select { - case req := <-u.work: - u.dispatch(req) - case w := <-u.done: - u.completed(w, emergency) - } - } -} - -func (u *unit) request(ctx context.Context, logger xlog.Logger, printer printer, dest string) error { - const op string = "prinery.unit.request" - req := request{ - ctx: ctx, - logger: logger, - printer: printer, - dest: dest, - result: make(chan error), - } - u.dispatch(req) - err := <-req.result - if err != nil { - return xerror.New(op, err) - } - return nil -} - -func (u *unit) dispatch(req request) { - const op string = "prinery.unit.dispatch" - select { - case w := <-u.pool: - u.logger.DebugfOp(op, "worker '%s' is now in use", w.spec.id()) - w.work <- req - case <-req.ctx.Done(): - req.result <- xerror.New(op, req.ctx.Err()) - } -} - -func (u *unit) completed(w *worker, emergency chan error) { - const op string = "prinery.unit.completed" - // TODO check viability, handles errors via emergency chan. - u.logger.DebugfOp(op, "worker '%s' is ready for a new request", w.spec.id()) - u.pool <- w -} diff --git a/internal/pkg/print/chrome.go b/internal/pkg/print/chrome.go deleted file mode 100644 index b1abdf8a..00000000 --- a/internal/pkg/print/chrome.go +++ /dev/null @@ -1,265 +0,0 @@ -package print - -import ( - "context" - "fmt" - "io/ioutil" - "time" - - "github.com/mafredri/cdp" - "github.com/mafredri/cdp/devtool" - "github.com/mafredri/cdp/protocol/network" - "github.com/mafredri/cdp/protocol/page" - "github.com/mafredri/cdp/protocol/target" - "github.com/mafredri/cdp/rpcc" - "github.com/thecodingmachine/gotenberg/internal/pkg/process" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerrgroup" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" - "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" -) - -type chromePrint struct { - logger xlog.Logger - url string - opts ChromePrintOptions -} - -// ChromePrintOptions helps customizing the -// Google Chrome Print result. -type ChromePrintOptions struct { - WaitDelay float64 - HeaderHTML string - FooterHTML string - PaperWidth float64 - PaperHeight float64 - MarginTop float64 - MarginBottom float64 - MarginLeft float64 - MarginRight float64 - Landscape bool -} - -// DefaultChromePrintOptions returns the default -// Google Chrome Print options. -func DefaultChromePrintOptions() ChromePrintOptions { - const defaultHeaderFooterHTML string = "" - return ChromePrintOptions{ - WaitDelay: 0.0, - HeaderHTML: defaultHeaderFooterHTML, - FooterHTML: defaultHeaderFooterHTML, - PaperWidth: 8.27, - PaperHeight: 11.7, - MarginTop: 1.0, - MarginBottom: 1.0, - MarginLeft: 1.0, - MarginRight: 1.0, - Landscape: false, - } -} - -func (p chromePrint) Print(ctx context.Context, dest string, proc process.Process) error { - const op string = "print.chromePrint.Print" - resolver := func() error { - devtEndpoint := fmt.Sprintf("http://%s:%d", proc.Host(), proc.Port()) - devt, err := devtool.New(devtEndpoint).Version(ctx) - if err != nil { - return err - } - // connect to WebSocket URL (page) that speaks the Chrome DevTools Protocol. - devtConn, err := rpcc.DialContext(ctx, devt.WebSocketDebuggerURL) - if err != nil { - return err - } - defer devtConn.Close() // nolint: errcheck - // create a new CDP Client that uses conn. - devtClient := cdp.NewClient(devtConn) - newContextTarget, err := devtClient.Target.CreateBrowserContext(ctx) - if err != nil { - return err - } - /* - close the browser context when done. - we're not using the "default" context - as it may timeout before actually closing - the browser context. - see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 - */ - disposeBrowserContextArgs := target.NewDisposeBrowserContextArgs(newContextTarget.BrowserContextID) - defer devtClient.Target.DisposeBrowserContext(context.Background(), disposeBrowserContextArgs) // nolint: errcheck - // create a new blank target with the new browser context. - createTargetArgs := target. - NewCreateTargetArgs("about:blank"). - SetBrowserContextID(newContextTarget.BrowserContextID) - newTarget, err := devtClient.Target.CreateTarget(ctx, createTargetArgs) - if err != nil { - return err - } - // connect the client to the new target. - newTargetWsURL := fmt.Sprintf("ws://%s:%d/devtools/page/%s", proc.Host(), proc.Port(), newTarget.TargetID) - newContextConn, err := rpcc.DialContext(ctx, newTargetWsURL) - if err != nil { - return err - } - defer newContextConn.Close() // nolint: errcheck - // create a new CDP Client that uses newContextConn. - targetClient := cdp.NewClient(newContextConn) - /* - close the target when done. - we're not using the "default" context - as it may timeout before actually closing - the target. - see: https://github.com/mafredri/cdp/issues/101#issuecomment-524533670 - */ - closeTargetArgs := target.NewCloseTargetArgs(newTarget.TargetID) - defer targetClient.Target.CloseTarget(context.Background(), closeTargetArgs) // nolint: errcheck - // enable all events. - if err := p.enableEvents(ctx, targetClient); err != nil { - return err - } - // listen for all events. - if err := p.listenEvents(ctx, targetClient); err != nil { - return err - } - // apply a wait delay (if any). - if p.opts.WaitDelay > 0.0 { - // wait for a given amount of time (useful for javascript delay). - p.logger.DebugfOp(op, "applying a wait delay of '%.2fs'...", p.opts.WaitDelay) - time.Sleep(xtime.Duration(p.opts.WaitDelay)) - } else { - p.logger.DebugOp(op, "no wait delay to apply, moving on...") - } - // print the page to PDF. - print, err := targetClient.Page.PrintToPDF( - ctx, - page.NewPrintToPDFArgs(). - SetPaperWidth(p.opts.PaperWidth). - SetPaperHeight(p.opts.PaperHeight). - SetMarginTop(p.opts.MarginTop). - SetMarginBottom(p.opts.MarginBottom). - SetMarginLeft(p.opts.MarginLeft). - SetMarginRight(p.opts.MarginRight). - SetLandscape(p.opts.Landscape). - SetDisplayHeaderFooter(true). - SetHeaderTemplate(p.opts.HeaderHTML). - SetFooterTemplate(p.opts.FooterHTML). - SetPrintBackground(true), - ) - if err != nil { - return err - } - if err := ioutil.WriteFile(dest, print.Data, 0644); err != nil { - return err - } - return nil - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (p chromePrint) enableEvents(ctx context.Context, client *cdp.Client) error { - const op string = "print.chromePrint.enableEvents" - // enable all the domain events that we're interested in. - if err := xerrgroup.Run( - func() error { return client.DOM.Enable(ctx) }, - func() error { return client.Network.Enable(ctx, network.NewEnableArgs()) }, - func() error { return client.Page.Enable(ctx) }, - func() error { - return client.Page.SetLifecycleEventsEnabled(ctx, page.NewSetLifecycleEventsEnabledArgs(true)) - }, - func() error { return client.Runtime.Enable(ctx) }, - ); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (p chromePrint) listenEvents(ctx context.Context, client *cdp.Client) error { - const op string = "print.chromePrint.listenEvents" - resolver := func() error { - // make sure Page events are enabled. - if err := client.Page.Enable(ctx); err != nil { - return err - } - // make sure Network events are enabled. - if err := client.Network.Enable(ctx, nil); err != nil { - return err - } - // create all clients for events. - domContentEventFired, err := client.Page.DOMContentEventFired(ctx) - if err != nil { - return err - } - defer domContentEventFired.Close() // nolint: errcheck - loadEventFired, err := client.Page.LoadEventFired(ctx) - if err != nil { - return err - } - defer loadEventFired.Close() // nolint: errcheck - lifecycleEvent, err := client.Page.LifecycleEvent(ctx) - if err != nil { - return err - } - defer lifecycleEvent.Close() // nolint: errcheck - loadingFinished, err := client.Network.LoadingFinished(ctx) - if err != nil { - return err - } - defer loadingFinished.Close() // nolint: errcheck - if _, err := client.Page.Navigate(ctx, page.NewNavigateArgs(p.url)); err != nil { - return err - } - // wait for all events. - return xerrgroup.Run( - func() error { - _, err := domContentEventFired.Recv() - if err != nil { - return err - } - p.logger.DebugOp(op, "event 'domContentEventFired' received") - return nil - }, - func() error { - _, err := loadEventFired.Recv() - if err != nil { - return err - } - p.logger.DebugOp(op, "event 'loadEventFired' received") - return nil - }, - func() error { - const networkIdleEventName string = "networkIdle" - for { - ev, err := lifecycleEvent.Recv() - if err != nil { - return err - } - p.logger.DebugfOp(op, "event '%s' received", ev.Name) - if ev.Name == networkIdleEventName { - break - } - } - return nil - }, - func() error { - _, err := loadingFinished.Recv() - if err != nil { - return err - } - p.logger.DebugOp(op, "event 'loadingFinished' received") - return nil - }, - ) - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = Print(new(chromePrint)) -) diff --git a/internal/pkg/print/doc.go b/internal/pkg/print/doc.go deleted file mode 100644 index 91d3830c..00000000 --- a/internal/pkg/print/doc.go +++ /dev/null @@ -1 +0,0 @@ -package print diff --git a/internal/pkg/print/markdown.go b/internal/pkg/print/markdown.go deleted file mode 100644 index 0be02349..00000000 --- a/internal/pkg/print/markdown.go +++ /dev/null @@ -1,70 +0,0 @@ -package print - -import ( - "bytes" - "fmt" - "html/template" - "io/ioutil" - "path/filepath" - - "github.com/microcosm-cc/bluemonday" - "github.com/russross/blackfriday/v2" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" - "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" -) - -// NewMarkdownPrint returns a Print for -// converting a Markdown file to PDF. -func NewMarkdownPrint(logger xlog.Logger, fpath string, opts ChromePrintOptions) (Print, error) { - const op string = "print.NewMarkdownPrint" - resolver := func() (string, error) { - tmpl, err := template. - New(filepath.Base(fpath)). - Funcs(template.FuncMap{"toHTML": markdownToHTML}). - ParseFiles(fpath) - if err != nil { - return "", err - } - dirPath := filepath.Dir(fpath) - data := &templateData{DirPath: dirPath} - logger.DebugOp(op, "converting Markdown files to HTML...") - var buffer bytes.Buffer - if err := tmpl.Execute(&buffer, data); err != nil { - return "", err - } - baseFilename := xrand.Get() - dst := fmt.Sprintf("%s/%s.html", dirPath, baseFilename) - logger.DebugOp(op, "writing the HTML from previous conversion(s) into new file...") - if err := ioutil.WriteFile(dst, buffer.Bytes(), 0644); err != nil { - return "", err - } - return fmt.Sprintf("file://%s", dst), nil - } - URL, err := resolver() - if err != nil { - return chromePrint{}, xerror.New(op, err) - } - return chromePrint{ - logger: logger, - url: URL, - opts: opts, - }, nil -} - -type templateData struct { - DirPath string -} - -func markdownToHTML(dirPath, filename string) (template.HTML, error) { - const op string = "print.markdownToHTML" - fpath := fmt.Sprintf("%s/%s", dirPath, filename) - b, err := ioutil.ReadFile(fpath) - if err != nil { - return "", xerror.New(op, err) - } - unsafe := blackfriday.Run(b) - content := bluemonday.UGCPolicy().SanitizeBytes(unsafe) - /* #nosec */ - return template.HTML(content), nil -} diff --git a/internal/pkg/print/merge.go b/internal/pkg/print/merge.go deleted file mode 100644 index a961c4fd..00000000 --- a/internal/pkg/print/merge.go +++ /dev/null @@ -1,44 +0,0 @@ -package print - -import ( - "context" - - "github.com/thecodingmachine/gotenberg/internal/pkg/process" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -type mergePrint struct { - logger xlog.Logger - fpaths []string -} - -// NewMergePrint returns a Print for -// merging PDF files. -func NewMergePrint(logger xlog.Logger, fpaths []string) Print { - return mergePrint{ - logger: logger, - fpaths: fpaths, - } -} - -func (p mergePrint) Print(ctx context.Context, dest string, proc process.Process) error { - const op string = "print.mergePrint.Print" - p.logger.DebugfOp(op, "merging '%v'...", p.fpaths) - resolver := func() error { - var args []string - args = append(args, p.fpaths...) - args = append(args, "cat", "output", dest) - cmd, err := xexec.CommandContext(ctx, p.logger, "pdftk", args...) - if err != nil { - return err - } - xexec.LogBeforeExecute(p.logger, cmd) - return cmd.Run() - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} diff --git a/internal/pkg/print/office.go b/internal/pkg/print/office.go deleted file mode 100644 index 1ec02792..00000000 --- a/internal/pkg/print/office.go +++ /dev/null @@ -1,126 +0,0 @@ -package print - -import ( - "context" - "fmt" - "os" - "path/filepath" - - "github.com/thecodingmachine/gotenberg/internal/pkg/process" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" - "github.com/thecodingmachine/gotenberg/internal/pkg/xrand" -) - -type officePrint struct { - logger xlog.Logger - fpaths []string - opts OfficePrintOptions -} - -// OfficePrintOptions helps customizing the -// LibreOffice Print result. -type OfficePrintOptions struct { - Landscape bool -} - -// DefaultOfficePrinterOptions returns the default -// LibreOffice Print options. -func DefaultOfficePrinterOptions() OfficePrintOptions { - return OfficePrintOptions{ - Landscape: false, - } -} - -// NewOfficePrint returns a Print for -// converting Office documents to PDF. -func NewOfficePrint(logger xlog.Logger, fpaths []string, opts OfficePrintOptions) Print { - return officePrint{ - logger: logger, - fpaths: fpaths, - opts: opts, - } -} - -func (p officePrint) Print(ctx context.Context, dest string, proc process.Process) error { - const op string = "print.officePrint.Print" - resolver := func() error { - fpaths := make([]string, len(p.fpaths)) - dirPath := filepath.Dir(dest) - for i, fpath := range p.fpaths { - baseFilename := xrand.Get() - tmpDest := fmt.Sprintf("%s/%d%s.pdf", dirPath, i, baseFilename) - p.logger.DebugfOp(op, "converting '%s' to PDF...", fpath) - if err := unoconv( - ctx, - p.logger, - proc, - p.opts, - fpath, - tmpDest, - ); err != nil { - return err - } - p.logger.DebugfOp(op, "'%s.pdf' created", baseFilename) - fpaths[i] = tmpDest - } - if len(fpaths) == 1 { - p.logger.DebugOp(op, "only one PDF created, nothing to merge") - if err := os.Rename(fpaths[0], dest); err != nil { - return err - } - return nil - } - merger := NewMergePrint(p.logger, fpaths) - return merger.Print(ctx, dest, nil) - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func unoconv( - ctx context.Context, - logger xlog.Logger, - proc process.Process, - opts OfficePrintOptions, - fpath, dest string, -) error { - const op string = "print.unoconv" - resolver := func() error { - args := []string{ - "--server", - proc.Host(), - "--port", - fmt.Sprintf("%d", proc.Port()), - "--format", - "pdf", - } - if opts.Landscape { - args = append(args, "--printer", "PaperOrientation=landscape") - } - args = append(args, "--output", dest, fpath) - cmd, err := xexec.CommandContext( - ctx, - logger, - "unoconv", - args..., - ) - if err != nil { - return err - } - xexec.LogBeforeExecute(logger, cmd) - return cmd.Run() - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = Print(new(officePrint)) -) diff --git a/internal/pkg/print/print.go b/internal/pkg/print/print.go deleted file mode 100644 index 4b641c8e..00000000 --- a/internal/pkg/print/print.go +++ /dev/null @@ -1,13 +0,0 @@ -package print - -import ( - "context" - - "github.com/thecodingmachine/gotenberg/internal/pkg/process" -) - -// Print is a type that can create a PDF file from a source. -// The source is defined in the underlying implementation. -type Print interface { - Print(ctx context.Context, dest string, proc process.Process) error -} diff --git a/internal/pkg/print/url.go b/internal/pkg/print/url.go deleted file mode 100644 index 9031e21d..00000000 --- a/internal/pkg/print/url.go +++ /dev/null @@ -1,15 +0,0 @@ -package print - -import ( - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -// NewURLPrint returns a Print for -// converting a URL to PDF. -func NewURLPrint(logger xlog.Logger, url string, opts ChromePrintOptions) Print { - return chromePrint{ - logger: logger, - url: url, - opts: opts, - } -} diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index 34ebdcb4..eb7e111a 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -5,7 +5,9 @@ import ( "fmt" "os" "path/filepath" + "syscall" + "github.com/phayes/freeport" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" @@ -66,10 +68,7 @@ func (p officePrinter) Print(destination string) error { } if len(fpaths) == 1 { p.logger.DebugOp(op, "only one PDF created, nothing to merge") - if err := os.Rename(fpaths[0], destination); err != nil { - return err - } - return nil + return os.Rename(fpaths[0], destination) } m := mergePrinter{ logger: p.logger, @@ -87,13 +86,18 @@ func (p officePrinter) Print(destination string) error { return nil } -// nolint: gochecknoglobals -var lockUnoconv = make(chan struct{}, 1) - func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, opts OfficePrinterOptions) error { const op string = "printer.unoconv" resolver := func() error { + port, err := freeport.GetFreePort() + if err != nil { + return err + } args := []string{ + "--user-profile", + fmt.Sprintf("///tmp/%d", port), + "--port", + fmt.Sprintf("%d", port), "--format", "pdf", } @@ -101,35 +105,36 @@ func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, args = append(args, "--printer", "PaperOrientation=landscape") } args = append(args, "--output", destination, fpath) - cmd, err := xexec.CommandContext( - ctx, + cmd, err := xexec.Command( logger, "unoconv", args..., ) + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} if err != nil { return err } xexec.LogBeforeExecute(logger, cmd) - return cmd.Run() - } - logger.DebugOp(op, "waiting lock to be acquired...") - select { - case lockUnoconv <- struct{}{}: - // lock acquired. - logger.DebugOp(op, "lock acquired") - if err := resolver(); err != nil { - <-lockUnoconv // we release the lock. - return xerror.New(op, err) + if err := cmd.Start(); err != nil { + return err + } + result := make(chan error, 1) + go func() { + result <- cmd.Wait() + }() + select { + case err := <-result: + syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) + return err + case <-ctx.Done(): + syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) + return ctx.Err() } - <-lockUnoconv // we release the lock. - return nil - case <-ctx.Done(): - // failed to acquire lock before - // deadline. - logger.DebugOp(op, "failed to acquire lock before context.Context deadline") - return xerror.New(op, ctx.Err()) } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil } // Compile-time checks to ensure type implements desired interfaces. diff --git a/internal/pkg/process/chrome.go b/internal/pkg/process/chrome.go deleted file mode 100644 index c93dbe51..00000000 --- a/internal/pkg/process/chrome.go +++ /dev/null @@ -1,106 +0,0 @@ -package process - -import ( - "context" - "fmt" - "time" - - "github.com/mafredri/cdp/devtool" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -const ChromeKey Key = "chrome" - -type chromeProcess struct { - id string - host string - port int -} - -// NewChromeProcess returns a Google Chrome -// headless process. -func NewChromeProcess(id, host string, port int) Process { - return chromeProcess{ - id: id, - host: host, - port: port, - } -} - -func (p chromeProcess) ID() string { - return p.id -} - -func (p chromeProcess) Host() string { - return p.host -} - -func (p chromeProcess) Port() int { - return p.port -} - -func (p chromeProcess) binary() string { - return "google-chrome-stable" -} - -func (p chromeProcess) args() []string { - return []string{ - "--no-sandbox", - "--headless", - // see https://github.com/GoogleChrome/puppeteer/issues/2410. - "--font-render-hinting=medium", - fmt.Sprintf("--remote-debugging-port=%d", p.port), - "--disable-gpu", - "--disable-translate", - "--disable-extensions", - "--disable-background-networking", - "--safebrowsing-disable-auto-update", - "--disable-sync", - "--disable-default-apps", - "--hide-scrollbars", - "--metrics-recording-only", - "--mute-audio", - "--no-first-run", - } -} - -func (p chromeProcess) warmupTime() time.Duration { - return 10 * time.Second -} - -func (p chromeProcess) viabilityFunc() func(logger xlog.Logger) bool { - const op string = "process.chromeProcess.viabilityFunc" - return func(logger xlog.Logger) bool { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - endpoint := fmt.Sprintf("http://%s:%d" /*p.host*/, "localhost", p.port) - logger.DebugfOp( - op, - "checking '%s' viability via endpoint '%s/json/version'", - p.ID(), - endpoint, - ) - v, err := devtool.New(endpoint).Version(ctx) - if err != nil { - logger.ErrorfOp( - op, - "'%s' is not viable as endpoint returned '%v'", - p.ID(), - err, - ) - return false - } - logger.DebugfOp( - op, - "'%s' is viable as endpoint returned '%v'", - p.ID(), - v, - ) - return true - } -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = Process(new(chromeProcess)) -) diff --git a/internal/pkg/process/doc.go b/internal/pkg/process/doc.go deleted file mode 100644 index f2ef9d28..00000000 --- a/internal/pkg/process/doc.go +++ /dev/null @@ -1 +0,0 @@ -package process diff --git a/internal/pkg/process/pm2.go b/internal/pkg/process/pm2.go deleted file mode 100644 index 8be78c26..00000000 --- a/internal/pkg/process/pm2.go +++ /dev/null @@ -1,324 +0,0 @@ -package process - -import ( - "encoding/json" - "fmt" - "os/exec" - "sync" - "time" - - "github.com/thecodingmachine/gotenberg/internal/pkg/conf" - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "github.com/thecodingmachine/gotenberg/internal/pkg/xexec" - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" - "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" -) - -type jlistItem struct { - Name string `json:"name"` - PM2Env struct { - Status string `json:"status"` - RestartTime int64 `json:"restart_time"` - } `json:"pm2_env"` - Monit struct { - Memory int64 `json:"memory"` - CPU float64 `json:"cpu"` - } `json:"monit"` -} - -type jlist []jlistItem - -func (list jlist) toList() List { - var result List - for _, current := range list { - item := ListItem{ - Name: current.Name, - Status: current.PM2Env.Status, - Restart: current.PM2Env.RestartTime, - Memory: current.Monit.Memory, // TODO humanize? - CPU: current.Monit.CPU, - } - result = append(result, item) - } - return result -} - -func (list jlist) isOnline(p Process) bool { - const onlineStatus string = "online" - for _, item := range list { - if item.Name == p.ID() { - return item.PM2Env.Status == onlineStatus - } - } - return false -} - -func (list jlist) memory(p Process) (int64, error) { - const op string = "process.jlist.memory" - for _, item := range list { - if item.Name == p.ID() { - return item.Monit.Memory, nil - } - } - return 0, xerror.New( - op, - fmt.Errorf("'%s' does not exist in the list of PM2 processes", p.ID()), - ) -} - -type command string - -const ( - startCommand command = "start" - restartCommand command = "restart" - stopCommand command = "stop" - logsCommand command = "logs" - jlistCommand command = "jlist" -) - -const maximumRestartAttempts uint = 3 - -type pm2Manager struct { - logger xlog.Logger - config conf.Config - pool map[Key][]Process - list *jlist - listLock *sync.Mutex -} - -// NewPM2Manager returns a PM2 manager. -func NewPM2Manager(logger xlog.Logger, config conf.Config) Manager { - const op string = "process.NewPM2Manager" - m := &pm2Manager{ - logger: logger, - config: config, - pool: make(map[Key][]Process), - listLock: &sync.Mutex{}, - } - if !config.DisableGoogleChrome() { - processes := make([]Process, 2) - availablePort := 9222 - // TODO from config - for i := 0; i < 2; i++ { - proc := chromeProcess{ - host: "127.0.0.1", - port: availablePort, - } - proc.id = fmt.Sprintf("%s-%d", proc.binary(), proc.port) - processes[i] = proc - logger.DebugfOp(op, "added new process %v", proc) - availablePort++ - } - m.pool[ChromeKey] = processes - } - if !config.DisableUnoconv() { - processes := make([]Process, 2) - availablePort := 2002 - // TODO from config - for i := 0; i < 2; i++ { - proc := sofficeProcess{ - host: "127.0.0.1", - port: availablePort, - } - proc.id = fmt.Sprintf("%s-%d", proc.binary(), proc.port) - processes[i] = proc - logger.DebugfOp(op, "added new process %v", proc) - availablePort++ - } - m.pool[SofficeKey] = processes - } - // update the manager processes list - // only if there are processes. - if !config.DisableGoogleChrome() || !config.DisableUnoconv() { - go m.jlistTimer() - } - return m -} - -func (m *pm2Manager) jlistTimer() { - const op string = "process.pm2Manager.jlistTimer" - duration := xtime.Duration(10) - resolver := func() error { - m.listLock.Lock() - defer m.listLock.Unlock() - out, err := exec. - Command("pm2", string(jlistCommand)). - Output() - if err != nil { - return err - } - data := &jlist{} - if err := json.Unmarshal(out, data); err != nil { - return err - } - m.list = data - return nil - } - // update every x seconds the - // list from the manager. - for range time.Tick(duration) { - if err := resolver(); err != nil { - m.logger.ErrorOp(op, xerror.New(op, err)) - } - } -} - -func (m *pm2Manager) Start() error { - const op string = "process.pm2Manager.Start" - for _, processes := range m.pool { - for _, proc := range processes { - if err := m.start(proc); err != nil { - return xerror.New(op, err) - } - } - } - return nil -} - -func (m *pm2Manager) start(p Process) error { - const op string = "process.pm2Manager.start" - resolver := func() error { - // first, we try to start the process. - if err := m.run(startCommand, p); err != nil { - return err - } - // we wait the process to be ready. - m.warmup(p) - // if the process failed to start correctly, - // we have to restart it. - if !m.IsViable(p) && maximumRestartAttempts > 0 { - return m.Restart(p) - } - // the process is viable, let's log its - // output. - return m.logs(p) - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (m *pm2Manager) List() List { - m.listLock.Lock() - defer m.listLock.Unlock() - return m.list.toList() -} - -func (m *pm2Manager) All() []Process { - var result []Process - for _, processes := range m.pool { - result = append(result, processes...) - } - return result -} - -func (m *pm2Manager) Processes(key Key) []Process { - return m.pool[key] -} - -func (m *pm2Manager) Restart(p Process) error { - const op string = "process.pm2Manager.Restart" - resolver := func() error { - var attempts uint - for attempts < maximumRestartAttempts { - // we restart the process. - if err := m.run(restartCommand, p); err != nil { - return err - } - // we wait the process to be ready. - m.warmup(p) - attempts++ - // if the process is viable, we - // leave. - if m.IsViable(p) { - return m.logs(p) - } - } - return fmt.Errorf("failed to start '%s'", p.ID()) - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (m *pm2Manager) Stop(p Process) error { - const op string = "process.pm2Manager.Stop" - if err := m.run(stopCommand, p); err != nil { - return xerror.New(op, err) - } - return nil -} - -func (m *pm2Manager) IsViable(p Process) bool { - if !p.viabilityFunc()(m.logger) { - return false - } - m.listLock.Lock() - defer m.listLock.Unlock() - return m.list.isOnline(p) -} - -func (m *pm2Manager) Memory(p Process) (int64, error) { - const op string = "process.pm2Manager.Memory" - m.listLock.Lock() - defer m.listLock.Unlock() - memory, err := m.list.memory(p) - if err != nil { - return 0, xerror.New(op, err) - } - return memory, nil -} - -func (m *pm2Manager) warmup(p Process) { - const op string = "process.pm2Manager.warmup" - warmupTime := p.warmupTime() - m.logger.DebugfOp( - op, - "waiting '%v' for allowing '%s' to warmup", - warmupTime, - p.ID(), - ) - time.Sleep(warmupTime) -} - -func (m *pm2Manager) logs(p Process) error { - const op string = "process.pm2Manager.logs" - if m.config.LogLevel() == xlog.DebugLevel { - if err := m.run(logsCommand, p); err != nil { - return xerror.New(op, err) - } - } - return nil -} - -func (m *pm2Manager) run(pm2Cmd command, p Process) error { - const op string = "process.pm2Manager.run" - resolver := func() error { - args := []string{ - string(pm2Cmd), - p.binary(), - } - if pm2Cmd == startCommand { - args = append(args, fmt.Sprintf("--name=%s", p.ID())) - args = append(args, "--interpreter=none", "--") - args = append(args, p.args()...) - } - cmd, err := xexec.Command(m.logger, "pm2", args...) - if err != nil { - return err - } - xexec.LogBeforeExecute(m.logger, cmd) - return cmd.Start() - } - if err := resolver(); err != nil { - return xerror.New(op, err) - } - return nil -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = Manager(new(pm2Manager)) -) diff --git a/internal/pkg/process/process.go b/internal/pkg/process/process.go deleted file mode 100644 index 898d53bc..00000000 --- a/internal/pkg/process/process.go +++ /dev/null @@ -1,40 +0,0 @@ -package process - -import ( - "time" - - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -type Process interface { - ID() string - Host() string - Port() int - binary() string - args() []string - warmupTime() time.Duration - viabilityFunc() func(logger xlog.Logger) bool -} - -type ListItem struct { - Name string `json:"name"` - Status string `json:"status"` - Restart int64 `json:"restart"` - Memory int64 `json:"memory"` - CPU float64 `json:"cpu"` -} - -type List []ListItem - -type Key string - -type Manager interface { - Start() error - List() List - All() []Process - Processes(key Key) []Process - Restart(proc Process) error - Stop(proc Process) error - IsViable(proc Process) bool - Memory(proc Process) (int64, error) -} diff --git a/internal/pkg/process/soffice.go b/internal/pkg/process/soffice.go deleted file mode 100644 index 4f7a3be9..00000000 --- a/internal/pkg/process/soffice.go +++ /dev/null @@ -1,74 +0,0 @@ -package process - -import ( - "fmt" - "time" - - "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" -) - -const SofficeKey Key = "soffice" - -type sofficeProcess struct { - id string - host string - port int -} - -// NewSofficeProcess returns a LibreOffice -// headless process. -func NewSofficeProcess(id, host string, port int) Process { - return sofficeProcess{ - id: id, - host: host, - port: port, - } -} - -func (p sofficeProcess) ID() string { - return p.id -} - -func (p sofficeProcess) Host() string { - return p.host -} - -func (p sofficeProcess) Port() int { - return p.port -} - -func (p sofficeProcess) binary() string { - return "soffice" -} - -func (p sofficeProcess) args() []string { - return []string{ - // see https://ask.libreoffice.org/en/question/42975/how-can-i-run-multiple-instances-of-sofficebin-at-a-time/. - fmt.Sprintf("-env:UserInstallation=file:///tmp/%d", p.port), - "--headless", - "--invisible", - "--nocrashreport", - "--nodefault", - "--nofirststartwizard", - "--nologo", - "--norestore", - fmt.Sprintf("--accept=socket,host=%s,port=%d,tcpNoDelay=1;urp;StarOffice.ComponentContext", p.host, p.port), - } -} - -func (p sofficeProcess) warmupTime() time.Duration { - return 3 * time.Second -} - -func (p sofficeProcess) viabilityFunc() func(logger xlog.Logger) bool { - const op string = "process.sofficeProcess.viabilityFunc" - return func(logger xlog.Logger) bool { - // TODO find a way to check. - return true - } -} - -// Compile-time checks to ensure type implements desired interfaces. -var ( - _ = Process(new(sofficeProcess)) -) diff --git a/internal/pkg/xassert/xassert.go b/internal/pkg/xassert/xassert.go index 574008ff..8ad5a55a 100644 --- a/internal/pkg/xassert/xassert.go +++ b/internal/pkg/xassert/xassert.go @@ -5,6 +5,7 @@ import ( "os" "strconv" + "github.com/dustin/go-humanize" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" ) @@ -183,3 +184,51 @@ func BoolFromEnv(envVar string, defaultValue bool) (bool, error) { } return result, nil } + +/* +Bytes tries to convert a string to a int64. + +If string is empty or conversion fails, returns the +default value. + +The key is used to identify the value. +*/ +func Bytes(key, value string, defaultValue int64, rules ...RuleInt64) (int64, error) { + const op string = "xassert.Bytes" + result := defaultValue + if value != "" { + parsedValue, err := humanize.ParseBigBytes(value) + if err != nil { + return defaultValue, xerror.Invalid( + op, + fmt.Sprintf("'%s' is not a correct bytes representation, got '%s'", key, value), + err, + ) + } + result = parsedValue.Int64() + } + for _, rule := range rules { + rule.with(key, result) + if err := rule.validate(); err != nil { + return defaultValue, xerror.New(op, err) + } + } + return result, nil +} + +/* +BytesFromEnv returns the int64 representation of the +value of given environment variable. + +If not found, empty or conversion fails, returns the +default value. +*/ +func BytesFromEnv(envVar string, defaultValue int64, rules ...RuleInt64) (int64, error) { + const op string = "xassert.BytesFromEnv" + value := os.Getenv(envVar) + result, err := Bytes(envVar, value, defaultValue) + if err != nil { + return result, xerror.New(op, err) + } + return result, nil +} diff --git a/internal/pkg/xerrgroup/doc.go b/internal/pkg/xerrgroup/doc.go deleted file mode 100644 index 2134c8cb..00000000 --- a/internal/pkg/xerrgroup/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -/* -Package xerrgroup helps running -many functions simultaneously and wait until -execution has completed or an error is encountered. -*/ -package xerrgroup diff --git a/internal/pkg/xerrgroup/xerrgroup.go b/internal/pkg/xerrgroup/xerrgroup.go deleted file mode 100644 index fb4d0e24..00000000 --- a/internal/pkg/xerrgroup/xerrgroup.go +++ /dev/null @@ -1,20 +0,0 @@ -package xerrgroup - -import ( - "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" - "golang.org/x/sync/errgroup" -) - -// Run runs all functions simultaneously and wait until -// execution has completed or an error is encountered. -func Run(fn ...func() error) error { - const op string = "xerrgroup.Run" - eg := errgroup.Group{} - for _, f := range fn { - eg.Go(f) - } - if err := eg.Wait(); err != nil { - return xerror.New(op, err) - } - return nil -} diff --git a/test/cmd/pm2/pm2.go b/test/cmd/pm2/pm2.go deleted file mode 100644 index b2454d17..00000000 --- a/test/cmd/pm2/pm2.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ( - "github.com/thecodingmachine/gotenberg/internal/pkg/pm2" - "github.com/thecodingmachine/gotenberg/test" -) - -func main() { - logger := test.DebugLogger() - process := pm2.NewChromeProcess(logger) - if err := process.Start(); err != nil { - panic(err) - } - process = pm2.NewUnoconvProcess(logger) - if err := process.Start(); err != nil { - panic(err) - } -} From 1b4c435900e2f1c90bfb82f273685d89b6eb1080 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Sun, 29 Sep 2019 15:13:19 +0200 Subject: [PATCH 087/107] rolling back to an easier solution for executing unoconv as previous one did not remove zombies --- internal/pkg/printer/office.go | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index eb7e111a..0c78ab3b 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -5,7 +5,6 @@ import ( "fmt" "os" "path/filepath" - "syscall" "github.com/phayes/freeport" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" @@ -110,26 +109,11 @@ func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, "unoconv", args..., ) - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} if err != nil { return err } xexec.LogBeforeExecute(logger, cmd) - if err := cmd.Start(); err != nil { - return err - } - result := make(chan error, 1) - go func() { - result <- cmd.Wait() - }() - select { - case err := <-result: - syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) - return err - case <-ctx.Done(): - syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) - return ctx.Err() - } + return cmd.Run() } if err := resolver(); err != nil { return xerror.New(op, err) From f6729834b6fa2405bfd0933c2b2146d7a9a08501 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 14:51:49 +0200 Subject: [PATCH 088/107] removing comment --- cmd/gotenberg/main.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 8d27da5a..49eaa149 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -27,11 +27,12 @@ func main() { } systemLogger.InfofOp(op, "Gotenberg %s", version) systemLogger.DebugfOp(op, "configuration: %+v", config) - // start Google Chrome. - // TODO kill proc. - _, err = chrome.Start(context.Background(), systemLogger) - if err != nil { - systemLogger.FatalOp(op, err) + if !config.DisableGoogleChrome() { + // start Google Chrome. + _, err = chrome.Start(context.Background(), systemLogger) + if err != nil { + systemLogger.FatalOp(op, err) + } } // create our API. srv := xhttp.New(config) From 94743a16bea096cc68ec966b7fd44108aebac8c8 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 14:52:16 +0200 Subject: [PATCH 089/107] adding TODO comment --- build/base/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/build/base/Dockerfile b/build/base/Dockerfile index fe323674..37aebaff 100644 --- a/build/base/Dockerfile +++ b/build/base/Dockerfile @@ -110,4 +110,5 @@ RUN groupadd --gid 1001 gotenberg \ && mkdir /gotenberg \ && chown gotenberg: /gotenberg +# TODO remove. RUN apt-get install -y procps \ No newline at end of file From 862761d46f94b58eb8c848ea0b1b6c6221f0b95a Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 14:52:37 +0200 Subject: [PATCH 090/107] removing PM2 references in README --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 174208ba..68d014a3 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,6 @@ At TheCodingMachine, we build a lot of web applications (intranets, extranets an * HTML and Markdown conversions using Google Chrome headless * Office conversions (.txt, .rtf, .docx, .doc, .odt, .pptx, .ppt, .odp and so on) using [unoconv](https://github.com/dagwieers/unoconv) -* Performance :zap:: Google Chrome and LibreOffice started once in the background thanks to PM2 -* Failure prevention :broken_heart:: PM2 automatically restarts previous processes if they fail * Assets :package:: send your header, footer, images, fonts, stylesheets and so on for converting your HTML and Markdown to beaufitul PDFs! * Easily interact with the API using our [Go](https://github.com/thecodingmachine/gotenberg-go-client) and [PHP](https://github.com/thecodingmachine/gotenberg-php-client) libraries From 1abc4d0365b2f5f7b62b2aea1fcda00c4bb1f972 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 15:53:15 +0200 Subject: [PATCH 091/107] lint: disabling funlen --- build/lint/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/lint/Dockerfile b/build/lint/Dockerfile index 49349b5e..fd08c9c5 100644 --- a/build/lint/Dockerfile +++ b/build/lint/Dockerfile @@ -33,4 +33,4 @@ RUN go mod download &&\ # Copy our code source. COPY --chown=gotenberg:gotenberg . . -CMD ["golangci-lint", "run" ,"--tests=false", "--enable-all", "--disable=dupl" ] \ No newline at end of file +CMD ["golangci-lint", "run" ,"--tests=false", "--enable-all", "--disable=dupl", "--disable=funlen" ] \ No newline at end of file From fef16f6b284ee94a254a1220ab026126e252329d Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 15:53:48 +0200 Subject: [PATCH 092/107] removing useless whitespace --- internal/app/xhttp/middleware.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/app/xhttp/middleware.go b/internal/app/xhttp/middleware.go index 12aada23..5e5ca0b3 100644 --- a/internal/app/xhttp/middleware.go +++ b/internal/app/xhttp/middleware.go @@ -36,7 +36,6 @@ func contextMiddleware(config conf.Config) echo.MiddlewareFunc { err = doCleanup(ctx, err) err = doErr(ctx, err) return ctx.LogRequestResult(err, false) - } return next(ctx) } From a942224f46fd5f09584a47b0c0a85e0bddcf4132 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 15:54:17 +0200 Subject: [PATCH 093/107] adding back context to unoconv cmd --- internal/pkg/printer/office.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index 0c78ab3b..a395f24c 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -104,7 +104,8 @@ func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, args = append(args, "--printer", "PaperOrientation=landscape") } args = append(args, "--output", destination, fpath) - cmd, err := xexec.Command( + cmd, err := xexec.CommandContext( + ctx, logger, "unoconv", args..., From 20959fc68fba91d903d0abbd345816819724cf3d Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 15:55:01 +0200 Subject: [PATCH 094/107] updating Golang and Golang CI Lint versions --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index ac5afacd..493d5691 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ -GOLANG_VERSION=1.12 +GOLANG_VERSION=1.13 VERSION=snapshot DOCKER_USER= DOCKER_PASSWORD= DOCKER_REPOSITORY=thecodingmachine -GOLANGCI_LINT_VERSION=1.17.1 +GOLANGCI_LINT_VERSION=1.19.1 CODE_COVERAGE=0 MAXIMUM_WAIT_TIMEOUT=30.0 MAXIMUM_WAIT_DELAY=10.0 From 7e0f1794a564d5807c9d4117a118a2193a6c4cd0 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 16:24:39 +0200 Subject: [PATCH 095/107] updating dependencies --- go.mod | 9 +++++---- go.sum | 10 ++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 575bad5a..1c98a2c0 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.12 require ( github.com/dustin/go-humanize v1.0.0 github.com/google/go-cmp v0.3.1 // indirect - github.com/gorilla/websocket v1.4.0 // indirect + github.com/gorilla/websocket v1.4.1 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kr/pretty v0.1.0 // indirect github.com/labstack/echo/v4 v4.1.10 @@ -18,9 +18,10 @@ require ( github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/sirupsen/logrus v1.4.2 github.com/stretchr/testify v1.4.0 - golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 // indirect - golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 // indirect - golang.org/x/sync v0.0.0-20190423024810-112230192c58 + golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad // indirect + golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 // indirect + golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e + golang.org/x/sys v0.0.0-20190927073244-c990c680b611 // indirect golang.org/x/text v0.3.2 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect ) diff --git a/go.sum b/go.sum index 933fa201..d296e4e9 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,8 @@ github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= @@ -56,18 +58,26 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49N golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad h1:5E5raQxcv+6CZ11RrBYQe5WRbUIWpScjh0kvHZkZIrQ= +golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 h1:6KET3Sqa7fkVfD63QnAM81ZeYg5n4HwApOJkufONnHA= +golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190927073244-c990c680b611 h1:q9u40nxWT5zRClI/uU9dHCiYGottAg6Nzz4YUQyHxdA= +golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= From d45f2e1ec71f0d142622fce67a165de51df3206f Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 16:32:06 +0200 Subject: [PATCH 096/107] updating go modules to 1.13 --- go.mod | 2 +- go.sum | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 1c98a2c0..70503022 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/thecodingmachine/gotenberg -go 1.12 +go 1.13 require ( github.com/dustin/go-humanize v1.0.0 diff --git a/go.sum b/go.sum index d296e4e9..0f3dfd85 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,6 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= @@ -56,18 +54,12 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad h1:5E5raQxcv+6CZ11RrBYQe5WRbUIWpScjh0kvHZkZIrQ= golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 h1:6KET3Sqa7fkVfD63QnAM81ZeYg5n4HwApOJkufONnHA= golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= From 8f721cd12a7adc69ada3540a2f9a2c3d7973e4d5 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 16:38:52 +0200 Subject: [PATCH 097/107] fixing tests --- build/base/Dockerfile | 3 +-- build/tests/docker-entrypoint.sh | 6 ++---- internal/app/xhttp/handler_test.go | 13 ------------- internal/pkg/chrome/doc.go | 2 ++ test/cmd/chrome.go | 23 +++++++++++++++++++++++ 5 files changed, 28 insertions(+), 19 deletions(-) create mode 100644 test/cmd/chrome.go diff --git a/build/base/Dockerfile b/build/base/Dockerfile index 37aebaff..dcddb5fb 100644 --- a/build/base/Dockerfile +++ b/build/base/Dockerfile @@ -45,8 +45,7 @@ RUN mkdir -p /usr/share/man/man1mkdir -p /usr/share/man/man1 &&\ ENV UNO_URL=https://raw.githubusercontent.com/dagwieers/unoconv/master/unoconv -RUN apt-get install -y python3 &&\ - curl -Ls $UNO_URL -o /usr/bin/unoconv &&\ +RUN curl -Ls $UNO_URL -o /usr/bin/unoconv &&\ chmod +x /usr/bin/unoconv &&\ ln -s /usr/bin/python3 /usr/bin/python &&\ unoconv --version diff --git a/build/tests/docker-entrypoint.sh b/build/tests/docker-entrypoint.sh index 32294499..f51b3776 100755 --- a/build/tests/docker-entrypoint.sh +++ b/build/tests/docker-entrypoint.sh @@ -9,10 +9,8 @@ if [ "$CURRENT_USER" != "gotenberg" ]; then exit 1 fi -# Start the PM2 processes -# (Google Chrome headless & unoconv listener). -# TODO just start chrome -go run github.com/thecodingmachine/gotenberg/test/cmd/pm2 +# Start Google Chrome headless. +go run test/cmd/chrome.go # Run our tests. if [ "$CODE_COVERAGE" = "1" ]; then diff --git a/internal/app/xhttp/handler_test.go b/internal/app/xhttp/handler_test.go index c4c78add..11c0731d 100644 --- a/internal/app/xhttp/handler_test.go +++ b/internal/app/xhttp/handler_test.go @@ -6,7 +6,6 @@ import ( "io/ioutil" "net/http" "net/http/httptest" - "os" "testing" "github.com/labstack/echo/v4" @@ -23,18 +22,6 @@ func TestPingHandler(t *testing.T) { srv = New(config) req := httptest.NewRequest(http.MethodGet, pingEndpoint, nil) test.AssertStatusCode(t, http.StatusOK, srv, req) - // should returns a JSON as - // LOG_LEVEL is "DEBUG". - os.Setenv(conf.LogLevelEnvVar, "DEBUG") - config, err := conf.FromEnv() - assert.Nil(t, err) - srv = New(config) - req = httptest.NewRequest(http.MethodGet, pingEndpoint, nil) - rec := httptest.NewRecorder() - srv.ServeHTTP(rec, req) - assert.Equal(t, "application/json; charset=UTF-8", rec.Header().Get("Content-type")) - assert.Equal(t, http.StatusOK, rec.Code) - os.Unsetenv(conf.LogLevelEnvVar) } func TestMergeHandler(t *testing.T) { diff --git a/internal/pkg/chrome/doc.go b/internal/pkg/chrome/doc.go index 7b442802..c5431149 100644 --- a/internal/pkg/chrome/doc.go +++ b/internal/pkg/chrome/doc.go @@ -1 +1,3 @@ +// Package chrome helps starting +// Google Chrome headless in background. package chrome diff --git a/test/cmd/chrome.go b/test/cmd/chrome.go new file mode 100644 index 00000000..82b38fcc --- /dev/null +++ b/test/cmd/chrome.go @@ -0,0 +1,23 @@ +package main + +import ( + "context" + + "github.com/thecodingmachine/gotenberg/internal/pkg/chrome" + "github.com/thecodingmachine/gotenberg/internal/pkg/conf" + "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" +) + +func main() { + const op string = "main" + config, err := conf.FromEnv() + systemLogger := xlog.New(config.LogLevel(), "system") + if err != nil { + systemLogger.FatalOp(op, err) + } + // start Google Chrome. + _, err = chrome.Start(context.Background(), systemLogger) + if err != nil { + systemLogger.FatalOp(op, err) + } +} From 9968a816db7f78784634a17ccf8f55bdb9882143 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 17:16:40 +0200 Subject: [PATCH 098/107] improving document --- build/docs/content/00-introduction.md | 4 +- build/docs/content/01-install.md | 3 +- build/docs/content/02-clients.md | 2 +- build/docs/content/04-html.md | 7 -- build/docs/content/07-office.md | 7 -- build/docs/content/08-merge.md | 2 +- build/docs/content/09-timeout.md | 2 +- build/docs/content/10-webhook.md | 2 +- build/docs/content/11-result-filename.md | 2 +- build/docs/content/12-scalability.md | 27 ++++++- build/docs/content/13-ping.md | 34 +-------- build/docs/content/14-fonts.md | 2 +- build/docs/content/15-links.md | 2 +- docs/index.html | 93 ++++++++++-------------- 14 files changed, 78 insertions(+), 111 deletions(-) diff --git a/build/docs/content/00-introduction.md b/build/docs/content/00-introduction.md index 1c6728e1..21b6a0a4 100644 --- a/build/docs/content/00-introduction.md +++ b/build/docs/content/00-introduction.md @@ -6,7 +6,5 @@ title: Introduction * HTML and Markdown conversions using Google Chrome headless * Office conversions (.txt, .rtf, .docx, .doc, .odt, .pptx, .ppt, .odp and so on) using [unoconv](https://github.com/dagwieers/unoconv) -* Performance: Google Chrome and LibreOffice started once in the background thanks to PM2 -* Failure prevention: PM2 automatically restarts previous processes if they fail * Assets: send your header, footer, images, fonts, stylesheets and so on for converting your HTML and Markdown to beaufitul PDFs! -* Easily interact with the API using our [Go](https://github.com/thecodingmachine/gotenberg-go-client) and [PHP](https://github.com/thecodingmachine/gotenberg-php-client) libraries \ No newline at end of file +* Easily interact with the API using our [Go](https://github.com/thecodingmachine/gotenberg-go-client) and [PHP](https://github.com/thecodingmachine/gotenberg-php-client) libraries diff --git a/build/docs/content/01-install.md b/build/docs/content/01-install.md index 9e344f20..6054cf75 100644 --- a/build/docs/content/01-install.md +++ b/build/docs/content/01-install.md @@ -36,7 +36,6 @@ services: It may also be deployed with Kubernetes. Make sure to provide enough memory and CPU requests (for instance `512Mi` and `0.2` CPU). -Otherwise the API will not be able to launch Google Chrome and LibreOffice (unoconv). > The more resources are granted, the quicker will be the conversions. @@ -49,4 +48,4 @@ securityContext: ``` In the following examples, we will assume your -Gotenberg API is available at [http://localhost:3000](http://localhost:3000). \ No newline at end of file +Gotenberg API is available at [http://localhost:3000](http://localhost:3000). diff --git a/build/docs/content/02-clients.md b/build/docs/content/02-clients.md index 59ecd1e6..64de1e23 100644 --- a/build/docs/content/02-clients.md +++ b/build/docs/content/02-clients.md @@ -22,4 +22,4 @@ Then the PHP client: ```bash $ composer require thecodingmachine/gotenberg-php-client -``` \ No newline at end of file +``` diff --git a/build/docs/content/04-html.md b/build/docs/content/04-html.md index 05cd7f5b..8f1e5070 100644 --- a/build/docs/content/04-html.md +++ b/build/docs/content/04-html.md @@ -6,13 +6,6 @@ Gotenberg provides the endpoint `/convert/html` for HTML conversions. It accepts `POST` requests with a `multipart/form-data` Content-Type. -> **Attention:** currently, Google Chrome misbehaves if there are too many concurrent conversions. -> That's why for HTML, [URL](#url) and [Markdown](#markdown) conversions, the API does only 6 conversions at a time. -> The more concurrent requests, the more `504` HTTP codes the API will return. -> -> See the [scalability section](#scalability) to find how to mitigate this issue. -> You may also take a look at the [timeout section](#timeout). - ## Basic The only requirement is to send a file named `index.html`: it is the file diff --git a/build/docs/content/07-office.md b/build/docs/content/07-office.md index aff49807..39e91e37 100644 --- a/build/docs/content/07-office.md +++ b/build/docs/content/07-office.md @@ -6,13 +6,6 @@ Gotenberg provides the endpoint `/convert/office` for Office document conversion It accepts `POST` requests with a `multipart/form-data` Content-Type. -> **Attention:** currently, `unoconv` cannot perform concurrent conversions. -> That's why for Office conversions, the API does only one conversion at a time. -> The more concurrent requests, the more `504` HTTP codes the API will return. -> -> See the [scalability section](#scalability) to find how to mitigate this issue. -> You may also take a look at the [timeout section](#timeout). - ## Basic You may send one or more Office documents. Following file extensions are accepted: diff --git a/build/docs/content/08-merge.md b/build/docs/content/08-merge.md index 59a3e4d8..49ac0b2b 100644 --- a/build/docs/content/08-merge.md +++ b/build/docs/content/08-merge.md @@ -52,4 +52,4 @@ $files = [ $request = new MergeRequest($files); $dest = "result.pdf"; $client->store($request, $dest); -``` \ No newline at end of file +``` diff --git a/build/docs/content/09-timeout.md b/build/docs/content/09-timeout.md index 3835b99c..9392b84f 100644 --- a/build/docs/content/09-timeout.md +++ b/build/docs/content/09-timeout.md @@ -50,4 +50,4 @@ $request = new HTMLRequest($index); $request->setWaitTimeout(2.5); $dest = "result.pdf"; $client->store($request, $dest); -``` \ No newline at end of file +``` diff --git a/build/docs/content/10-webhook.md b/build/docs/content/10-webhook.md index b94743ba..fff2456d 100644 --- a/build/docs/content/10-webhook.md +++ b/build/docs/content/10-webhook.md @@ -98,4 +98,4 @@ $request = new HTMLRequest($index); $request->setWebhookURL('http://myapp.com/webhook/'); $request->setWebhookURLTimeout(2.5); $resp = $client->post($request); -``` \ No newline at end of file +``` diff --git a/build/docs/content/11-result-filename.md b/build/docs/content/11-result-filename.md index 634962e7..aabb4177 100644 --- a/build/docs/content/11-result-filename.md +++ b/build/docs/content/11-result-filename.md @@ -47,4 +47,4 @@ $index = DocumentFactory::makeFromPath('index.html', 'index.html'); $request = new HTMLRequest($index); $request->setResultFilename('foo.pdf'); $resp = $client->post($request); -``` \ No newline at end of file +``` diff --git a/build/docs/content/12-scalability.md b/build/docs/content/12-scalability.md index a58c329c..18aa9c18 100644 --- a/build/docs/content/12-scalability.md +++ b/build/docs/content/12-scalability.md @@ -2,6 +2,31 @@ title: Scalability --- +Google Chrome and unoconv (LibreOffice) are intricate programs. + +Gotenberg tries to abstract as much complexity as possible but it can +only do it to a certain extend. + +For instance, Google Chrome misbehaves if there are too many concurrent conversions. +That's why for [HTML](#html), [URL](#url) and [Markdown](#markdown) conversions, the API does only 6 conversions in parallel. +The more concurrent requests, the more `504` HTTP codes the API will return. + +On another hand, for [Office](#office) conversions, the API will start as many unoconv (LibreOffice) instances as there are +requests. The limitation here is the available memory. + +## Strategies + +### Increase timeout + +This strategy is mostly for [HTML](#html), [URL](#url) and [Markdown](#markdown) conversions. + +You may increase the conversion timeout. In other word, you accept that a conversion takes more time +if there are more than 6 conversions in parallel. + +> See [timeout section](#timeout). + +### Scaling + The API being stateless, you may scale it as much as you want. For instance, using the following Docker Compose file: @@ -24,4 +49,4 @@ $ docker-compose up --scale gotenberg=your_number_of_instances ``` When requesting the Gotenberg service with your client(s), Docker will automatically -redirect a request to a Gotenberg container according to the round-robin strategy. \ No newline at end of file +redirect a request to a Gotenberg container according to the round-robin strategy. diff --git a/build/docs/content/13-ping.md b/build/docs/content/13-ping.md index 3da6ea70..3d661698 100644 --- a/build/docs/content/13-ping.md +++ b/build/docs/content/13-ping.md @@ -5,34 +5,8 @@ title: Ping Gotenberg provides the endpoint `/ping` for checking the API availability with a simple `GET` request. -If `LOG_LEVEL` is `"DEBUG"`, it also returns details about the PM2 processes in JSON format. -For instance: +Currently this endpoint does nothing special. A better way to monitor +Gotenberg would be by checking the memory usage. -```json -[ - { - "name": "google-chrome-stable", - "pm2_env": { - "status": "online", - "restart_time": 0 - }, - "monit": { - "memory": 72294400, - "cpu": 0 - } - }, - { - "name": "unoconv", - "pm2_env": { - "status": "online", - "restart_time": 0 - }, - "monit": { - "memory": 71000064, - "cpu": 0 - } - } -] -``` - -> if `LOG_LEVEL` is **not** `"DEBUG"`, no log entries are written. \ No newline at end of file +Also, as Google Chrome and unoconv (LibreOffice) are intricate programs, you should +restart your Gotenberg instances from time to time to ensure a nominal behaviour. diff --git a/build/docs/content/14-fonts.md b/build/docs/content/14-fonts.md index 752eedf9..18d7c3ec 100644 --- a/build/docs/content/14-fonts.md +++ b/build/docs/content/14-fonts.md @@ -10,4 +10,4 @@ If you wish to use more fonts, you will have to create your own image: FROM thecodingmachine/gotenberg:6 RUN apt-get -y install yourfonts -``` \ No newline at end of file +``` diff --git a/build/docs/content/15-links.md b/build/docs/content/15-links.md index 4f2dbf3f..4c778b6f 100644 --- a/build/docs/content/15-links.md +++ b/build/docs/content/15-links.md @@ -5,4 +5,4 @@ title: Links * Follow the progress on the [GitHub repository](https://github.com/thecodingmachine/gotenberg) * Follow [@gulnap](https://twitter.com/gulnap) on Twitter -Psst: TheCodingMachine is always looking for [talented coders](https://coders.thecodingmachine.com). \ No newline at end of file +Psst: TheCodingMachine is always looking for [talented coders](https://coders.thecodingmachine.com). diff --git a/docs/index.html b/docs/index.html index 7036fb32..261ec674 100755 --- a/docs/index.html +++ b/docs/index.html @@ -120,8 +120,6 @@
    • HTML and Markdown conversions using Google Chrome headless
    • Office conversions (.txt, .rtf, .docx, .doc, .odt, .pptx, .ppt, .odp and so on) using unoconv
    • -
    • Performance: Google Chrome and LibreOffice (unoconv) started once in the background thanks to PM2
    • -
    • Failure prevention: PM2 automatically restarts previous processes if they fail
    • Assets: send your header, footer, images, fonts, stylesheets and so on for converting your HTML and Markdown to beaufitul PDFs!
    • Easily interact with the API using our Go and PHP libraries
    @@ -173,8 +171,7 @@

    It may also be deployed with Kubernetes.

    -

    Make sure to provide enough memory and CPU requests (for instance 512Mi and 0.2 CPU). -Otherwise the API will not be able to launch Google Chrome and LibreOffice (unoconv).

    +

    Make sure to provide enough memory and CPU requests (for instance 512Mi and 0.2 CPU).

    The more resources are granted, the quicker will be the conversions.

    @@ -356,15 +353,6 @@ See the webhook timeout section.

    It accepts POST requests with a multipart/form-data Content-Type.

    -
    -

    Attention: currently, Google Chrome misbehaves if there are too many concurrent conversions. -That’s why for HTML, URL and Markdown conversions, the API does only 6 conversions at a time. -The more concurrent requests, the more 504 HTTP codes the API will return.

    - -

    See the scalability section to find how to mitigate this issue. -You may also take a look at the timeout section.

    -
    -

    Basic

    @@ -885,15 +873,6 @@ $client->store($request, $dest);

    It accepts POST requests with a multipart/form-data Content-Type.

    -
    -

    Attention: currently, unoconv cannot perform concurrent conversions. -That’s why for Office conversions, the API does only one conversion at a time. -The more concurrent requests, the more 504 HTTP codes the API will return.

    - -

    See the scalability section to find how to mitigate this issue. -You may also take a look at the timeout section.

    -
    -

    Basic

    @@ -1330,7 +1309,40 @@ $resp = $client->post($request);

    Scalability

    -

    The API being stateless, you may scale it as much as you want.

    +

    Google Chrome and unoconv (LibreOffice) are intricate programs.

    + +

    Gotenberg tries to abstract as much complexity as possible but it can +only do it to a certain extend.

    + +

    For instance, Google Chrome misbehaves if there are too many concurrent conversions. +That’s why for HTML, URL and Markdown conversions, the API does only 6 conversions in parallel. +The more concurrent requests, the more 504 HTTP codes the API will return.

    + +

    On another hand, for Office conversions, the API will start as many unoconv (LibreOffice) instances as there are +requests. The limitation here is the available memory.

    + +

    Strategies

    + +

    Increase timeout

    + +

    This strategy is mostly for HTML, URL and Markdown conversions.

    + +

    You may increase the conversion timeout. In other word, you accept that a conversion takes more time +if there are more than 6 conversions in parallel.

    + +
    +

    See timeout section.

    +
    + +

    Scaling

    + +

    The API being stateless, you may scale it as much as you want.

    For instance, using the following Docker Compose file:

    @@ -1361,38 +1373,11 @@ redirect a request to a Gotenberg container according to the round-robin strateg

    Gotenberg provides the endpoint /ping for checking the API availability with a simple GET request.

    -

    If LOG_LEVEL is "DEBUG", it also returns details about the PM2 processes in JSON format. -For instance:

    +

    Currently this endpoint does nothing special. A better way to monitor +Gotenberg would be by checking the memory usage.

    -
    [
    -    {
    -        "name": "google-chrome-stable",
    -        "pm2_env": {
    -            "status": "online",
    -            "restart_time": 0
    -        },
    -        "monit": {
    -            "memory": 72294400,
    -            "cpu": 0
    -        }
    -    },
    -    {
    -        "name": "unoconv",
    -        "pm2_env": {
    -            "status": "online",
    -            "restart_time": 0
    -        },
    -        "monit": {
    -            "memory": 71000064,
    -            "cpu": 0
    -        }
    -    }
    -]
    -
    - -
    -

    if LOG_LEVEL is not "DEBUG", no log entries are written.

    -
    +

    Also, as Google Chrome and unoconv (LibreOffice) are intricate programs, you should +restart your Gotenberg instances from time to time to ensure a nominal behaviour.

    From 3d379dec58c2909a3a39876d3b9fc3d1693e556b Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 17:19:14 +0200 Subject: [PATCH 099/107] adding reference to the load testing use case in the documentation --- build/docs/content/12-scalability.md | 2 ++ docs/index.html | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/build/docs/content/12-scalability.md b/build/docs/content/12-scalability.md index 18aa9c18..2e3177dc 100644 --- a/build/docs/content/12-scalability.md +++ b/build/docs/content/12-scalability.md @@ -14,6 +14,8 @@ The more concurrent requests, the more `504` HTTP codes the API will return. On another hand, for [Office](#office) conversions, the API will start as many unoconv (LibreOffice) instances as there are requests. The limitation here is the available memory. +> See our [load testing use case](../loadtesting) for more details about the API behaviour under heavy load. + ## Strategies ### Increase timeout diff --git a/docs/index.html b/docs/index.html index 261ec674..98c168d3 100755 --- a/docs/index.html +++ b/docs/index.html @@ -1321,6 +1321,10 @@ The more concurrent requests, the more 504 HTTP codes the API will

    On another hand, for Office conversions, the API will start as many unoconv (LibreOffice) instances as there are requests. The limitation here is the available memory.

    +
    +

    See our load testing use case for more details about the API behaviour under heavy load.

    +
    +

    Strategies

    From 7f61c634257ecb854dcfe3a3e3459c0bdb378f8c Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 17:27:52 +0200 Subject: [PATCH 100/107] adding information about how to use images in header/footer. Thanks @LoicHa --- build/docs/content/04-html.md | 6 ++++++ docs/index.html | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/build/docs/content/04-html.md b/build/docs/content/04-html.md index 8f1e5070..858f4d74 100644 --- a/build/docs/content/04-html.md +++ b/build/docs/content/04-html.md @@ -98,6 +98,12 @@ The following classes allow you to inject printing values: > **Attention:** the CSS properties are independant of the ones used in the `index.html` file. > Also, `footer.html` CSS properties override the ones from `header.html`. +For images, the only solution currently is to use a `base64` encoded source: + +```html +Red dot +``` + ### cURL ```bash diff --git a/docs/index.html b/docs/index.html index 98c168d3..09b8ad2e 100755 --- a/docs/index.html +++ b/docs/index.html @@ -454,6 +454,11 @@ Respectively, a file named header.html and footer.html Also, footer.html CSS properties override the ones from header.html.

    +

    For images, the only solution currently is to use a base64 encoded source:

    + +
    <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUA AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO 9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
    +
    +

    cURL

    From cbc9d9ab8cbd73b75b93c5e9f01c777255848a63 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Sep 2019 20:17:39 +0200 Subject: [PATCH 101/107] using tini to reap zombie processes --- Makefile | 3 ++- build/package/Dockerfile | 21 +++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 493d5691..e206c329 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ DOCKER_PASSWORD= DOCKER_REPOSITORY=thecodingmachine GOLANGCI_LINT_VERSION=1.19.1 CODE_COVERAGE=0 +TINI_VERSION=v0.18.0 MAXIMUM_WAIT_TIMEOUT=30.0 MAXIMUM_WAIT_DELAY=10.0 MAXIMUM_WEBHOOK_URL_TIMEOUT=30.0 @@ -48,7 +49,7 @@ doc: # build Gotenberg Docker image. image: make workspace - docker build --build-arg VERSION=$(VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) -f build/package/Dockerfile . + docker build --build-arg VERSION=$(VERSION) --build-arg TINI_VERSION=$(TINI_VERSION) -t $(DOCKER_REPOSITORY)/gotenberg:$(VERSION) -f build/package/Dockerfile . # start the API using previously built Docker image. gotenberg: diff --git a/build/package/Dockerfile b/build/package/Dockerfile index a33cccb2..723bcf1b 100644 --- a/build/package/Dockerfile +++ b/build/package/Dockerfile @@ -29,6 +29,23 @@ COPY cmd ./cmd # Build our binary. RUN go build -o gotenberg -ldflags "-X main.version=${VERSION}" cmd/gotenberg/main.go +FROM thecodingmachine/gotenberg:base + +LABEL authors="Julien Neuhart " + +# |-------------------------------------------------------------------------- +# | Tini +# |-------------------------------------------------------------------------- +# | +# | An helper for reaping zombie processes. +# | + +ARG TINI_VERSION + +ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini +RUN chmod +x /tini +ENTRYPOINT ["/tini", "--"] + # |-------------------------------------------------------------------------- # | Final touch # |-------------------------------------------------------------------------- @@ -36,10 +53,6 @@ RUN go build -o gotenberg -ldflags "-X main.version=${VERSION}" cmd/gotenberg/ma # | Last instructions of this build. # | -FROM thecodingmachine/gotenberg:base - -LABEL authors="Julien Neuhart " - COPY --from=workspace /gotenberg/package/gotenberg /usr/local/bin/ USER gotenberg From 04b1fa378d4d2715f6eb1004689eae98058161e0 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 1 Oct 2019 09:33:31 +0200 Subject: [PATCH 102/107] fixing typo in documentation --- build/docs/content/12-scalability.md | 2 +- docs/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/docs/content/12-scalability.md b/build/docs/content/12-scalability.md index 2e3177dc..4424670b 100644 --- a/build/docs/content/12-scalability.md +++ b/build/docs/content/12-scalability.md @@ -22,7 +22,7 @@ requests. The limitation here is the available memory. This strategy is mostly for [HTML](#html), [URL](#url) and [Markdown](#markdown) conversions. -You may increase the conversion timeout. In other word, you accept that a conversion takes more time +You may increase the conversion timeout. In other words, you accept that a conversion takes more time if there are more than 6 conversions in parallel. > See [timeout section](#timeout). diff --git a/docs/index.html b/docs/index.html index 09b8ad2e..0595a6e9 100755 --- a/docs/index.html +++ b/docs/index.html @@ -1340,7 +1340,7 @@ requests. The limitation here is the available memory.

    This strategy is mostly for HTML, URL and Markdown conversions.

    -

    You may increase the conversion timeout. In other word, you accept that a conversion takes more time +

    You may increase the conversion timeout. In other words, you accept that a conversion takes more time if there are more than 6 conversions in parallel.

    From a3f05c1146f31177e335d1fbda5d5eccf3a9e65d Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 1 Oct 2019 17:32:15 +0200 Subject: [PATCH 103/107] minor refactoring of building process --- Makefile | 2 +- build/base/Dockerfile | 7 ++----- build/package/Dockerfile | 4 ++-- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index e206c329..5fb6d156 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ DOCKER_PASSWORD= DOCKER_REPOSITORY=thecodingmachine GOLANGCI_LINT_VERSION=1.19.1 CODE_COVERAGE=0 -TINI_VERSION=v0.18.0 +TINI_VERSION=0.18.0 MAXIMUM_WAIT_TIMEOUT=30.0 MAXIMUM_WAIT_DELAY=10.0 MAXIMUM_WEBHOOK_URL_TIMEOUT=30.0 diff --git a/build/base/Dockerfile b/build/base/Dockerfile index dcddb5fb..c40df230 100644 --- a/build/base/Dockerfile +++ b/build/base/Dockerfile @@ -9,7 +9,7 @@ FROM debian:buster-slim RUN echo "deb http://httpredir.debian.org/debian/ buster main contrib non-free" > /etc/apt/sources.list &&\ apt-get update &&\ - apt-get install -y curl wget gnupg ttf-mscorefonts-installer + apt-get install -y curl wget gnupg ttf-mscorefonts-installer procps # |-------------------------------------------------------------------------- # | Chrome @@ -107,7 +107,4 @@ COPY build/base/fonts.conf /etc/fonts/conf.d/100-gotenberg.conf RUN groupadd --gid 1001 gotenberg \ && useradd --uid 1001 --gid gotenberg --shell /bin/bash --home /gotenberg --no-create-home gotenberg \ && mkdir /gotenberg \ - && chown gotenberg: /gotenberg - -# TODO remove. -RUN apt-get install -y procps \ No newline at end of file + && chown gotenberg: /gotenberg \ No newline at end of file diff --git a/build/package/Dockerfile b/build/package/Dockerfile index 723bcf1b..dc36ad1f 100644 --- a/build/package/Dockerfile +++ b/build/package/Dockerfile @@ -42,9 +42,9 @@ LABEL authors="Julien Neuhart " ARG TINI_VERSION -ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini +ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini /tini RUN chmod +x /tini -ENTRYPOINT ["/tini", "--"] +ENTRYPOINT [ "/tini", "--" ] # |-------------------------------------------------------------------------- # | Final touch From c47dc5ecdbbd5f85703b8d5b9ae85a1af65eb124 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 1 Oct 2019 17:33:00 +0200 Subject: [PATCH 104/107] office: no more orphan processes (hopefully) --- internal/pkg/printer/office.go | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index a395f24c..92ebd7d5 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -5,6 +5,8 @@ import ( "fmt" "os" "path/filepath" + "strings" + "syscall" "github.com/phayes/freeport" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" @@ -104,8 +106,7 @@ func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, args = append(args, "--printer", "PaperOrientation=landscape") } args = append(args, "--output", destination, fpath) - cmd, err := xexec.CommandContext( - ctx, + cmd, err := xexec.Command( logger, "unoconv", args..., @@ -114,7 +115,34 @@ func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, return err } xexec.LogBeforeExecute(logger, cmd) - return cmd.Run() + // see https://medium.com/@felixge/killing-a-child-process-and-all-of-its-children-in-go-54079af94773. + kill := func() { + err := syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) + if err == nil { + return + } + if !strings.Contains(err.Error(), "no such process") { + logger.ErrorOp(op, err) + } + } + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + if err := cmd.Start(); err != nil { + return err + } + result := make(chan error, 1) + go func() { + result <- cmd.Wait() + }() + select { + case err := <-result: + logger.DebugfOp(op, "command '%s' finished", strings.Join(cmd.Args, " ")) + kill() + return err + case <-ctx.Done(): + logger.DebugfOp(op, "command '%s' failed to finish before context.Context deadline", strings.Join(cmd.Args, " ")) + kill() + return ctx.Err() + } } if err := resolver(); err != nil { return xerror.New(op, err) From 7ac104c3c667d14d8b0fd5b2a0f15f77179c075a Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Wed, 2 Oct 2019 10:38:47 +0200 Subject: [PATCH 105/107] refactoring process management: no more orphan processes and quicker chrome startup --- cmd/gotenberg/main.go | 6 +- internal/pkg/chrome/chrome.go | 189 ++++++++++++++++++------------- internal/pkg/printer/merge.go | 7 +- internal/pkg/printer/office.go | 40 +------ internal/pkg/xexec/doc.go | 3 +- internal/pkg/xexec/xexec.go | 58 +++++++++- internal/pkg/xexec/xexec_test.go | 14 +++ test/cmd/chrome.go | 7 +- 8 files changed, 187 insertions(+), 137 deletions(-) diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 49eaa149..78df8917 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -1,7 +1,6 @@ package main import ( - "context" "fmt" "net/http" "os" @@ -28,9 +27,8 @@ func main() { systemLogger.InfofOp(op, "Gotenberg %s", version) systemLogger.DebugfOp(op, "configuration: %+v", config) if !config.DisableGoogleChrome() { - // start Google Chrome. - _, err = chrome.Start(context.Background(), systemLogger) - if err != nil { + // start Google Chrome headless. + if err := chrome.Start(systemLogger); err != nil { systemLogger.FatalOp(op, err) } } diff --git a/internal/pkg/chrome/chrome.go b/internal/pkg/chrome/chrome.go index 1be662ac..9a206c85 100644 --- a/internal/pkg/chrome/chrome.go +++ b/internal/pkg/chrome/chrome.go @@ -4,6 +4,8 @@ import ( "context" "os" "os/exec" + "strings" + "syscall" "time" "github.com/mafredri/cdp/devtool" @@ -13,66 +15,26 @@ import ( "github.com/thecodingmachine/gotenberg/internal/pkg/xtime" ) -func Start(ctx context.Context, logger xlog.Logger) (*os.Process, error) { +// Start starts Google Chrome headless in background. +func Start(logger xlog.Logger) error { const op string = "chrome.Start" - logger.DebugOp(op, "starting new Google Chrome process on port 9222...") - resolver := func() (*os.Process, error) { - binary := "google-chrome-stable" - args := []string{ - "--no-sandbox", - "--headless", - // see https://github.com/GoogleChrome/puppeteer/issues/2410. - "--font-render-hinting=medium", - "--remote-debugging-port=9222", - "--disable-gpu", - "--disable-translate", - "--disable-extensions", - "--disable-background-networking", - "--safebrowsing-disable-auto-update", - "--disable-sync", - "--disable-default-apps", - "--hide-scrollbars", - "--metrics-recording-only", - "--mute-audio", - "--no-first-run", - } - cmd, err := xexec.CommandContext(ctx, logger, binary, args...) + logger.DebugOp(op, "starting new Google Chrome headless process on port 9222...") + resolver := func() error { + cmd, err := cmd(logger) if err != nil { - return nil, err + return err } // we try to start the process. xexec.LogBeforeExecute(logger, cmd) if err := cmd.Start(); err != nil { - return cmd.Process, err + return err } - // we wait the process to be ready. - warmup(logger) // if the process failed to start correctly, // we have to restart it. if !isViable(logger) { - return restart(ctx, logger, cmd) + return restart(logger, cmd.Process) } - return cmd.Process, nil - } - proc, err := resolver() - if err != nil { - if errKill := Kill(logger, proc); errKill != nil { - logger.ErrorOp(op, errKill) - } - return nil, xerror.New(op, err) - } - return proc, nil -} - -func Kill(logger xlog.Logger, proc *os.Process) error { - const op string = "chrome.Kill" - resolver := func() error { - logger.DebugOp(op, "removing Google Chrome process using port 9222...") - if proc == nil { - logger.DebugOp(op, "no Google Chrome process using port 9222 found, skipping") - return nil - } - return proc.Kill() + return nil } if err := resolver(); err != nil { return xerror.New(op, err) @@ -80,60 +42,125 @@ func Kill(logger xlog.Logger, proc *os.Process) error { return nil } -func restart(ctx context.Context, logger xlog.Logger, cmd *exec.Cmd) (*os.Process, error) { +func cmd(logger xlog.Logger) (*exec.Cmd, error) { + const op string = "chrome.cmd" + binary := "google-chrome-stable" + args := []string{ + "--no-sandbox", + "--headless", + // see https://github.com/GoogleChrome/puppeteer/issues/2410. + "--font-render-hinting=medium", + "--remote-debugging-port=9222", + "--disable-gpu", + "--disable-translate", + "--disable-extensions", + "--disable-background-networking", + "--safebrowsing-disable-auto-update", + "--disable-sync", + "--disable-default-apps", + "--hide-scrollbars", + "--metrics-recording-only", + "--mute-audio", + "--no-first-run", + } + cmd, err := xexec.Command(logger, binary, args...) + if err != nil { + return nil, xerror.New(op, err) + } + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + return cmd, nil +} + +func kill(logger xlog.Logger, proc *os.Process) error { + const op string = "chrome.kill" + logger.DebugOp(op, "killing Google Chrome headless process using port 9222...") + resolver := func() error { + err := syscall.Kill(-proc.Pid, syscall.SIGKILL) + if err == nil { + return nil + } + if strings.Contains(err.Error(), "no such process") { + return nil + } + return err + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + +func restart(logger xlog.Logger, proc *os.Process) error { const op string = "chrome.restart" - resolver := func() (*os.Process, error) { + logger.DebugOp(op, "restarting Google Chrome headless process using port 9222...") + resolver := func() error { + // kill the existing process first. + if err := kill(logger, proc); err != nil { + return err + } + cmd, err := cmd(logger) + if err != nil { + return err + } // we try to restart the process. xexec.LogBeforeExecute(logger, cmd) if err := cmd.Start(); err != nil { - return cmd.Process, err + return err } - // we wait the process to be ready. - warmup(logger) // if the process failed to restart correctly, // we have to restart it again. if !isViable(logger) { - return restart(ctx, logger, cmd) + return restart(logger, cmd.Process) } - return cmd.Process, nil + return nil } - proc, err := resolver() - if err != nil { - return proc, xerror.New(op, err) + if err := resolver(); err != nil { + return xerror.New(op, err) } - return proc, err + return nil } func isViable(logger xlog.Logger) bool { - const op string = "chrome.isViable" - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - endpoint := "http://localhost:9222" - logger.DebugfOp( - op, - "checking Google Chrome process viability via endpoint '%s/json/version'", - endpoint, + const ( + op string = "chrome.isViable" + maxViabilityTests int = 5 ) - v, err := devtool.New(endpoint).Version(ctx) - if err != nil { - logger.ErrorfOp( + viable := func() bool { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + endpoint := "http://localhost:9222" + logger.DebugfOp( op, - "Google Chrome is not viable as endpoint returned '%v'", - err, + "checking Google Chrome process viability via endpoint '%s/json/version'", + endpoint, ) - return false + v, err := devtool.New(endpoint).Version(ctx) + if err != nil { + logger.ErrorfOp( + op, + "Google Chrome is not viable as endpoint returned '%v'", + err, + ) + return false + } + logger.DebugfOp( + op, + "Google Chrome is viable as endpoint returned '%v'", + v, + ) + return true } - logger.DebugfOp( - op, - "Google Chrome is viable as endpoint returned '%v'", - v, - ) - return true + result := false + for i := 0; i < maxViabilityTests && !result; i++ { + warmup(logger) + result = viable() + } + return result } func warmup(logger xlog.Logger) { const op string = "chrome.warmup" - warmupTime := xtime.Duration(10) + warmupTime := xtime.Duration(0.5) logger.DebugfOp( op, "waiting '%v' for allowing Google Chrome to warmup", diff --git a/internal/pkg/printer/merge.go b/internal/pkg/printer/merge.go index 126301bb..b8d4fa5b 100644 --- a/internal/pkg/printer/merge.go +++ b/internal/pkg/printer/merge.go @@ -59,12 +59,7 @@ func (p mergePrinter) Print(destination string) error { var args []string args = append(args, p.fpaths...) args = append(args, "cat", "output", destination) - cmd, err := xexec.CommandContext(p.ctx, p.logger, "pdftk", args...) - if err != nil { - return err - } - xexec.LogBeforeExecute(p.logger, cmd) - return cmd.Run() + return xexec.Run(p.ctx, p.logger, "pdftk", args...) } if err := resolver(); err != nil { return xcontext.MustHandleError( diff --git a/internal/pkg/printer/office.go b/internal/pkg/printer/office.go index 92ebd7d5..8a21ff2e 100644 --- a/internal/pkg/printer/office.go +++ b/internal/pkg/printer/office.go @@ -5,8 +5,6 @@ import ( "fmt" "os" "path/filepath" - "strings" - "syscall" "github.com/phayes/freeport" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" @@ -106,43 +104,7 @@ func unoconv(ctx context.Context, logger xlog.Logger, fpath, destination string, args = append(args, "--printer", "PaperOrientation=landscape") } args = append(args, "--output", destination, fpath) - cmd, err := xexec.Command( - logger, - "unoconv", - args..., - ) - if err != nil { - return err - } - xexec.LogBeforeExecute(logger, cmd) - // see https://medium.com/@felixge/killing-a-child-process-and-all-of-its-children-in-go-54079af94773. - kill := func() { - err := syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) - if err == nil { - return - } - if !strings.Contains(err.Error(), "no such process") { - logger.ErrorOp(op, err) - } - } - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - if err := cmd.Start(); err != nil { - return err - } - result := make(chan error, 1) - go func() { - result <- cmd.Wait() - }() - select { - case err := <-result: - logger.DebugfOp(op, "command '%s' finished", strings.Join(cmd.Args, " ")) - kill() - return err - case <-ctx.Done(): - logger.DebugfOp(op, "command '%s' failed to finish before context.Context deadline", strings.Join(cmd.Args, " ")) - kill() - return ctx.Err() - } + return xexec.Run(ctx, logger, "unoconv", args...) } if err := resolver(); err != nil { return xerror.New(op, err) diff --git a/internal/pkg/xexec/doc.go b/internal/pkg/xexec/doc.go index e1605a43..9db49c6f 100644 --- a/internal/pkg/xexec/doc.go +++ b/internal/pkg/xexec/doc.go @@ -1,6 +1,7 @@ /* Package xexec helps creating exec.Cmd -with logging. +with logging and executing those commands +without leaking orphan processes. All functions return our standard xerror.Error in case of error. diff --git a/internal/pkg/xexec/xexec.go b/internal/pkg/xexec/xexec.go index b67d7b5a..127f65c6 100644 --- a/internal/pkg/xexec/xexec.go +++ b/internal/pkg/xexec/xexec.go @@ -8,6 +8,7 @@ import ( "io" "os/exec" "strings" + "syscall" "github.com/thecodingmachine/gotenberg/internal/pkg/xerror" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" @@ -43,6 +44,61 @@ func CommandContext(ctx context.Context, logger xlog.Logger, binary string, args return cmd, nil } +/* +Run runs a command. + +If command finishes or fails to finish +before context.Context deadline, kill the +corresponding process in a way which does +not leak orphan processes. +*/ +func Run(ctx context.Context, logger xlog.Logger, binary string, args ...string) error { + const op string = "xexec.Run" + resolver := func() error { + cmd, err := Command( + logger, + binary, + args..., + ) + if err != nil { + return err + } + LogBeforeExecute(logger, cmd) + // see https://medium.com/@felixge/killing-a-child-process-and-all-of-its-children-in-go-54079af94773. + kill := func() { + err := syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) + if err == nil { + return + } + if !strings.Contains(err.Error(), "no such process") { + logger.ErrorOp(op, err) + } + } + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + if err := cmd.Start(); err != nil { + return err + } + result := make(chan error, 1) + go func() { + result <- cmd.Wait() + }() + select { + case err := <-result: + logger.DebugfOp(op, "command '%s' finished", strings.Join(cmd.Args, " ")) + kill() + return err + case <-ctx.Done(): + logger.DebugfOp(op, "command '%s' failed to finish before context.Context deadline", strings.Join(cmd.Args, " ")) + kill() + return ctx.Err() + } + } + if err := resolver(); err != nil { + return xerror.New(op, err) + } + return nil +} + // LogBeforeExecute logs a command before its execution. func LogBeforeExecute(logger xlog.Logger, cmd *exec.Cmd) { const op string = "xexec.LogBeforeExecute" @@ -87,7 +143,7 @@ func logCommandOutput(logger xlog.Logger, reader io.ReadCloser, outputType strin for { line, _, err := r.ReadLine() if err != nil { - if err != io.EOF { + if err != io.EOF && !strings.Contains(err.Error(), "file already closed") { logger.ErrorOp(op, err) } break diff --git a/internal/pkg/xexec/xexec_test.go b/internal/pkg/xexec/xexec_test.go index bc3806aa..ceffc5c5 100644 --- a/internal/pkg/xexec/xexec_test.go +++ b/internal/pkg/xexec/xexec_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/thecodingmachine/gotenberg/internal/pkg/xcontext" "github.com/thecodingmachine/gotenberg/test" ) @@ -37,3 +38,16 @@ func TestCommandContext(t *testing.T) { LogBeforeExecute(logger, cmd) assert.Nil(t, err) } + +func TestRun(t *testing.T) { + logger := test.DebugLogger() + // should run without issue. + err := Run(context.Background(), logger, "echo", "Hello", "World") + assert.Nil(t, err) + // should not be OK as context.Context + // should timeout. + ctx, cancel := xcontext.WithTimeout(logger, 0) + defer cancel() + err = Run(ctx, logger, "echo", "Hello", "World") + assert.NotNil(t, err) +} diff --git a/test/cmd/chrome.go b/test/cmd/chrome.go index 82b38fcc..73d96474 100644 --- a/test/cmd/chrome.go +++ b/test/cmd/chrome.go @@ -1,8 +1,6 @@ package main import ( - "context" - "github.com/thecodingmachine/gotenberg/internal/pkg/chrome" "github.com/thecodingmachine/gotenberg/internal/pkg/conf" "github.com/thecodingmachine/gotenberg/internal/pkg/xlog" @@ -15,9 +13,8 @@ func main() { if err != nil { systemLogger.FatalOp(op, err) } - // start Google Chrome. - _, err = chrome.Start(context.Background(), systemLogger) - if err != nil { + // start Google Chrome headless. + if err := chrome.Start(systemLogger); err != nil { systemLogger.FatalOp(op, err) } } From 930622ea3c7f7c761cf45a6c263b5f9fb03cfb07 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Wed, 2 Oct 2019 11:09:21 +0200 Subject: [PATCH 106/107] adding load testing results --- internal/pkg/chrome/chrome.go | 12 +-- loadtesting/README.md | 133 +++++++++++++++++++++++----------- loadtesting/merge.js | 18 +++++ 3 files changed, 114 insertions(+), 49 deletions(-) diff --git a/internal/pkg/chrome/chrome.go b/internal/pkg/chrome/chrome.go index 9a206c85..f70b2591 100644 --- a/internal/pkg/chrome/chrome.go +++ b/internal/pkg/chrome/chrome.go @@ -123,7 +123,7 @@ func restart(logger xlog.Logger, proc *os.Process) error { func isViable(logger xlog.Logger) bool { const ( op string = "chrome.isViable" - maxViabilityTests int = 5 + maxViabilityTests int = 20 ) viable := func() bool { ctx, cancel := context.WithCancel(context.Background()) @@ -131,21 +131,21 @@ func isViable(logger xlog.Logger) bool { endpoint := "http://localhost:9222" logger.DebugfOp( op, - "checking Google Chrome process viability via endpoint '%s/json/version'", + "checking Google Chrome headless process viability via endpoint '%s/json/version'", endpoint, ) v, err := devtool.New(endpoint).Version(ctx) if err != nil { - logger.ErrorfOp( + logger.DebugfOp( op, - "Google Chrome is not viable as endpoint returned '%v'", - err, + "Google Chrome headless is not viable as endpoint returned '%v'", + err.Error(), ) return false } logger.DebugfOp( op, - "Google Chrome is viable as endpoint returned '%v'", + "Google Chrome headless is viable as endpoint returned '%v'", v, ) return true diff --git a/loadtesting/README.md b/loadtesting/README.md index a55a3e1b..eb673c9f 100644 --- a/loadtesting/README.md +++ b/loadtesting/README.md @@ -32,34 +32,34 @@ $ k6 run --env MAX_VUS=100 --env BASE_URL=http://ec2-foo.eu-west-1.compute.amazo duration: -, iterations: - vus: 1, max: 100 - done [==========================================================] 1m11.9s / 10m0s + done [==========================================================] 1m17.9s / 10m0s ✗ is status 200 - ↳ 99% — ✓ 179 / ✗ 1 + ↳ 99% — ✓ 201 / ✗ 2 ✗ is not status 504 - ↳ 99% — ✓ 179 / ✗ 1 + ↳ 99% — ✓ 201 / ✗ 2 ✓ is not status 500 - checks.....................: 99.62% ✓ 538 ✗ 2 - data_received..............: 41 MB 576 kB/s - data_sent..................: 8.5 MB 118 kB/s - ✗ failed requests............: 1 0.013895/s - http_req_blocked...........: avg=1.58ms min=2µs med=5µs max=59.73ms p(90)=10.19µs p(95)=20.57ms - http_req_connecting........: avg=1.56ms min=0s med=0s max=59.61ms p(90)=0s p(95)=20.48ms - http_req_duration..........: avg=2.3s min=1.32s med=1.67s max=10.2s p(90)=4.41s p(95)=7.54s - http_req_receiving.........: avg=99.01ms min=127µs med=98.4ms max=154.86ms p(90)=115.92ms p(95)=122.42ms - http_req_sending...........: avg=232.69µs min=133µs med=207µs max=1.16ms p(90)=335.4µs p(95)=382.64µs - http_req_tls_handshaking...: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s - http_req_waiting...........: avg=2.2s min=1.21s med=1.56s max=10.2s p(90)=4.32s p(95)=7.45s - http_reqs..................: 180 2.501138/s - iteration_duration.........: avg=2.3s min=1.33s med=1.67s max=10.22s p(90)=4.45s p(95)=7.54s - iterations.................: 180 2.501138/s - vus........................: 12 min=1 max=12 + checks.....................: 99.34% ✓ 605 ✗ 4 + data_received..............: 46 MB 594 kB/s + data_sent..................: 9.6 MB 123 kB/s + ✗ failed requests............: 2 0.025646/s + http_req_blocked...........: avg=1.63ms min=2µs med=4µs max=74.77ms p(90)=9.6µs p(95)=19.66ms + http_req_connecting........: avg=1.61ms min=0s med=0s max=74.59ms p(90)=0s p(95)=19.57ms + http_req_duration..........: avg=2.43s min=1.31s med=1.67s max=10.27s p(90)=5.44s p(95)=8.75s + http_req_receiving.........: avg=97.95ms min=103µs med=93.74ms max=202.48ms p(90)=114.51ms p(95)=132.99ms + http_req_sending...........: avg=231.53µs min=92µs med=201µs max=2.33ms p(90)=310.4µs p(95)=333.59µs + http_req_tls_handshaking...: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s + http_req_waiting...........: avg=2.33s min=1.22s med=1.58s max=10.12s p(90)=5.33s p(95)=8.62s + http_reqs..................: 203 2.603019/s + iteration_duration.........: avg=2.43s min=1.31s med=1.68s max=10.27s p(90)=5.45s p(95)=8.75s + iterations.................: 203 2.603019/s + vus........................: 13 min=1 max=13 vus_max....................: 100 min=100 max=100 ``` -In our use case, when reaching 12 virtual users (~2,5 requests per second), some incoming requests cannot be fulfilled before 10 seconds (`DEFAULT_WAIT_TIMEOUT` value). -During this test, CPU usage went from 0 to 100% and memory usage stayed low (Google Chrome go from 64.1 MB to 64.9 MB). +In our use case, when reaching 13 virtual users (~2,6 requests per second), some incoming requests cannot be fulfilled before 10 seconds (`DEFAULT_WAIT_TIMEOUT` value). +During this test, CPU usage was high and memory usage went from 339 MiB to a peak of 421 MiB before going back to 364 MiB. ## Office @@ -81,33 +81,80 @@ $ k6 run --env MAX_VUS=100 --env BASE_URL=http://ec2-foo.eu-west-1.compute.amazo duration: -, iterations: - vus: 1, max: 100 - done [==========================================================] 2m7.9s / 10m0s + done [==========================================================] 47.9s / 10m0s - ✗ is status 200 - ↳ 99% — ✓ 481 / ✗ 3 - ✗ is not status 504 - ↳ 99% — ✓ 481 / ✗ 3 ✓ is not status 500 + ✗ is status 200 + ↳ 83% — ✓ 31 / ✗ 6 + ✗ is not status 504 + ↳ 83% — ✓ 31 / ✗ 6 - checks.....................: 99.58% ✓ 1446 ✗ 6 - data_received..............: 40 MB 312 kB/s - data_sent..................: 45 MB 348 kB/s - ✗ failed requests............: 3 0.023446/s - http_req_blocked...........: avg=1.85ms min=2µs med=5µs max=373.57ms p(90)=12.69µs p(95)=23.84µs - http_req_connecting........: avg=1.11ms min=0s med=0s max=47.62ms p(90)=0s p(95)=0s - http_req_duration..........: avg=2.65s min=289.89ms med=2.48s max=10.08s p(90)=4.51s p(95)=5.43s - http_req_receiving.........: avg=57.15ms min=79µs med=51.53ms max=200.89ms p(90)=81.12ms p(95)=91.61ms - http_req_sending...........: avg=387.86µs min=159µs med=332µs max=3.87ms p(90)=513.1µs p(95)=695µs - http_req_tls_handshaking...: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s - http_req_waiting...........: avg=2.59s min=264.48ms med=2.4s max=10.08s p(90)=4.45s p(95)=5.37s - http_reqs..................: 484 3.782635/s - iteration_duration.........: avg=2.65s min=290.24ms med=2.48s max=10.08s p(90)=4.51s p(95)=5.43s - iterations.................: 484 3.782635/s - vus........................: 22 min=1 max=22 + checks.....................: 89.18% ✓ 99 ✗ 12 + data_received..............: 2.6 MB 54 kB/s + data_sent..................: 3.4 MB 71 kB/s + ✗ failed requests............: 6 0.125047/s + http_req_blocked...........: avg=4.39ms min=3µs med=4µs max=24.52ms p(90)=23.27ms p(95)=23.62ms + http_req_connecting........: avg=4.34ms min=0s med=0s max=24.42ms p(90)=23.15ms p(95)=23.52ms + http_req_duration..........: avg=5.34s min=1.74s med=4.33s max=10.83s p(90)=10.24s p(95)=10.25s + http_req_receiving.........: avg=42.49ms min=67µs med=49.1ms max=68.87ms p(90)=57.34ms p(95)=62.06ms + http_req_sending...........: avg=341.91µs min=215µs med=341µs max=724µs p(90)=443.99µs p(95)=514.79µs + http_req_tls_handshaking...: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s + http_req_waiting...........: avg=5.3s min=1.7s med=4.27s max=10.83s p(90)=10.24s p(95)=10.25s + http_reqs..................: 37 0.771121/s + iteration_duration.........: avg=5.34s min=1.74s med=4.35s max=10.86s p(90)=10.24s p(95)=10.25s + iterations.................: 37 0.771121/s + vus........................: 8 min=1 max=8 vus_max....................: 100 min=100 max=100 ``` -In our use case, when reaching 22 virtual users (~3,7 requests per second), some incoming requests cannot be fulfilled before 10 seconds (`DEFAULT_WAIT_TIMEOUT` value). -During this test, CPU usage went from 0 to 100% and memory usage stayed low. +In our use case, when reaching 8 virtual users (~0.8 requests per second), some incoming requests cannot be fulfilled before 10 seconds (`DEFAULT_WAIT_TIMEOUT` value). +During this test, CPU usage was high and memory usage went from 315 MiB to a peak of 788 MiB before going back to 307 MiB. -## Merge \ No newline at end of file +## Merge + +The Merge scenario is the same as the previous scenarios, but with a [gotenberg.pdf](../test/testdata/pdf/gotenberg.pdf) and a [gotenberg_bis.pdf](../test/testdata/pdf/gotenberg_bis.pdf). + +```bash +$ k6 run --env MAX_VUS=100 --env BASE_URL=http://ec2-foo.eu-west-1.compute.amazonaws.com merge.js + + /\ |‾‾| /‾‾/ /‾/ + /\ / \ | |_/ / / / + / \/ \ | | / ‾‾\ + / \ | |‾\ \ | (_) | + / __________ \ |__| \__\ \___/ .io + + execution: local + output: - + script: merge.js + + duration: -, iterations: - + vus: 1, max: 100 + + done [==========================================================] 1m45.9s / 10m0s + + ✗ is status 200 + ↳ 98% — ✓ 165 / ✗ 3 + ✗ is not status 504 + ↳ 98% — ✓ 165 / ✗ 3 + ✓ is not status 500 + + checks.....................: 98.80% ✓ 498 ✗ 6 + data_received..............: 69 MB 649 kB/s + data_sent..................: 70 MB 661 kB/s + ✗ failed requests............: 3 0.028302/s + http_req_blocked...........: avg=2.28ms min=2µs med=5µs max=33.24ms p(90)=23.6µs p(95)=23.38ms + http_req_connecting........: avg=2.24ms min=0s med=0s max=33.1ms p(90)=0s p(95)=23.04ms + http_req_duration..........: avg=5.32s min=632.86ms med=5.24s max=10.17s p(90)=9.42s p(95)=9.91s + http_req_receiving.........: avg=122.07ms min=82µs med=114.72ms max=230.35ms p(90)=162.27ms p(95)=188.95ms + http_req_sending...........: avg=16.56ms min=349µs med=1.37ms max=223.25ms p(90)=12ms p(95)=149.76ms + http_req_tls_handshaking...: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s + http_req_waiting...........: avg=5.18s min=573.03ms med=5.09s max=10.13s p(90)=9.29s p(95)=9.78s + http_reqs..................: 168 1.58493/s + iteration_duration.........: avg=5.33s min=633.87ms med=5.24s max=10.17s p(90)=9.43s p(95)=9.91s + iterations.................: 168 1.58493/s + vus........................: 18 min=1 max=18 + vus_max....................: 100 min=100 max=100 +``` + +In our use case, when reaching 18 virtual users (~1.6 requests per second), some incoming requests cannot be fulfilled before 10 seconds (`DEFAULT_WAIT_TIMEOUT` value). +During this test, CPU usage was high and memory usage went from 310 MiB to a peak of 604 MiB before going back to 331 MiB. diff --git a/loadtesting/merge.js b/loadtesting/merge.js index 6229743a..29e1db0d 100644 --- a/loadtesting/merge.js +++ b/loadtesting/merge.js @@ -1,9 +1,24 @@ import http from "k6/http"; +import { Counter } from "k6/metrics"; import { check } from "k6"; let pdf1File = open("../test/testdata/pdf/gotenberg.pdf", "b"), pdf2File = open("../test/testdata/pdf/gotenberg_bis.pdf", "b"); +let failCounter = new Counter("failed requests"); + +export let options = { + stages: [ + { duration: "10m", target: __ENV.MAX_VUS } + ], + thresholds: { + "failed requests": [{ + threshold: "count<1", + abortOnFail: true, + }] + } +} + export default function() { var data = { "gotenberg.pdf": http.file(pdf1File, "gotenberg.pdf"), @@ -15,4 +30,7 @@ export default function() { "is not status 504": (r) => r.status !== 504, "is not status 500": (r) => r.status !== 500, }); + if (res.status !== 200) { + failCounter.add(1); + } } \ No newline at end of file From 69e43e40ebf23a0ec38c7117dddae4e072ff35c2 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Wed, 2 Oct 2019 11:41:35 +0200 Subject: [PATCH 107/107] improving documentation --- .github/CODE_OF_CONDUCT.md | 2 +- .github/CONTRIBUTING.md | 4 ++-- .github/ISSUE_TEMPLATE.md | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- build/docs/content/12-scalability.md | 17 ++++++++--------- build/docs/content/13-ping.md | 2 +- build/docs/content/15-links.md | 1 + docs/index.html | 20 ++++++++++---------- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 42204861..1165dd4e 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -43,4 +43,4 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ffa62154..5fa0d548 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -8,7 +8,7 @@ find below useful information about how to contribute to the Gotenberg project. ### Install from sources 1. Install and run the latest version of Docker -2. Verify your Go version (>= 1.12) +2. Verify your Go version (>= 1.13) 3. Fork this repository 4. Clone it outside of your `GOPATH` (we're using Go modules) @@ -36,4 +36,4 @@ add a new one! * [Code of conduct](CODE_OF_CONDUCT.md) * [Issue template](ISSUE_TEMPLATE.md) -* [Pull request template](PULL_REQUEST_TEMPLATE.md) \ No newline at end of file +* [Pull request template](PULL_REQUEST_TEMPLATE.md) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index e1be6a09..fe595d44 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -32,4 +32,4 @@ Please search on the [issue tracker](../../../issues) before creating one. * Version used: * Operating System and version: -* Link to your project: \ No newline at end of file +* Link to your project: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ccc07b30..b758496e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -42,4 +42,4 @@ Fixes # - [ ] Have you successfully ran tests with your changes locally (`make tests`)? - [ ] Have you updated the documentation (`make doc`)? - [ ] I have squashed any insignificant commits -- [ ] This change has comments for package types, values, functions, and non-obvious lines of code \ No newline at end of file +- [ ] This change has comments for package types, values, functions, and non-obvious lines of code diff --git a/build/docs/content/12-scalability.md b/build/docs/content/12-scalability.md index 4424670b..924012b4 100644 --- a/build/docs/content/12-scalability.md +++ b/build/docs/content/12-scalability.md @@ -2,17 +2,18 @@ title: Scalability --- -Google Chrome and unoconv (LibreOffice) are intricate programs. +The API uses under the hood intricate programs. Gotenberg tries to abstract as much complexity as possible but it can only do it to a certain extend. -For instance, Google Chrome misbehaves if there are too many concurrent conversions. -That's why for [HTML](#html), [URL](#url) and [Markdown](#markdown) conversions, the API does only 6 conversions in parallel. -The more concurrent requests, the more `504` HTTP codes the API will return. +For instance, [Office](#office) and [Merge](#merge) endpoints will start respectively as many LibreOffice (unoconv) and PDTk +instances are there are requests. The limitation here is the available memory and CPU usage. -On another hand, for [Office](#office) conversions, the API will start as many unoconv (LibreOffice) instances as there are -requests. The limitation here is the available memory. +On another hand, for the [HTML](#html), [URL](#url) and [Markdown](#markdown) endpoints, the API does only 6 conversions in parallel. +Indeed, Google Chrome misbehaves if there are too many concurrent conversions. + +**The more concurrent requests, the more `504` HTTP codes the API will return.** > See our [load testing use case](../loadtesting) for more details about the API behaviour under heavy load. @@ -20,10 +21,8 @@ requests. The limitation here is the available memory. ### Increase timeout -This strategy is mostly for [HTML](#html), [URL](#url) and [Markdown](#markdown) conversions. - You may increase the conversion timeout. In other words, you accept that a conversion takes more time -if there are more than 6 conversions in parallel. +if the API is under heavy load. > See [timeout section](#timeout). diff --git a/build/docs/content/13-ping.md b/build/docs/content/13-ping.md index 3d661698..1535b607 100644 --- a/build/docs/content/13-ping.md +++ b/build/docs/content/13-ping.md @@ -8,5 +8,5 @@ a simple `GET` request. Currently this endpoint does nothing special. A better way to monitor Gotenberg would be by checking the memory usage. -Also, as Google Chrome and unoconv (LibreOffice) are intricate programs, you should +Also, as the API uses under the hood intricate programs, you should restart your Gotenberg instances from time to time to ensure a nominal behaviour. diff --git a/build/docs/content/15-links.md b/build/docs/content/15-links.md index 4c778b6f..23ac7d55 100644 --- a/build/docs/content/15-links.md +++ b/build/docs/content/15-links.md @@ -4,5 +4,6 @@ title: Links * Follow the progress on the [GitHub repository](https://github.com/thecodingmachine/gotenberg) * Follow [@gulnap](https://twitter.com/gulnap) on Twitter +* Thanks to [@mafredri](https://github.com/mafredri) for its help and its wonderful [cdp](https://github.com/mafredri/cdp) library Psst: TheCodingMachine is always looking for [talented coders](https://coders.thecodingmachine.com). diff --git a/docs/index.html b/docs/index.html index 0595a6e9..611db81c 100755 --- a/docs/index.html +++ b/docs/index.html @@ -1314,17 +1314,18 @@ $resp = $client->post($request);

    Scalability

    -

    Google Chrome and unoconv (LibreOffice) are intricate programs.

    +

    The API uses under the hood intricate programs.

    Gotenberg tries to abstract as much complexity as possible but it can only do it to a certain extend.

    -

    For instance, Google Chrome misbehaves if there are too many concurrent conversions. -That’s why for HTML, URL and Markdown conversions, the API does only 6 conversions in parallel. -The more concurrent requests, the more 504 HTTP codes the API will return.

    +

    For instance, Office and Merge endpoints will start respectively as many LibreOffice (unoconv) and PDTk +instances are there are requests. The limitation here is the available memory and CPU usage.

    -

    On another hand, for Office conversions, the API will start as many unoconv (LibreOffice) instances as there are -requests. The limitation here is the available memory.

    +

    On another hand, for the HTML, URL and Markdown endpoints, the API does only 6 conversions in parallel. +Indeed, Google Chrome misbehaves if there are too many concurrent conversions.

    + +

    The more concurrent requests, the more 504 HTTP codes the API will return.

    See our load testing use case for more details about the API behaviour under heavy load.

    @@ -1338,10 +1339,8 @@ requests. The limitation here is the available memory.

    Increase timeout -

    This strategy is mostly for HTML, URL and Markdown conversions.

    -

    You may increase the conversion timeout. In other words, you accept that a conversion takes more time -if there are more than 6 conversions in parallel.

    +if the API is under heavy load.

    See timeout section.

    @@ -1385,7 +1384,7 @@ a simple GET request.

    Currently this endpoint does nothing special. A better way to monitor Gotenberg would be by checking the memory usage.

    -

    Also, as Google Chrome and unoconv (LibreOffice) are intricate programs, you should +

    Also, as the API uses under the hood intricate programs, you should restart your Gotenberg instances from time to time to ensure a nominal behaviour.

    @@ -1412,6 +1411,7 @@ restart your Gotenberg instances from time to time to ensure a nominal behaviour

    Psst: TheCodingMachine is always looking for talented coders.