129 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			129 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/usr/bin/env bash | ||
|  | 
 | ||
|  | # Test if HTTP compression (RFC 2616 + SDCH) is enabled for a given URL | ||
|  | # https://github.com/mathiasbynens/dotfiles/blob/master/bin/httpcompression | ||
|  | 
 | ||
|  | declare -r hUA="Mozilla/5.0 Gecko" | ||
|  | declare -r hAE="Accept-Encoding: gzip, deflate, sdch" | ||
|  | declare -r maxConTime=15 | ||
|  | declare -r maxTime=30 | ||
|  | 
 | ||
|  | declare availDicts="" dict="" dictClientID="" dicts="" headers="" i="" \ | ||
|  |         indent="" url="" encoding="" urlHeaders="" | ||
|  | 
 | ||
|  | headers="$( curl --connect-timeout $maxConTime \ | ||
|  |                  -A "$hUA"    `# Send a fake UA string for sites | ||
|  |                                # that sniff it instead of using | ||
|  |                                # the Accept-Encoding header` \ | ||
|  |                  -D -         `# Get response headers` \ | ||
|  |                  -H "$hAE"     \ | ||
|  |                  -L           `# If the page was moved to a different | ||
|  |                                # location, redo the request` \ | ||
|  |                  -m $maxTime   \ | ||
|  |                  -s           `# Don\'t show the progress meter` \ | ||
|  |                  -S           `# Show error messages` \ | ||
|  |                  -o /dev/null `# Ignore content` \ | ||
|  |                  "$1" )" \ | ||
|  | && ( \ | ||
|  | 
 | ||
|  | 	url="$1" | ||
|  | 
 | ||
|  | 	# Iterate over the headers of all redirects | ||
|  | 	while [ -n "$headers" ]; do | ||
|  | 
 | ||
|  | 		# Get headers for the "current" URL | ||
|  | 		urlHeaders="$( printf "%s" "$headers" | | ||
|  | 		               sed -n '1,/^HTTP/p' )" | ||
|  | 
 | ||
|  | 		# Remove the headers for the "current" URL | ||
|  | 		headers="${headers/"$urlHeaders"/}" | ||
|  | 
 | ||
|  | 		# ---------------------------------------------------------------------- | ||
|  | 		# | SDCH                                                               | | ||
|  | 		# ---------------------------------------------------------------------- | ||
|  | 
 | ||
|  | 		# SDCH Specification: | ||
|  | 		# - www.blogs.zeenor.com/wp-content/uploads/2011/01/Shared_Dictionary_Compression_over_HTTP.pdf | ||
|  | 
 | ||
|  | 		# Check if the server advertised any dictionaries | ||
|  | 		dicts="$( printf "%s" "$urlHeaders" | | ||
|  | 		          grep -i 'Get-Dictionary:' | | ||
|  | 		          cut -d':' -f2 | | ||
|  | 		          sed s/,/\ /g )" | ||
|  | 
 | ||
|  | 		if [ -n "$dicts" ]; then | ||
|  | 
 | ||
|  | 			availDicts="" | ||
|  | 			dict="" | ||
|  | 
 | ||
|  | 			for i in $dicts; do | ||
|  | 
 | ||
|  | 				# Check If the dictionary location is specified as a path, | ||
|  | 				# and if so, construct it's URL from the host name of the | ||
|  | 				# referrer URL | ||
|  | 				[[ "$i" != http* ]] \ | ||
|  | 				    && dict="$(printf "$url" | | ||
|  | 				               sed -En 's/([^/]*\/\/)?([^/]*)\/?.*/\1\2/p')" | ||
|  | 
 | ||
|  | 				dict="$dict$i" | ||
|  | 
 | ||
|  | 				# Request the dictionaries from the server and | ||
|  | 				# construct the `Avail-Dictionary` header value | ||
|  | 				# | ||
|  | 				# [ The user agent identifier for a dictionary is defined | ||
|  | 				#   as the URL-safe base64 encoding (as described in RFC | ||
|  | 				#   3548, section 4 [RFC3548]) of the first 48 bits (bits | ||
|  | 				#   0..47) of the dictionary's SHA-256 digest ] | ||
|  | 				# | ||
|  | 				dictClientID="$( curl --connect-timeout $maxConTime \ | ||
|  | 				                      -A "$hUA" -LsS -m $maxTime "$dict" | | ||
|  | 				                 openssl dgst -sha256 -binary | | ||
|  | 				                 openssl base64 | | ||
|  | 				                 cut -c 1-8 | | ||
|  | 				                 sed -e 's/\+/-/' -e 's/\//_/' )" | ||
|  | 
 | ||
|  | 				[ -n $availDicts ] && availDicts="$adics,$dictClientID" \ | ||
|  | 				                   || availDicts="$dictClientID" | ||
|  | 
 | ||
|  | 			done | ||
|  | 
 | ||
|  | 			# Redo the request (advertising the available dictionaries) | ||
|  | 			# and replace the old resulted headers with the new ones | ||
|  | 			urlHeaders="$( curl --connect-timeout $maxConTime \ | ||
|  | 			                    -A "$hUA" -D - -H "$hAE" \ | ||
|  | 			                    -H "Avail-Dictionary: $availDicts" \ | ||
|  | 			                    -m $maxTime -o /dev/null -sS "$1" )" | ||
|  | 		fi | ||
|  | 
 | ||
|  | 		# ---------------------------------------------------------------------- | ||
|  | 
 | ||
|  | 		# Get the content encoding header values | ||
|  | 		encoding="$( printf "%s" "$urlHeaders" | | ||
|  | 		             grep -i 'Content-Encoding:' | | ||
|  | 		             cut -d' ' -f2 | | ||
|  | 		             tr "\r" "," | | ||
|  | 		             tr -d "\n" | | ||
|  | 		             sed 's/,$//' )" | ||
|  | 
 | ||
|  | 		[ -n "$encoding" ] && encoding="[$encoding]" | ||
|  | 
 | ||
|  | 		# Print the output for the "current" URL | ||
|  | 		if [ "$url" != "$1" ]; then | ||
|  | 			printf "%s\n" "$indent$url $encoding" | ||
|  | 			indent="  "$indent | ||
|  | 		else | ||
|  | 			printf "\n%s\n" " $1 $encoding" | ||
|  | 			indent=" ↳" | ||
|  | 		fi | ||
|  | 
 | ||
|  | 		# Get the next URL value | ||
|  | 		url="$( printf "%s" "$urlHeaders" | | ||
|  | 		        grep -i 'Location' | | ||
|  | 		        sed -e 's/Location://' | | ||
|  | 		        tr -d '\r' )" | ||
|  | 
 | ||
|  | 	done | ||
|  | 	printf "\n" | ||
|  | 
 | ||
|  | ) || printf "" |