Question


require 'net/http';
require 'uri';
require 'rexml/document';
require 'sqlite3';

def download_torrent(episode_id, torrent_url, limit = 10)
  # Check to make sure we haven't been trapped in an infinite loop
  if limit == 0 then
    puts "Too much redirection, skipping #{episode_id}";
    return true;
  else
    # Convert the URL of the torrent into a URI usable by Net:HTTP
    torrent_uri = URI.parse(torrent_url);
    # Open a connection to the torrent URL
    Net::HTTP.get_response(torrent_uri) { |http|
      # Check to see if we were able to connect to the torrent URL
      case http
      # We connected just fine
      when Net::HTTPSuccess then
        # Create a torrent file to store the data in
        File.open("#{episode_id}.torrent", 'wb') { |torrent_file|
          # Write the torrent data to the torrent file
          torrent_file.write(http.body);
          # Close the torrent file
          torrent_file.close
          # Check to see if we've download a 'locked' torrent file (html) instead of a regular torrent (.torrent)
          if(File.exists?('download.torrent.html'))
            # Delete the html file
            File.delete('download_torrent.html');
            return false;
          else
            return true;
          end
        }
      when Net::HTTPRedirection then
          download_torrent(episode_id, http['location'], limit - 1);
      end
    }
  end
end

Ma fonction ne retourne pas « vrai » dans le sens booléen. Il revient sans cesse <Net::HTTPFound:0x3186c60> qui provoque mon « le fait retour de la fonction véritable » conditionnelle à évaluer false. Pourquoi cette fonction ne sort pas quand il frappe la première déclaration de retour (comme toutes les autres langues que je l'ai utilisé)

Je sais que cela est tout à fait un débutant Ruby (je rimés!) Question, mais j'apprécie l'aide.

Était-ce utile?

La solution

Apparemment, Net::HTTP.get_response a passé instance de Net::HTTPFound comme paramètre de http en bloc intérieur. Par conséquent, la déclaration de return n'a jamais été atteint et votre méthode de download_torrent retourné le dernier objet « sur la pile », qui se trouve être la valeur de retour de Net::HTTP.get_response.

Si cette description est un peu vague, voici un exemple plus court. Avec une partie return true, méthode do_it retournera true. Sans elle, la méthode de do_it objecteront retour retourné par do_that.

def do_it
  do_that {|param|
#    return true;
  }
end

J'ai peu d'expérience avec le paquet de net/http, vous aurez probablement lire docs et poignée réponse Net::HTTPFound à votre opérateur case en quelque sorte.

Personnellement, cela a toujours travaillé pour moi à aller chercher le contenu de la page Web: Net::HTTP.get(URI.parse(url)). Il est plus simple sans bloc de code et renvoie simplement le contenu sous forme de chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top