blob: d02529d993bfff74299a0d2ce4cc8403719e9db0 [file] [log] [blame]
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