Handle redirection when adding a torrent by url

This commit is contained in:
John Garland 2011-03-09 00:37:35 +11:00
parent fd458fbe64
commit 292ffb35ac
4 changed files with 32 additions and 4 deletions

View File

@ -43,11 +43,13 @@ import threading
import pkg_resources
import warnings
import tempfile
from urlparse import urljoin
from twisted.internet import reactor, defer
from twisted.internet.task import LoopingCall
import twisted.web.client
import twisted.web.error
from deluge.httpdownloader import download_file
from deluge.log import LOG as log
@ -249,7 +251,11 @@ class Core(component.Component):
return self.add_torrent_file(filename, base64.encodestring(data), options)
def on_download_fail(failure):
if failure.check(twisted.web.client.PartialDownloadError):
if failure.check(twisted.web.error.PageRedirect):
new_url = urljoin(url, failure.getErrorMessage().split(" to ")[1])
result = download_file(new_url, tempfile.mkstemp()[1], headers=headers, force_filename=True)
result.addCallbacks(on_download_success, on_download_fail)
elif failure.check(twisted.web.client.PartialDownloadError):
result = download_file(url, tempfile.mkstemp()[1], headers=headers, force_filename=True,
allow_compression=False)
result.addCallbacks(on_download_success, on_download_fail)

View File

@ -41,10 +41,12 @@ import gettext
import gobject
import base64
import os
from urlparse import urljoin
import pkg_resources
import twisted.web.client
import twisted.web.error
from deluge.ui.client import client
from deluge.httpdownloader import download_file
import deluge.component as component
@ -653,7 +655,11 @@ class AddTorrentDialog(component.Component):
dialog.destroy()
def on_download_fail(result):
if result.check(twisted.web.client.PartialDownloadError):
if result.check(twisted.web.error.PageRedirect):
new_url = urljoin(url, result.getErrorMessage().split(" to ")[1])
result = download_file(new_url, tmp_file, on_part)
result.addCallbacks(on_download_success, on_download_fail)
elif result.check(twisted.web.client.PartialDownloadError):
result = download_file(url, tmp_file, on_part, allow_compression=False)
result.addCallbacks(on_download_success, on_download_fail)
else:

View File

@ -40,12 +40,14 @@ import shutil
import logging
import hashlib
import tempfile
from urlparse import urljoin
from types import FunctionType
from twisted.internet import reactor
from twisted.internet.defer import Deferred, DeferredList
from twisted.web import http, resource, server
import twisted.web.client
import twisted.web.error
from deluge import common, component, httpdownloader
from deluge.configmanager import ConfigManager, get_config_dir
@ -645,7 +647,11 @@ class WebApi(JSONComponent):
return result
def on_download_fail(result):
if result.check(twisted.web.client.PartialDownloadError):
if result.check(twisted.web.error.PageRedirect):
new_url = urljoin(url, result.getErrorMessage().split(" to ")[1])
result = httpdownloader.download_file(new_url, tmp_file, headers=headers)
result.addCallbacks(on_download_success, on_download_fail)
elif result.check(twisted.web.client.PartialDownloadError):
result = httpdownloader.download_file(url, tmp_file, headers=headers,
allow_compression=False)
result.addCallbacks(on_download_success, on_download_fail)

View File

@ -65,6 +65,16 @@ class CoreTestCase(unittest.TestCase):
return d
def test_add_torrent_url_with_redirect(self):
url = "http://deluge-torrent.org/test_torrent.php?test=redirect"
options = {}
info_hash = "60d5d82328b4547511fdeac9bf4d0112daa0ce00"
d = self.core.add_torrent_url(url, options)
d.addCallback(self.assertEquals, info_hash)
return d
def test_add_torrent_url_with_partial_download(self):
url = "http://deluge-torrent.org/test_torrent.php?test=partial"
options = {}