Exemplo n.º 1
0
 /**
  * Handle an incoming request.
  *
  * @param  \Illuminate\Http\Request $request
  * @param  \Closure $next
  * @return mixed
  */
 public function handle($request, Closure $next)
 {
     $url = $request->url_string;
     re_scrape($url);
     $CrawlerDetect = new CrawlerDetect();
     if ($CrawlerDetect->isCrawler()) {
         return;
     } else {
         return $next($request);
     }
 }
 public function track_download($file = '', $episode = 0, $referrer = '')
 {
     global $wpdb;
     session_start();
     if (!$file || !$episode || !isset($episode->ID)) {
         return;
     }
     // Make sure that the referrer is always a string (even if empty)
     $referrer = (string) $referrer;
     // Get request user agent
     $user_agent = (string) $_SERVER['HTTP_USER_AGENT'];
     // Include Crawler Detect library
     require_once 'lib/CrawlerDetect/CrawlerDetect.php';
     // Check if this user agent is a crawler/bot to prevent false stats
     $CrawlerDetect = new CrawlerDetect();
     if ($CrawlerDetect->isCrawler($user_agent)) {
         return;
     }
     // Check for specific podcasting services in user agent
     // The iOS Podcasts app makes a HEAD request with user agent Podcasts/2.4 and then a GET request with user agent AppleCoreMedia
     // This conditional will prevent double tracking from that app
     if (stripos($user_agent, 'podcasts/') !== false) {
         return;
     }
     if (stripos($user_agent, 'itunes') !== false || stripos($user_agent, 'AppleCoreMedia') !== false) {
         $referrer = 'itunes';
     } elseif (stripos($user_agent, 'stitcher') !== false) {
         $referrer = 'stitcher';
     } elseif (stripos($user_agent, 'overcast') !== false) {
         $referrer = 'overcast';
     } elseif (stripos($user_agent, 'Pocket Casts') !== false) {
         $referrer = 'pocketcasts';
     }
     // Get episode ID for database insert
     $episode_id = $episode->ID;
     // Get remote client IP address
     // If server is behind a reverse proxy (e.g. Cloudflare or Nginx), we need to get the client's IP address from HTTP headers
     // Cloudflare headers reference: https://support.cloudflare.com/hc/en-us/articles/200170986
     // The order of precedence here being Cloudflare, then other reverse proxies such as Nginx, then remote_addr
     $ip_address = '';
     if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
         $ip_address = $_SERVER['HTTP_CF_CONNECTING_IP'];
     } elseif (isset($_SERVER['CF-Connecting-IP'])) {
         $ip_address = $_SERVER['CF-Connecting-IP'];
     } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
         $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
     } elseif (isset($_SERVER['X-Forwarded-For'])) {
         $ip_address = $_SERVER['X-Forwarded-For'];
     } else {
         // None of the above headers are present (meaning we're not behind a reverse proxy) so fallback to using REMOTE_ADDR
         $ip_address = $_SERVER['REMOTE_ADDR'];
     }
     // Exit if there is no detectable IP address
     if (!$ip_address) {
         return;
     }
     // Create transient name from episode ID, IP address and referrer
     $transient = 'sspdl_' . $episode_id . '_' . str_replace('.', '', $ip_address) . '_' . $referrer;
     // Allow forced transient refresh
     if (isset($_GET['force'])) {
         delete_transient($transient);
     }
     // Check transient to prevent excessive tracking
     if (get_transient($transient)) {
         return;
     }
     // Insert data into database
     $insert_row = $wpdb->insert($this->_table, array('post_id' => $episode_id, 'ip_address' => $ip_address, 'referrer' => $referrer, 'date' => $this->current_time), array('%d', '%s', '%s', '%d'));
     // Set transient if successful to prevent excessive tracking
     if ($insert_row) {
         set_transient($transient, $this->current_time, HOUR_IN_SECONDS);
     }
 }