2016-09-26 2 views
0

J'ai essayé de construire un robot d'indexation Web qui génère des sommes de contrôle des fichiers qu'il rencontre. Je ne veux pas générer de sommes de contrôle pour les flux infinis (radio Internet, flux vidéo en direct, etc.), car cela bloquerait le robot d'exploration et provoquerait un manque de mémoire. Par conséquent, j'ai besoin d'un moyen de les filtrer. J'ai essayé de vérifier si content-length a été défini sur -1, car les flux de diffusion ne signalent pas la longueur du contenu, mais ont constaté que de nombreux autres serveurs choisissent de ne pas signaler une longueur de contenu sur leurs documents ou utilisent des téléchargements progressifs sans rapport. une longueur de contenu. Ma solution actuelle vérifie si le content-type est video/* ou audio/* et content-length est -1, mais cela a le potentiel de jeter progressivement les fichiers multimédias téléchargés qui ne sont pas d'une longueur infinie.Test de longueur de contenu infinie

Y at-il un moyen facile de tester si un flux est infiniment long sans avoir recours à vérifier s'il dépasse une valeur arbitraire? Mon langage pour ce projet est Java avec JSoup, si c'est important.

+0

Pas trop sûr, mais quand il y a une réponse en streaming - vous ne recevez pas la fin de la réponse, ils vous envoient simplement les données, de sorte que le même objet de réponse peut être utilisé pour envoyer d'autres données en continu. Vous pouvez essayer de vérifier, si la réponse est terminée ce qui devrait être vrai dans le cas d'un média de longueur finie – prabodhprakash

+0

@prabodhprakash Pardonnez-moi si je ne comprends pas cela, mais si les données continuent de venir (comme dans un flux infini), comment vais-je sais que ça ne va pas finir? – ndm13

Répondre

1

est-il un moyen facile de tester si un cours d'eau est infiniment longue sans avoir recours à vérifier si elle dépasse une valeur arbitraire?

Il n'y a aucun moyen simple ni difficile de dire avec certitude combien d'octets peuvent être lus à partir d'un flux arbitraire avant que sa fin soit atteinte. En effet, même si un serveur web envoie un en-tête de réponse indiquant une longueur de contenu particulière, cela ne garantit pas qu'il n'enverra pas plus de contenu que celui annoncé, ni même que le contenu est fini.

Même si vous utilisez des heuristiques comme celles que vous décrivez, vous devez être prêt à couper le contenu s'il est plus long que ce que vous êtes prêt à accepter.

+0

Donc, votre suggestion est alors de lire continuellement l'entrée jusqu'à ce que je frappe un tampon arbitraire, en supposant qu'il répond aux caractéristiques de la transmission de données ('transfer-encoding: chunked; content-length: -1')? Ou je ne devrais pas faire confiance au serveur pour tout transfert et lancer des heuristiques par la fenêtre? – ndm13

+1

@ ndm13 Je ne vois pas pourquoi vous ne devriez pas appliquer l'heuristique pour éviter de télécharger des ressources marquées comme étant infinies/trop grandes. Vous ne pouvez pas compter * exclusivement * sur cela - vous devez être prêt à reconnaître et annuler le transfert de * toute * ressource qui s'avère trop longue. Et cela ne devrait pas être un gros problème, car il rend probablement votre code un peu plus simple (par opposition à l'application d'un tel traitement uniquement à certaines ressources). –

1

Si Content-Length n'est pas présent en réponse vous pourriez supposer son flux si vous voyez:

Transfer-Encoding: chunked 

https://en.wikipedia.org/wiki/Chunked_transfer_encoding

+0

Merci pour cet en-tête; Je peux l'utiliser dans le cadre des heuristiques susmentionnées. Cependant, le codage fragmenté n'est pas inhérent aux flux infinis; le crawler pourrait tout aussi bien atteindre un téléchargement progressif qui utilise un codage en morceau sans longueur (particulièrement commun pour les «URL virtuelles»). – ndm13