链接嗅探 - http获取响应代码错误

时间:2016-12-19 21:20:33

标签: javascript json node.js http http-status-codes

我的任务是通过大约200k链接,并检查他们的响应的状态代码。除2xx以外的任何内容都意味着问题,这意味着必须手动检查链接(稍后添加到数据库)。

我从数据库获得的链接是http和https,其中一些是无效的(例如ww.fyxs.d)。我得到的格式是JSON,它就是这样的

{
    "id": xxx,
    "url": xxxx
}

我选择了一个非常简单的解决方案,但遗憾的是无法解决问题。

我从json文件中获取链接,然后从后面开始发送http / https.get请求,等待响应,检查并处理状态代码,并在删除上一个链接之后移动到下一个链接保存内存的列表。问题是我几乎一直都在使用4xx,如果我从REST客户端进行GET,我会得到200 OK。

我不知道是否可能,但我只需要正确的状态代码和我对HEAD方法不感兴趣的正文。我也尝试过 method: 'GET' - 仍然是错误的状态代码和http/https.request - 我甚至没有收到回复。

这是我的代码:

var https = require('https');
var http = require('http');
var urlMod = require('url');

var links = require('./links_to_check.json').links_to_check;

var callsRemaining = links.length;
var current = links.length - 1;

startQueue();

function startQueue(){
	getCode(links[current].url);
	current--;
}

function getCode(url){
	var urlObj = urlMod.parse(url);
	var options = {
		method: 'HEAD',
		hostName: urlObj.host,
		path: urlObj.path
	};
	var httpsIndex = url.indexOf('https');
	if(httpsIndex > -1 && httpsIndex < 5){
		https.get(options,function(response){
			proccessResponse(response.statusCode);
		}).on('error', (e) => {
			startQueue();
		});
	}else{
		if(url.indexOf('http:') < 0) return;
		http.get(options,function(response){
			proccessResponse(response.statusCode);
		}).on('error', (e) => {
			startQueue();
		});
	}
}

function proccessResponse(responseCode){	
	console.log("response => " + responseCode);
	if(responseCode != 200){
		errorCount++;
	}
	ResponseReady();
}

function ResponseReady(){
	--callsRemaining;
	if(callsRemaining <= 0){
		//Proccess error when done
	}	
	links.pop();
	startQueue();
}

我真的很感激一些帮助 - 当我们成功时,我会将其作为一个模块发布,所以如果有人需要检查一组链接,他们就可以使用它:)

在我们解决这个问题后,我考虑使用async.map并将链接拆分为块并并行运行分析,因此速度更快。用shell编写的当前进程大约需要36个小时。

0 个答案:

没有答案