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 threading
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
@ -241,9 +247,13 @@ 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)
allow_compression=False)
result.addCallbacks(on_download_success, on_download_fail)
else:
# Log the error and pass the failure onto the client

View File

@ -66,6 +66,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 = {}

View File

@ -43,10 +43,12 @@ import gobject
import base64
import logging
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
@ -656,7 +658,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)