Handle redirection when adding a torrent by url
This commit is contained in:
parent
a0f9689664
commit
32b41fabd6
|
@ -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
|
||||||
|
|
|
@ -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 = {}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue