diff --git a/backend/Dockerfile b/backend/Dockerfile index af8d4ff71..91702986d 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -4,15 +4,11 @@ RUN apk add --no-cache git openssh openssl-dev pkgconf gcc g++ make libc-dev bas WORKDIR /root -COPY go.mod . -COPY go.sum . +COPY . . RUN go mod download -COPY . . - ARG SERVICE_NAME - RUN CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o service -tags musl openreplay/backend/services/$SERVICE_NAME FROM alpine @@ -39,6 +35,7 @@ ENV TZ=UTC \ AWS_REGION_WEB=eu-central-1 \ AWS_REGION_IOS=eu-west-1 \ AWS_REGION_ASSETS=eu-central-1 \ + CACHE_ASSETS=true \ ASSETS_SIZE_LIMIT=6291456 diff --git a/backend/Dockerfile-all b/backend/Dockerfile-all index f9e451fb6..d56dcbf23 100644 --- a/backend/Dockerfile-all +++ b/backend/Dockerfile-all @@ -35,6 +35,7 @@ ENV TZ=UTC \ AWS_REGION_WEB=eu-central-1 \ AWS_REGION_IOS=eu-west-1 \ AWS_REGION_ASSETS=eu-central-1 \ + CACHE_ASSETS=true \ ASSETS_SIZE_LIMIT=6291456 RUN mkdir $FS_DIR diff --git a/backend/pkg/url/assets/css.go b/backend/pkg/url/assets/css.go index 728239837..d06d62797 100644 --- a/backend/pkg/url/assets/css.go +++ b/backend/pkg/url/assets/css.go @@ -51,13 +51,27 @@ func ExtractURLsFromCSS(css string) []string { return urls } -func (r *Rewriter) RewriteCSS(sessionID uint64, baseurl string, css string) string { +func rewriteLinks(css string, rewrite func(rawurl string) string) string { for _, idx := range cssUrlsIndex(css) { f := idx[0] t := idx[1] rawurl, q := unquote(css[f:t]) // why exactly quote back? - css = css[:f] + q + r.RewriteURL(sessionID, baseurl, rawurl) + q + css[t:] + css = css[:f] + q + rewrite(rawurl) + q + css[t:] } + return css +} + +func ResolveCSS(baseURL string, css string) string { + css = rewriteLinks(css, func(rawurl string) string { + return ResolveURL(baseURL, rawurl) + }) + return strings.Replace(css, ":hover", ".-asayer-hover", -1) +} + +func (r *Rewriter) RewriteCSS(sessionID uint64, baseurl string, css string) string { + css = rewriteLinks(css, func(rawurl string) string { + return r.RewriteURL(sessionID, baseurl, rawurl) + }) return strings.Replace(css, ":hover", ".-asayer-hover", -1) } diff --git a/backend/pkg/url/assets/url.go b/backend/pkg/url/assets/url.go index 9f6c2c267..4b1572ba7 100644 --- a/backend/pkg/url/assets/url.go +++ b/backend/pkg/url/assets/url.go @@ -50,7 +50,7 @@ func GetFullCachableURL(baseURL string, relativeURL string) (string, bool) { } -const ASAYER_QUERY_START = "ASAYER_QUERY_ESCtRT" +const OPENREPLAY_QUERY_START = "OPENREPLAY_QUERY" func getCachePath(rawurl string) string { u, _ := url.Parse(rawurl) @@ -59,7 +59,7 @@ func getCachePath(rawurl string) string { if (s[len(s) - 1] != '/') { s += "/" } - s += ASAYER_QUERY_START + url.PathEscape(u.RawQuery) + s += OPENREPLAY_QUERY_START + url.PathEscape(u.RawQuery) } return s } diff --git a/backend/services/assets/main.go b/backend/services/assets/main.go index 0193be7bb..da7a92bbe 100644 --- a/backend/services/assets/main.go +++ b/backend/services/assets/main.go @@ -64,6 +64,8 @@ func main() { log.Printf("Caught signal %v: terminating\n", sig) consumer.Close() os.Exit(0) + case err := <-cacher.Errors: + log.Printf("Error while caching: %v", err) case <-tick: cacher.UpdateTimeouts() default: diff --git a/backend/services/http/assets.go b/backend/services/http/assets.go index 637aa5a5b..6a1e57243 100644 --- a/backend/services/http/assets.go +++ b/backend/services/http/assets.go @@ -6,7 +6,7 @@ import ( ) func sendAssetForCache(sessionID uint64, baseURL string, relativeURL string) { - if fullURL, cachable := assets.GetFullCachableURL(baseURL, relativeURL); cachable { + if fullURL, cacheable := assets.GetFullCachableURL(baseURL, relativeURL); cacheable { producer.Produce(topicTrigger, sessionID, messages.Encode(&messages.AssetCache{ URL: fullURL, })) @@ -17,4 +17,20 @@ func sendAssetsForCacheFromCSS(sessionID uint64, baseURL string, css string) { for _, u := range assets.ExtractURLsFromCSS(css) { // TODO: in one shot with rewriting sendAssetForCache(sessionID, baseURL, u) } +} + +func handleURL(sessionID uint64, baseURL string, url string) string { + if cacheAssets { + sendAssetForCache(sessionID, baseURL, url) + return rewriter.RewriteURL(sessionID, baseURL, url) + } + return assets.ResolveURL(baseURL, url) +} + +func handleCSS(sessionID uint64, baseURL string, css string) string { + if cacheAssets { + sendAssetsForCacheFromCSS(sessionID, baseURL, css) + return rewriter.RewriteCSS(sessionID, baseURL, css) + } + return assets.ResolveCSS(baseURL, css) } \ No newline at end of file diff --git a/backend/services/http/handlers.go b/backend/services/http/handlers.go index c17a46286..b3527ac3f 100644 --- a/backend/services/http/handlers.go +++ b/backend/services/http/handlers.go @@ -174,32 +174,28 @@ func pushMessagesSeparatelyHandler(w http.ResponseWriter, r *http.Request) { switch m := msg.(type) { case *SetNodeAttributeURLBased: if m.Name == "src" || m.Name == "href" { - sendAssetForCache(sessionData.ID, m.BaseURL, m.Value) msg = &SetNodeAttribute{ ID: m.ID, Name: m.Name, - Value: rewriter.RewriteURL(sessionData.ID, m.BaseURL, m.Value), + Value: handleURL(sessionData.ID, m.BaseURL, m.Value), } } else if m.Name == "style" { - sendAssetsForCacheFromCSS(sessionData.ID, m.BaseURL, m.Value) msg = &SetNodeAttribute{ ID: m.ID, Name: m.Name, - Value: rewriter.RewriteCSS(sessionData.ID, m.BaseURL, m.Value), + Value: handleCSS(sessionData.ID, m.BaseURL, m.Value), } } case *SetCSSDataURLBased: - sendAssetsForCacheFromCSS(sessionData.ID, m.BaseURL, m.Data) msg = &SetCSSData{ ID: m.ID, - Data: rewriter.RewriteCSS(sessionData.ID, m.BaseURL, m.Data), + Data: handleCSS(sessionData.ID, m.BaseURL, m.Data), } case *CSSInsertRuleURLBased: - sendAssetsForCacheFromCSS(sessionData.ID, m.BaseURL, m.Rule) msg = &CSSInsertRule{ ID: m.ID, Index: m.Index, - Rule: rewriter.RewriteCSS(sessionData.ID, m.BaseURL, m.Rule), + Rule: handleCSS(sessionData.ID, m.BaseURL, m.Rule), } } diff --git a/backend/services/http/main.go b/backend/services/http/main.go index b3e3b6d9d..d978bca80 100644 --- a/backend/services/http/main.go +++ b/backend/services/http/main.go @@ -35,6 +35,7 @@ var topicRaw string var topicTrigger string var topicAnalytics string // var kafkaTopicEvents string +var cacheAssets bool func main() { log.SetFlags(log.LstdFlags | log.LUTC | log.Llongfile) @@ -52,6 +53,8 @@ func main() { uaParser = uaparser.NewUAParser(env.String("UAPARSER_FILE")) geoIP = geoip.NewGeoIP(env.String("MAXMINDDB_FILE")) flaker = flakeid.NewFlaker(env.WorkerID()) + cacheAssets = env.Bool("CACHE_ASSETS") + HTTP_PORT := env.String("HTTP_PORT") server := &http.Server{