Making WordPress.org

Changeset 4364


Ignore:
Timestamp:
11/15/2016 11:51:56 PM (10 years ago)
Author:
iandunn
Message:

CampTix Badge Generator: Retry failed download attempts to avoid ruining batch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordcamp.org/public_html/wp-content/plugins/camptix-badge-generator/includes/indesign-badges.php

    r4363 r4364  
    7373                }
    7474
    75                 $request_url = str_replace( '=blank', '=404', $attendee->avatar_url );
    76                 $response    = wp_remote_get( $request_url );
    77                 $image       = wp_remote_retrieve_body( $response );
    78                 $status_code = wp_remote_retrieve_response_code( $response );
    79 
    80                 if ( 404 == $status_code ) {
     75                $request_url    = str_replace( '=blank', '=404', $attendee->avatar_url );
     76                $gravatar_image = download_single_gravatar( $request_url );
     77
     78                if ( ! $gravatar_image ) {
    8179                        continue;
    82                 }
    83 
    84                 if ( ! $image || 200 != $status_code ) {
    85                         Logger\log( 'request_failed', compact( 'attendee', 'request_url', 'response' ) );
    86                         throw new \Exception( __( "Couldn't download all Gravatars.", 'wordcamporg' ) );
    8780                }
    8881
     
    9083                $gravatar_file = fopen( $gravatar_folder . '/' . $filename, 'w' );
    9184
    92                 fwrite( $gravatar_file, $image );
     85                if ( ! $gravatar_file ) {
     86                        Logger\log( 'gravatar_open_failed', compact( 'attendee', 'gravatar_folder', 'filename' ) );
     87                        throw new \Exception( __( "Couldn't save all Gravatars.", 'wordcamporg' ) );
     88                }
     89
     90                fwrite( $gravatar_file, $gravatar_image );
    9391                fclose( $gravatar_file );
     92        }
     93}
     94
     95/**
     96 * Download a Gravatar
     97 *
     98 * Sometimes the HTTP request times out, or Varnish returns a `503` error, but the batch will be ruined if even a
     99 * single existing Gravatar cannot be downloaded successfully. In order to mitigate that, we retry the download
     100 * multiple times.
     101 *
     102 * @param string $request_url
     103 *
     104 * @return bool|string `false` when the user does not have a Gravatar, `string` of image binary data when the
     105 *                      image was successfully retrieved.
     106 *
     107 * @throws \Exception when the HTTP failed even after multiple attempts
     108 */
     109function download_single_gravatar( $request_url ) {
     110        $attempt_count = 1;
     111
     112        while ( true ) {
     113                $response    = wp_remote_get( $request_url );
     114                $status_code = wp_remote_retrieve_response_code( $response );
     115                $image       = wp_remote_retrieve_body( $response );
     116                $retry_after = wp_remote_retrieve_header( $response, 'retry-after' ) ?: 5;
     117                $retry_after = min( $retry_after * $attempt_count, 30 );
     118
     119                // A 404 is expected when the attendee doesn't have a Gravatar setup, so don't retry them
     120                if ( 404 == $status_code ) {
     121                        return false;
     122                }
     123
     124                if ( ! is_wp_error( $response ) && $image ) {
     125                        return $image;
     126                }
     127
     128                $response['body'] = '[redacted]'; // Avoid cluttering the logs with a ton of binary data
     129
     130                if ( $attempt_count < 3 ) {
     131                        Logger\log( 'request_failed_temporarily', compact( 'attendee', 'request_url', 'response', 'attempt_count', 'retry_after' ) );
     132                        sleep( $retry_after );
     133                } else {
     134                        Logger\log( 'request_failed_permenantly', compact( 'attendee', 'request_url', 'response' ) );
     135                        throw new \Exception( __( "Couldn't download all Gravatars.", 'wordcamporg' ) );
     136                }
     137
     138                $attempt_count++;
    94139        }
    95140}
Note: See TracChangeset for help on using the changeset viewer.