Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > Общие вопросы Web
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2013, 12:05   #1
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию Загрузка стороннего ресурса, node.js

Приветствую, комрады по ту сторону браузера. По всей видимости, не хватает мне скила в области http, чтобы найти ошибку.
Собственно, по адресу нужно получить контент страницы.
Иногда работает, иногда — нет. Грешил на 304, но она ниразу не вызывалась. Страницы, которые виснут, возвращают 200 статус, но при этом не отдают боди запроса, в итоге кол-бэк не вызывается (а пару раз вызывался, не передавая параметров, как это произошло, я ваще не вкурил О_о).
Ах, да, параллельно в скрипте вызывается по 1-200 запросов, для каждой ссылке на каждой полученной этим добром странице (без повторений, ес-но, бесконечная рекурсия исключена)
В тщетных попытках это сделать код оброс некоторыми костылями и говнецом, просьба пальцем не показывать и не смеяться над беспомощностью до мозга костей фронтендера

Код:
var http = require('http');
var URL = require('url');
var qs = require('querystring');

function load( url, cb, times ) { 

  var times = times||2;
  var timeout = setTimeout(function() {
    if (times) {
      times-=1;
      clearTimeout( timeout );
      load( url, cb, times );
      console.log('timeout, reload '+url+', times='+times);
    } else {
      console.log('timeout, '+url+', break');
      cb('timeout', {url: url});
    }
  }, 5000);

  var request = http.request( url );

  request.addListener('response', function( response ){
    var data = '';
    console.log( response.statusCode, url );

    if ( Math.floor(response.statusCode / 100) === 3 ) {
      if (response.statusCode === 304) {
        // not modified
      } else {
        // redirect
        var _url = response.headers.location;
        if ( URL.parse( _url ).protocol === 'http:' ) {
          load( _url , cb);
        } else {
          cb( URL.parse( _url ).protocol );
        };
        clearTimeout( timeout );
        return;
      }
    };

    if (! /html/.test(response.headers['content-type'])){
      cb(response.headers['content-type']);
      clearTimeout( timeout );
      return;
    };

    response.addListener('data', function( chunk ){
      data += chunk;
    });
    response.addListener('end', function(){
      clearTimeout( timeout );
      cb( null, {
        url: url,
        html: data
      });
    });
  });
  request.end();
}


module.exports.load = load;
а, вопрос... почему оно может стартовать, но не завершаться нормально?
Alar, верни репу!
Naive вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка ресурса в RichEdit Volkogriz Общие вопросы Delphi 3 05.06.2014 08:57
загрузка в Image JPEG-файл из ресурса casio23 Мультимедиа в Delphi 1 10.02.2012 02:23
Проблема с Node Indent kettanaito Общие вопросы Delphi 3 05.12.2011 01:44
loadimage и загрузка изображение из ресурса fate Общие вопросы Delphi 11 10.08.2011 10:47
Получить информацию со стороннего ресурса Linel PHP 6 30.10.2010 18:13