|
@@ -2,6 +2,7 @@ package rendering
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"context"
|
|
"context"
|
|
|
|
|
+ "fmt"
|
|
|
"io"
|
|
"io"
|
|
|
"net"
|
|
"net"
|
|
|
"net/http"
|
|
"net/http"
|
|
@@ -20,14 +21,13 @@ var netTransport = &http.Transport{
|
|
|
TLSHandshakeTimeout: 5 * time.Second,
|
|
TLSHandshakeTimeout: 5 * time.Second,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+var netClient = &http.Client{
|
|
|
|
|
+ Transport: netTransport,
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func (rs *RenderingService) renderViaHttp(ctx context.Context, opts Opts) (*RenderResult, error) {
|
|
func (rs *RenderingService) renderViaHttp(ctx context.Context, opts Opts) (*RenderResult, error) {
|
|
|
filePath := rs.getFilePathForNewImage()
|
|
filePath := rs.getFilePathForNewImage()
|
|
|
|
|
|
|
|
- var netClient = &http.Client{
|
|
|
|
|
- Timeout: opts.Timeout,
|
|
|
|
|
- Transport: netTransport,
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
rendererUrl, err := url.Parse(rs.Cfg.RendererUrl)
|
|
rendererUrl, err := url.Parse(rs.Cfg.RendererUrl)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return nil, err
|
|
return nil, err
|
|
@@ -35,10 +35,10 @@ func (rs *RenderingService) renderViaHttp(ctx context.Context, opts Opts) (*Rend
|
|
|
|
|
|
|
|
queryParams := rendererUrl.Query()
|
|
queryParams := rendererUrl.Query()
|
|
|
queryParams.Add("url", rs.getURL(opts.Path))
|
|
queryParams.Add("url", rs.getURL(opts.Path))
|
|
|
- queryParams.Add("renderKey", rs.getRenderKey(opts.UserId, opts.OrgId, opts.OrgRole))
|
|
|
|
|
|
|
+ queryParams.Add("renderKey", rs.getRenderKey(opts.OrgId, opts.UserId, opts.OrgRole))
|
|
|
queryParams.Add("width", strconv.Itoa(opts.Width))
|
|
queryParams.Add("width", strconv.Itoa(opts.Width))
|
|
|
queryParams.Add("height", strconv.Itoa(opts.Height))
|
|
queryParams.Add("height", strconv.Itoa(opts.Height))
|
|
|
- queryParams.Add("domain", rs.getLocalDomain())
|
|
|
|
|
|
|
+ queryParams.Add("domain", rs.domain)
|
|
|
queryParams.Add("timezone", isoTimeOffsetToPosixTz(opts.Timezone))
|
|
queryParams.Add("timezone", isoTimeOffsetToPosixTz(opts.Timezone))
|
|
|
queryParams.Add("encoding", opts.Encoding)
|
|
queryParams.Add("encoding", opts.Encoding)
|
|
|
queryParams.Add("timeout", strconv.Itoa(int(opts.Timeout.Seconds())))
|
|
queryParams.Add("timeout", strconv.Itoa(int(opts.Timeout.Seconds())))
|
|
@@ -49,20 +49,48 @@ func (rs *RenderingService) renderViaHttp(ctx context.Context, opts Opts) (*Rend
|
|
|
return nil, err
|
|
return nil, err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ reqContext, cancel := context.WithTimeout(ctx, opts.Timeout+time.Second*2)
|
|
|
|
|
+ defer cancel()
|
|
|
|
|
+
|
|
|
|
|
+ req = req.WithContext(reqContext)
|
|
|
|
|
+
|
|
|
// make request to renderer server
|
|
// make request to renderer server
|
|
|
resp, err := netClient.Do(req)
|
|
resp, err := netClient.Do(req)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
- return nil, err
|
|
|
|
|
|
|
+ rs.log.Error("Failed to send request to remote rendering service.", "error", err)
|
|
|
|
|
+ return nil, fmt.Errorf("Failed to send request to remote rendering service. %s", err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// save response to file
|
|
// save response to file
|
|
|
defer resp.Body.Close()
|
|
defer resp.Body.Close()
|
|
|
|
|
+
|
|
|
|
|
+ // check for timeout first
|
|
|
|
|
+ if reqContext.Err() == context.DeadlineExceeded {
|
|
|
|
|
+ rs.log.Info("Rendering timed out")
|
|
|
|
|
+ return nil, ErrTimeout
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // if we didnt get a 200 response, something went wrong.
|
|
|
|
|
+ if resp.StatusCode != http.StatusOK {
|
|
|
|
|
+ rs.log.Error("Remote rendering request failed", "error", resp.Status)
|
|
|
|
|
+ return nil, fmt.Errorf("Remote rendering request failed. %d: %s", resp.StatusCode, resp.Status)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
out, err := os.Create(filePath)
|
|
out, err := os.Create(filePath)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return nil, err
|
|
return nil, err
|
|
|
}
|
|
}
|
|
|
defer out.Close()
|
|
defer out.Close()
|
|
|
- io.Copy(out, resp.Body)
|
|
|
|
|
|
|
+ _, err = io.Copy(out, resp.Body)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ // check that we didnt timeout while receiving the response.
|
|
|
|
|
+ if reqContext.Err() == context.DeadlineExceeded {
|
|
|
|
|
+ rs.log.Info("Rendering timed out")
|
|
|
|
|
+ return nil, ErrTimeout
|
|
|
|
|
+ }
|
|
|
|
|
+ rs.log.Error("Remote rendering request failed", "error", err)
|
|
|
|
|
+ return nil, fmt.Errorf("Remote rendering request failed. %s", err)
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return &RenderResult{FilePath: filePath}, err
|
|
return &RenderResult{FilePath: filePath}, err
|
|
|
}
|
|
}
|