// Convert returns a byte slice containing a PDF converted from HTML // using athenapdf CLI. // See the Convert method for Conversion for more information. func (c AthenaPDF) Convert(s converter.ConversionSource, done <-chan struct{}) ([]byte, error) { log.Printf("[AthenaPDF] converting to PDF: %s\n", s.GetActualURI()) // Construct the command to execute cmd := constructCMD(c.CMD, s.URI, c.Aggressive) out, err := gcmd.Execute(cmd, done) if err != nil { return nil, err } return out, nil }
func conversionHandler(c *gin.Context, source converter.ConversionSource) { // GC if converting temporary file if source.IsLocal { defer os.Remove(source.URI) } _, aggressive := c.GetQuery("aggressive") conf := c.MustGet("config").(Config) wq := c.MustGet("queue").(chan<- converter.Work) s := c.MustGet("statsd").(*statsd.Client) r, ravenOk := c.Get("sentry") t := s.NewTiming() awsConf := converter.AWSS3{ c.Query("aws_region"), c.Query("aws_id"), c.Query("aws_secret"), c.Query("s3_bucket"), c.Query("s3_key"), } var conversion converter.Converter var work converter.Work attempts := 0 baseConversion := converter.Conversion{} uploadConversion := converter.UploadConversion{baseConversion, awsConf} StartConversion: conversion = athenapdf.AthenaPDF{uploadConversion, conf.AthenaCMD, aggressive} if attempts != 0 { cc := cloudconvert.Client{conf.CloudConvert.APIUrl, conf.CloudConvert.APIKey} conversion = cloudconvert.CloudConvert{uploadConversion, cc} } work = converter.NewWork(wq, conversion, source) select { case <-c.Writer.CloseNotify(): work.Cancel() case <-work.Uploaded(): t.Send("conversion_duration") s.Increment("success") c.JSON(200, gin.H{"status": "uploaded"}) case out := <-work.Success(): t.Send("conversion_duration") s.Increment("success") c.Data(200, "application/pdf", out) case err := <-work.Error(): // log.Println(err) // Log, and stats collection if err == converter.ErrConversionTimeout { s.Increment("conversion_timeout") } else if _, awsError := err.(awserr.Error); awsError { s.Increment("s3_upload_error") if ravenOk { r.(*raven.Client).CaptureError(err, map[string]string{"url": source.GetActualURI()}) } } else { s.Increment("conversion_error") if ravenOk { r.(*raven.Client).CaptureError(err, map[string]string{"url": source.GetActualURI()}) } } if attempts == 0 && conf.ConversionFallback { s.Increment("cloudconvert") log.Println("falling back to CloudConvert...") attempts++ goto StartConversion } s.Increment("conversion_failed") if err == converter.ErrConversionTimeout { c.AbortWithError(http.StatusGatewayTimeout, converter.ErrConversionTimeout).SetType(gin.ErrorTypePublic) return } c.Error(err) } }