protocol_fetch() {
	local url file RETVAL i j options
	url="$1"
	file="$2"
	options=

	wget404() {
	# see README.wget404 in the debian-installer-utils udeb source for more info about this
		if [ "ftp" = "$proto" ] ; then
			local file_not_found_pattern='bad response to RETR: 550 \|^No such file '
		else
			local file_not_found_pattern='server returned error: HTTP\/[0-9.]\+ 404 \| ERROR 404: '
		fi

		local RETVAL=$( {
			echo 1
			wget "$@" 2>&1 >&3 && echo %OK%
			echo %EOF%
			} | ( sed -ne '1{h;d};/'"$file_not_found_pattern"'/{p;s/.*/4/;h;d};/^%OK%$/{s/.*/0/;h;d};$!p;$x;$w /dev/fd/4' >&2 ) 4>&1
		) 3>&1
		return $RETVAL
	}

	# use the proxy for wgets (should speed things up)
	if db_get mirror/$proto/proxy; then
		export ${proto}_proxy="$RET"
	fi

	if wget --version 2>/dev/null | grep -q 'GNU Wget'; then
		options=--no-verbose
		if [ "https" = "$proto" ] && \
		   db_get debian-installer/allow_unauthenticated_ssl && [ "$RET" = true ]; then
			options="$options --no-check-certificate"
		fi
	else
		if [ "https" = "$proto" ]; then
			echo "busybox wget does not support https" >&2
			return 1
		fi
		options=-q
	fi
	options="$options -U debian-installer"
	RETVAL=0
	for i in 1 2; do
		wget404 $options -O "$file" "$url" || RETVAL=$?
		[ $RETVAL = 1 ] || return $RETVAL

		if [ "$TRY_CONTINUE" ] && [ -s "$file" ]; then
			for j in 1 2 3; do
				wget404 -c $options "$url" -O "$file" || RETVAL=$?
				[ $RETVAL = 1 ] || return $RETVAL
			done
		fi
		[ "$TRY_REPEAT" ] || break
	done
	return $RETVAL
}
