From 74869b8a7f49aa634d1a2dac740eed45eca72c5a Mon Sep 17 00:00:00 2001
From: Penar Musaraj <pmusaraj@gmail.com>
Date: Mon, 4 Nov 2019 09:16:50 -0500
Subject: [PATCH] FIX: Do not consider mobile app traffic as crawler visits

Followup to a4eb523a
---
 lib/middleware/anonymous_cache.rb             |  2 +-
 .../middleware/request_tracker_spec.rb        | 19 ++++++++++++++++---
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/lib/middleware/anonymous_cache.rb b/lib/middleware/anonymous_cache.rb
index 559605c69a2..8c4ccc6afeb 100644
--- a/lib/middleware/anonymous_cache.rb
+++ b/lib/middleware/anonymous_cache.rb
@@ -66,7 +66,7 @@ module Middleware
             if @env[DISCOURSE_RENDER] == "crawler" || CrawlerDetection.crawler?(user_agent, @env["HTTP_VIA"])
               :true
             else
-              user_agent.downcase.include?("discourse") ? :true : :false
+              user_agent.downcase.include?("discourse") && !user_agent.downcase.include?("mobile") ? :true : :false
             end
           end
         @is_crawler == :true
diff --git a/spec/components/middleware/request_tracker_spec.rb b/spec/components/middleware/request_tracker_spec.rb
index b7433f4af6e..22fad3addc5 100644
--- a/spec/components/middleware/request_tracker_spec.rb
+++ b/spec/components/middleware/request_tracker_spec.rb
@@ -68,17 +68,30 @@ describe Middleware::RequestTracker do
       expect(ApplicationRequest.page_view_crawler.first.count).to eq(1)
       expect(ApplicationRequest.page_view_anon_mobile.first.count).to eq(1)
 
-      # log discourse User Agent requests as crawler for page views
+      expect(ApplicationRequest.page_view_crawler.first.count).to eq(1)
+    end
+
+    it "can log Discourse user agent requests correctly" do
+      # log discourse api agents as crawlers for page view stats...
       data = Middleware::RequestTracker.get_data(env(
         "HTTP_USER_AGENT" => "DiscourseAPI Ruby Gem 0.19.0"
       ), ["200", { "Content-Type" => 'text/html' }], 0.1)
 
       Middleware::RequestTracker.log_request(data)
       ApplicationRequest.write_cache!
+      expect(ApplicationRequest.page_view_crawler.first.count).to eq(1)
 
-      expect(ApplicationRequest.page_view_crawler.first.count).to eq(2)
+      # ...but count our mobile app user agents as regular visits
+      data = Middleware::RequestTracker.get_data(env(
+        "HTTP_USER_AGENT" => "Mozilla/5.0 AppleWebKit/605.1.15 Mobile/15E148 DiscourseHub)"
+      ), ["200", { "Content-Type" => 'text/html' }], 0.1)
+
+      Middleware::RequestTracker.log_request(data)
+      ApplicationRequest.write_cache!
+
+      expect(ApplicationRequest.page_view_crawler.first.count).to eq(1)
+      expect(ApplicationRequest.page_view_anon.first.count).to eq(1)
     end
-
   end
 
   context "rate limiting" do