| set -u |
| set -e |
| |
| # Rewrites an image with the specified Save-Data header and Via header; |
| # verifies the content type, length, and Vary header of the response. |
| function ipro_rewrite_image_and_verify_response() { |
| local HAS_SAVE_DATA=$1 |
| local HAS_VIA=$2 |
| local EXPECTED_CONTENT_TYPE=$3 |
| local EXPECTED_VARY=$4 |
| local EXPECTED_CONTENT_LENGTH=$5 |
| local SECONDARY_HOST="optimizeforbandwidth.example.com" |
| local OPT="--save-headers --user-agent=$USER_AGENT" |
| |
| local URL |
| if [ -z "${STATIC_DOMAIN:-}" ]; then |
| URL="http://$HOST/$IMAGE" |
| fi |
| |
| local TIME_OUT_STR="" |
| if [ "$EXPECTED_CONTENT_LENGTH" = "$UNOPTIMIZED" ]; then |
| TIME_OUT_STR="-expect_time_out" |
| fi |
| |
| local TEST_ID="IPRO rewrite image $URL UA=$USER_AGENT" |
| if [ "$ACCEPT_WEBP" = true ]; then |
| OPT+=" --header=Accept:image/webp" |
| TEST_ID+=" Accept:webp" |
| fi |
| if [ "$HAS_SAVE_DATA" = true ]; then |
| OPT+=" --header=Save-Data:on" |
| TEST_ID+=" Save-Data:on" |
| fi |
| if [ "$HAS_VIA" = true ]; then |
| OPT+=" --header=Via:proxy" |
| TEST_ID+=" Via:proxy" |
| fi |
| |
| # Fetch the image until it's optimized or timed-out. |
| start_test "$TEST_ID" |
| http_proxy=$SECONDARY_HOSTNAME \ |
| fetch_until -save $TIME_OUT_STR $URL 'grep -c W/\"PSA-aj-' 1 "$OPT" |
| |
| local TYPE="$(extract_headers $FETCH_UNTIL_OUTFILE | \ |
| scrape_header 'Content-Type')" |
| check [ $TYPE = $EXPECTED_CONTENT_TYPE ] |
| # If the image can be optimized, content length is checked against a range |
| # for accommodating image encoder version difference. |
| local LENGTH="$(extract_headers $FETCH_UNTIL_OUTFILE | scrape_content_length)" |
| if [ "$EXPECTED_CONTENT_LENGTH" != "$UNOPTIMIZED" ]; then |
| local MIN_LENGTH=`expr $EXPECTED_CONTENT_LENGTH - 30` |
| local MAX_LENGTH=`expr $EXPECTED_CONTENT_LENGTH + 30` |
| check [ $LENGTH -ge $MIN_LENGTH ] |
| check [ $LENGTH -le $MAX_LENGTH ] |
| fi |
| local VARY="$(extract_headers $FETCH_UNTIL_OUTFILE | scrape_header 'Vary')" |
| if [ -z $EXPECTED_VARY ]; then |
| check_not_from "$(extract_headers $FETCH_UNTIL_OUTFILE)" grep -q "^Vary: " |
| else |
| check [ $VARY = $EXPECTED_VARY ] |
| fi |
| } |
| |
| # Rewrites an image using the specified user-agent. Checks the combination |
| # of with and without Save-Data header and Via header. |
| # With "Via", "AllowVaryOn: auto" implies "Save-Data,Accept". |
| # Without "Via", "AllowVaryOn: auto" implies "Save-Data,User-Agent". |
| function ipro_rewrite_image() { |
| local HOST=$1 |
| local IMAGE=$2 |
| local USER_AGENT=$3 |
| local ACCEPT_WEBP=$4 |
| local EXPECTED_CONTENT_TYPE_VIA_YES=$5 |
| local EXPECTED_CONTENT_TYPE_VIA_NO=$6 |
| local EXPECTED_VARY_VIA_YES=$7 |
| local EXPECTED_VARY_VIA_NO=$8 |
| local EXPECTED_LENGTH_SD_NO_VIA_YES=$9 |
| local EXPECTED_LENGTH_SD_NO_VIA_NO=${10} |
| local EXPECTED_LENGTH_SD_YES_VIA_YES=${11} |
| local EXPECTED_LENGTH_SD_YES_VIA_NO=${12} |
| # Constants |
| local SAVE_DATA_YES=true |
| local SAVE_DATA_NO=false |
| local VIA_YES=true |
| local VIA_NO=false |
| # Save-Data: no, Via: yes |
| ipro_rewrite_image_and_verify_response "$SAVE_DATA_NO" "$VIA_YES" \ |
| "$EXPECTED_CONTENT_TYPE_VIA_YES" "$EXPECTED_VARY_VIA_YES" \ |
| "$EXPECTED_LENGTH_SD_NO_VIA_YES" |
| # Save-Data: no, Via: no |
| ipro_rewrite_image_and_verify_response "$SAVE_DATA_NO" "$VIA_NO" \ |
| "$EXPECTED_CONTENT_TYPE_VIA_NO" "$EXPECTED_VARY_VIA_NO" \ |
| "$EXPECTED_LENGTH_SD_NO_VIA_NO" |
| # Save-Data: yes, Via: yes |
| ipro_rewrite_image_and_verify_response "$SAVE_DATA_YES" "$VIA_YES" \ |
| "$EXPECTED_CONTENT_TYPE_VIA_YES" "$EXPECTED_VARY_VIA_YES" \ |
| "$EXPECTED_LENGTH_SD_YES_VIA_YES" |
| # Save-Data: yes, Via: no |
| ipro_rewrite_image_and_verify_response "$SAVE_DATA_YES" "$VIA_NO" \ |
| "$EXPECTED_CONTENT_TYPE_VIA_NO" "$EXPECTED_VARY_VIA_NO" \ |
| "$EXPECTED_LENGTH_SD_YES_VIA_NO" |
| } |
| |
| # Hosts |
| HOST_ALLOW_ACCEPT="ipro-for-browser.example.com" |
| HOST_ALLOW_AUTO="ipro-for-browser-vary-on-auto.example.com" |
| HOST_ALLOW_NONE="ipro-for-browser-vary-on-none.example.com" |
| # User-agents |
| CHROME_MOBILE="Mozilla*Android*Mobile*Chrome/44.*" |
| SAFARI_MOBILE="iPhone*Safari/8536.25" |
| FIREFOX_DESKTOP="Firefox/1.5" |
| # Images |
| # JPEG image which will be optimized to lossy format. |
| IMAGE_PUZZLE="images/Puzzle.jpg" |
| # PNG image which will be optimized to lossless format. |
| IMAGE_CUPPA="images/Cuppa.png" |
| # PNG image which will be optimized to lossy format. |
| IMAGE_BIKE="images/BikeCrashIcn.png" |
| # Animated GIF which can only be optimized to animated WebP. |
| IMAGE_ANIMATION="images/PageSpeedAnimationSmall.gif" |
| # Qualities overriding |
| UNSET_QUALITY=\ |
| "?PageSpeedJpegQualityForSaveData=-1&PageSpeedWebpQualityForSaveData=-1" |
| SAME_QUALITY=\ |
| "?PageSpeedJpegQualityForSaveData=75&PageSpeedWebpQualityForSaveData=70" |
| # Constants |
| ACCEPT_WEBP_YES=true |
| ACCEPT_WEBP_NO=false |
| UNOPTIMIZED=-1 |
| |
| # Allowed to vary on "Auto". Test 3 kinds of user-agents, on 3 quality levels |
| # for 4 kinds of images. |
| # JPEG image, optimized for Chrome on Android. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_PUZZLE" \ |
| "$CHROME_MOBILE" "$ACCEPT_WEBP_YES" "image/webp" "image/webp" \ |
| "Accept,Save-Data" "User-Agent,Save-Data" 33108 25774 19124 19124 |
| # JPEG image, optimized for Safari on iOS. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_PUZZLE" \ |
| "$SAFARI_MOBILE" "$ACCEPT_WEBP_NO" "image/jpeg" "image/jpeg" \ |
| "Accept,Save-Data" "User-Agent,Save-Data" 73096 51452 38944 38944 |
| # JPEG image, optimized for Firefox on desktop. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_PUZZLE" \ |
| "$FIREFOX_DESKTOP" "$ACCEPT_WEBP_NO" "image/jpeg" "image/jpeg" \ |
| "Accept,Save-Data" "User-Agent,Save-Data" 73096 73096 38944 38944 |
| # Photographic PNG image, optimized for Chrome on Android. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_BIKE" \ |
| "$CHROME_MOBILE" "$ACCEPT_WEBP_YES" "image/webp" "image/webp" \ |
| "Accept,Save-Data" "User-Agent,Save-Data" 2454 2014 1476 1476 |
| # Photographic PNG image, optimized for Safari on iOS. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_BIKE" \ |
| "$SAFARI_MOBILE" "$ACCEPT_WEBP_NO" "image/jpeg" "image/jpeg" \ |
| "Accept,Save-Data" "User-Agent,Save-Data" 3536 2606 2069 2069 |
| # Photographic PNG image, optimized for Firefox on desktop. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_BIKE" \ |
| "$FIREFOX_DESKTOP" "$ACCEPT_WEBP_NO" "image/jpeg" "image/jpeg" \ |
| "Accept,Save-Data" "User-Agent,Save-Data" 3536 3536 2069 2069 |
| # Non-photographic PNG image, optimized for Chrome on Android. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_CUPPA" \ |
| "$CHROME_MOBILE" "$ACCEPT_WEBP_YES" "image/png" "image/webp" \ |
| "" "User-Agent" 770 694 770 694 |
| # Non-photographic PNG image, optimized for Safari on iOS. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_CUPPA" \ |
| "$SAFARI_MOBILE" "$ACCEPT_WEBP_NO" "image/png" "image/png" \ |
| "" "User-Agent" 770 770 770 770 |
| # Non-photographic PNG image, optimized for Firefox on desktop. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_CUPPA" \ |
| "$FIREFOX_DESKTOP" "$ACCEPT_WEBP_NO" "image/png" "image/png" \ |
| "" "User-Agent" 770 770 770 770 |
| # Animated GIF image, optimized for Chrome on Android. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_ANIMATION" \ |
| "$CHROME_MOBILE" "$ACCEPT_WEBP_YES" "image/gif" "image/webp" \ |
| "" "User-Agent,Save-Data" "$UNOPTIMIZED" 6490 "$UNOPTIMIZED" 4312 |
| # Animated GIF image, optimized for Safari on iOS. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_ANIMATION" \ |
| "$SAFARI_MOBILE" "$ACCEPT_WEBP_NO" "image/gif" "image/gif" \ |
| "" "" "$UNOPTIMIZED" "$UNOPTIMIZED" "$UNOPTIMIZED" "$UNOPTIMIZED" |
| # Animated GIF image, optimized for Firefox on desktop. |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_ANIMATION" \ |
| "$FIREFOX_DESKTOP" "$ACCEPT_WEBP_NO" "image/gif" "image/gif" \ |
| "" "" "$UNOPTIMIZED" "$UNOPTIMIZED" "$UNOPTIMIZED" "$UNOPTIMIZED" |
| |
| # Only allow to vary on Accept, JPEG image is optimized to desktop quality. |
| ipro_rewrite_image "$HOST_ALLOW_ACCEPT" "$IMAGE_PUZZLE" \ |
| "$CHROME_MOBILE" "$ACCEPT_WEBP_YES" "image/webp" "image/webp" \ |
| "Accept" "Accept" 33108 33108 33108 33108 |
| # Only allow to vary on Accept, photographic PNG image is optimized to PNG and |
| # Vary header is not added. |
| ipro_rewrite_image "$HOST_ALLOW_ACCEPT" "$IMAGE_CUPPA" \ |
| "$SAFARI_MOBILE" "$ACCEPT_WEBP_YES" "image/png" "image/png" \ |
| "" "" 770 770 770 770 |
| # Only allow to vary on Accept, animated image cannot be optimized. |
| ipro_rewrite_image "$HOST_ALLOW_ACCEPT" "$IMAGE_ANIMATION" \ |
| "$SAFARI_MOBILE" "$ACCEPT_WEBP_YES" "image/gif" "image/gif" \ |
| "" "" "$UNOPTIMIZED" "$UNOPTIMIZED" "$UNOPTIMIZED" "$UNOPTIMIZED" |
| # Nothing is allowed to vary on, JPEG image is optimized to desktop quality and |
| # Vary header is not added. |
| ipro_rewrite_image "$HOST_ALLOW_NONE" "$IMAGE_PUZZLE" \ |
| "$CHROME_MOBILE" "$ACCEPT_WEBP_YES" "image/jpeg" "image/jpeg" \ |
| "" "" 73096 73096 73096 73096 |
| # When quality for Save-Data was not set, Vary header does not include |
| # "Save-Data". |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_PUZZLE$UNSET_QUALITY" \ |
| "$CHROME_MOBILE" "$ACCEPT_WEBP_YES" "image/webp" "image/webp" \ |
| "Accept" "User-Agent" 33108 25774 33108 25774 |
| # When quality for Save-Data was set to the same for desktop, Vary header does |
| # not include "Save-Data". |
| ipro_rewrite_image "$HOST_ALLOW_AUTO" "$IMAGE_PUZZLE$SAME_QUALITY" \ |
| "$CHROME_MOBILE" "$ACCEPT_WEBP_YES" "image/webp" "image/webp" \ |
| "Accept" "User-Agent" 33108 25774 33108 25774 |