Handle redirection when adding a torrent by url

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

View File

@ -41,6 +41,12 @@ import base64
import logging import logging
import threading import threading
import tempfile 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.httpdownloader import download_file
@ -241,9 +247,13 @@ class Core(component.Component):
return self.add_torrent_file(filename, base64.encodestring(data), options) return self.add_torrent_file(filename, base64.encodestring(data), options)
def on_download_fail(failure): 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, result = download_file(url, tempfile.mkstemp()[1], headers=headers, force_filename=True,
allow_compression=False) allow_compression=False)
result.addCallbacks(on_download_success, on_download_fail) result.addCallbacks(on_download_success, on_download_fail)
else: else:
# Log the error and pass the failure onto the client # Log the error and pass the failure onto the client

View File

@ -66,6 +66,16 @@ class CoreTestCase(unittest.TestCase):
return d 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): def test_add_torrent_url_with_partial_download(self):
url = "http://deluge-torrent.org/test_torrent.php?test=partial" url = "http://deluge-torrent.org/test_torrent.php?test=partial"
options = {} options = {}

View File

@ -43,10 +43,12 @@ import gobject
import base64 import base64
import logging import logging
import os import os
from urlparse import urljoin
import pkg_resources import pkg_resources
import twisted.web.client import twisted.web.client
import twisted.web.error
from deluge.ui.client import client from deluge.ui.client import client
from deluge.httpdownloader import download_file from deluge.httpdownloader import download_file
import deluge.component as component import deluge.component as component
@ -656,7 +658,11 @@ class AddTorrentDialog(component.Component):
dialog.destroy() dialog.destroy()
def on_download_fail(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 = 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 = download_file(url, tmp_file, on_part, allow_compression=False)
result.addCallbacks(on_download_success, on_download_fail) result.addCallbacks(on_download_success, on_download_fail)
else: else:

View File

@ -40,12 +40,14 @@ import shutil
import logging import logging
import hashlib import hashlib
import tempfile import tempfile
from urlparse import urljoin
from types import FunctionType from types import FunctionType
from twisted.internet import reactor from twisted.internet import reactor
from twisted.internet.defer import Deferred, DeferredList from twisted.internet.defer import Deferred, DeferredList
from twisted.web import http, resource, server from twisted.web import http, resource, server
import twisted.web.client import twisted.web.client
import twisted.web.error
from deluge import common, component, httpdownloader from deluge import common, component, httpdownloader
from deluge.configmanager import ConfigManager, get_config_dir from deluge.configmanager import ConfigManager, get_config_dir
@ -645,7 +647,11 @@ class WebApi(JSONComponent):
return result return result
def on_download_fail(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, result = httpdownloader.download_file(url, tmp_file, headers=headers,
allow_compression=False) allow_compression=False)
result.addCallbacks(on_download_success, on_download_fail) result.addCallbacks(on_download_success, on_download_fail)