По-видимому, запрос HEAD относится к передающему ресурсу, а не только к заголовкам. - PullRequest
3 голосов
/ 17 января 2011

Похоже, что HEAD запросы, которые я отправляю с помощью метода $.ajax({...}); jQuery, возвращают содержимое данного ресурса (по крайней мере, в Firefox ... IE работает нормально), а не только заголовки.Я пытаюсь захватить только свойство заголовка Content-Length для использования в предзагрузчике изображений, хотя кажется, что, просто запросив Content-Length, он загружает сам контент.

Порядок работыздесь:

  • Найти все элементы на данной странице с помощью CSS background-image и заполнить массив (imageTemp) URL-адресами.
  • Для каждого URL-адреса изображения:выполнить запрос Ajax HEAD, чтобы получить Content-Length и добавить его к bytesTotal, а также заполнить массив (imageData) как URL-адресом, так и Content-Length этого изображения.
    • Одновременно запустите обработчик события setInterval, чтобы периодически проверять, были ли выполнены все запросы Ajax HEAD.
  • Когда запросы HEADзавершите, начните загрузку изображений в Image() объекты из imageData, добавив соответствующее значение Content-Length к значению bytesLoaded. \
  • Когда загрузка bytesLoaded == bytesTotal завершится, ипредварительный загрузчик завершен.

Вот мой сценарий на данный момент:

(function($){

    var callbacks = {
        initiate: function(){},
        progress: function(percent){},
        complete: function(){},
    };

    var imageTemp = Array();
    var imageData = Array();
    var imageCurrent = null;
    var intervalId = 0;
    var bytesLoaded = 0;
    var bytesTotal = 0;

    $.preloader = function(arguments){

        for(var arg in arguments){
            callbacks[arg] = arguments[arg];
        }

        callbacks.initiate();
        $('*')
            .each(function(index){
                if($(this).css('background-image') != 'none'){
                    imageTemp.push($(this).css('background-image').slice(5, -2));
                }
            });

        intervalId = window.setInterval(function(e){

            if(imageData.length == imageTemp.length){
                window.clearInterval(intervalId);

                for(var i = 0; i < imageData.length; i++){

                    (function(imageIndex){
                        currentImage = new Image();
                        currentImage.src = imageData[imageIndex][0];
                        currentImage.onload = function(e){
                            bytesLoaded += parseInt(imageData[imageIndex][1]);
                            callbacks.progress(bytesLoaded/bytesTotal);
                            if(bytesLoaded >= bytesTotal){
                                callbacks.complete();
                            }
                        };
                    })(i);

                }

            }

        }, 1);

        for(var i = 0; i < imageTemp.length; i++){
            (function(i){
                $.ajax({
                    type: "HEAD",
                    async: true,
                    url: imageTemp[i],
                    success: function(message, text, response){
                        var bytes = parseInt(response.getResponseHeader('Content-Length'));
                        bytesTotal += bytes;
                        imageData.push([imageTemp[i], bytes]);
                    },
                });
            })(i);
        }

    };

})(jQuery);

Это напрямую связано с моим вопросом на запрос Ajax HEAD через Javascript / jQuery , но это, конечно, не дубликат, поскольку проблема вышла из ранее решенного вопроса.

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Я рекомендую вам настроить Fiddler (или какой-либо другой анализатор HTTP-пакетов) и посмотреть, что на самом деле происходит по проводам - ​​точные отправленные запросы и точный полученный ответ.Это поможет вам выяснить, есть ли проблема на сервере или на клиенте.

1 голос
/ 18 января 2011

Ну, это выглядит странно.Это «должно» работать.

Я не могу точно сказать, что это проблема, но, возможно, это так, я здесь:

Если вы делаете запрос HEAD, сам сервер не должен отправлять вам большечем данные головы.Почти каждый веб-сервер, который вы можете получить, соблюдает это.

Таким образом, вероятность проблемы с сервером маловероятна.Однако это возможно, в зависимости от запущенного приложения.

Но я часто сталкивался с этой проблемой во многих средах сканирования и всего прочего, и очень распространенной причиной сбоев были перенаправления.

Многие внутренние библиотеки следуют за перенаправлениями (как и должны), но «забывают» о запросе HEAD.

Однажды я посмотрел RFC, но не мог понять, что именно нужно сделать на этом этапе.

Но очень строго интерпретированный запрос HEAD должен давать вам заголовок Location.

Но большинство "пользователей", вероятно, ожидают данные заголовка того, что находится за перенаправлением.

ДляПример Zend ZF имеет эту проблему до сегодняшнего дня.scrapy исправил его в более позднем выпуске.

Извините, я не могу дать вам лучший ответ, но ваш код выглядит корректно в отношении этой проблемы, так что это некоторая отладка проб и ошибок ...

...