You are here

function purge_urls in Purge 6

Same name and namespace in other branches
  1. 7.2 includes/purge.inc \purge_urls()
  2. 7 purge.inc \purge_urls()

Purges urls from reverse proxy caches

Parameters

$purge_urls: Array of urls to remove from the proxy cache using the http purge method.

Return value

Array of urls and their http status codes after purging.

1 call to purge_urls()
purge_expire_cache in ./purge.module
Implementation of hook_expire_cache().

File

./purge.inc, line 17
Contains the main purging functionality and error handling

Code

function purge_urls($purge_urls) {

  // Get settings
  $proxy_urls = explode(' ', variable_get('purge_proxy_urls', 'http://localhost:80'));
  $purge_requests = array();
  $current_purge_request = 0;

  // Find out the url parts we need from the urls to be purged
  foreach ($purge_urls as $purge_url) {
    $purge_url_parts = parse_url($purge_url);

    // Determine the host
    $purge_url_host = $purge_url_parts['host'];

    // Add portnames to the host if any are set
    if (array_key_exists('port', $purge_url_parts)) {
      $purge_url_host = $purge_url_host . ":" . $purge_url_parts['port'];
    }

    // Process all urls for each proxy
    foreach ($proxy_urls as $proxy_url) {

      // Add url and proxy url to the array for later processing
      $purge_requests[$current_purge_request]['purge_url'] = $purge_url;
      $purge_requests[$current_purge_request]['proxy_url'] = $proxy_url;

      // Select which method to use
      $proxy_url_parts = parse_url($proxy_url);
      if (array_key_exists('query', $proxy_url_parts)) {
        if (strstr($proxy_url_parts['query'], 'purge_method=get')) {
          $method = 'get';
        }
      }
      else {
        $method = 'purge';
      }

      // Construct a new url
      $proxy_url_base = $proxy_url_parts['scheme'] . "://" . $proxy_url_parts['host'];
      if (array_key_exists('port', $proxy_url_parts)) {
        $proxy_url_base = $proxy_url_base . ":" . $proxy_url_parts['port'];
      }

      // Construct a new path retaining the proxy url path (needed for nginx/get methods)
      if (array_key_exists('path', $proxy_url_parts)) {
        $purge_path = '/' . trim($proxy_url_parts['path'], '/') . '/' . ltrim($purge_url_parts['path'], '/');
      }
      else {
        $purge_path = $purge_url_parts['path'];
      }

      // Check for a query and add it
      if (array_key_exists('query', $purge_url_parts)) {
        $purge_path = $purge_path . '?' . $purge_url_parts['query'];
      }
      $purge_requests[$current_purge_request]['purge_url'] = $proxy_url_base . $purge_path;

      // The default PURGE method. Native to Squid and configurable in Varnish and Nginx
      if ($method == 'purge') {

        // Make it a PURGE request (not GET or POST)
        $purge_requests[$current_purge_request]['request_method'] = 'PURGE';

        // Set the host header to the sites hostname
        $purge_requests[$current_purge_request]['headers'] = array(
          "Host: " . $purge_url_host,
        );
      }
      elseif ($method == 'get') {
        $purge_requests[$current_purge_request]['request_method'] = 'GET';

        // Set the host header to the sites hostname
        $purge_requests[$current_purge_request]['headers'] = array(
          "Host: " . $purge_url_host,
        );
      }
      $current_purge_request++;
    }
  }

  // Issue the requests using curl (for now)
  $purge_request_results = purge_issue_requests_curl($purge_requests);
  return $purge_request_results;
}