HTTP-Download

M_Kay

Mitglied
Hi,

ich bin dabei mir einen kleinen Downloader zu schreiben und sitze gerade am HTTP-Download. Mein Programm soll den Download über mehrere Slots/Verbindungen ermöglichen und Mirror-Server zulassen, sodass die Datei gleichzeitig über mehrere Download-Server heruntergeladen werden kann.
Damit das ganze funktioniert muss ich vor dem Starten des Downloads prüfen, ob die jeweiligen Server das Part-weise herunterladen von Dateien unterstützen, mir also bei einer HEAD-Anfrage den PARTIAL_CONTENT-Rückgabewert liefern.
Meine Überlegung war zunächst folgende:
Code:
    public boolean isPartialDownloadSupported() {
        try {
            HttpURLConnection huc = (HttpURLConnection) this.address.openConnection();
            huc.setRequestMethod("HEAD");
            huc.setRequestProperty("Range", "bytes=0-1");
            huc.connect();
            
            if (huc.getResponseCode() == HTTP_PARTIAL_CONTENT) {
                return true;
            }
            
        } catch (IOException exc) {
            // TODO handle Exception
        }
        
        return false;
    }
Dies funktioniert in den meisten Fällen zwar, doch gibt es einige Fälle, die Probleme bereiten: Wird der DL auf einem Server bspw durch folgendes PHP-Skript gesteuert, dann liefert huc.getResponseCode() einen simplen "200 OK"-Code, wodurch erkannt wird, dass PARTIAL_CONTENT nicht unterstützt wird (soweit so gut :) ). Das Problem hierbei ist, dass zunächst die gesamte Datei übertragen wird und die Funktion an dieser Stelle hängt.

Code:
<?php
$file = "test.txt"; // file to be send to the client
$speed = 8.5; // 8,5 kb/s download rate limit

if(file_exists($file) && is_file($file)) {
    header("Cache-control: private");
    header("Content-Type: application/octet-stream");
    header("Content-Length: ".filesize($file));
    header("Content-Disposition: filename=$file");
    flush();

    $fd = fopen($file, "r");
    while(!feof($fd)) {
        echo fread($fd, round($speed*1024));
        flush();
        sleep(1);
    }
    fclose ($fd);
}
?>

Eine Möglichkeit das zu umgehen wäre nur null oder ein Byte zu laden und dann die Verbindung zu schließen, doch frage ich mich, ob es auch auf eine andere Wesie möglich ist, herauszufinden, ob der Server PARTIAL_CONTENT unterstützt.
Denn wenn ein Server die Anzahl der Verbindungsherstellungen zählt und beschränkt, ist dies nicht sinnvoll, da auf diese Weise schon Verbdinungen verschenkt werden.

Ein ähnliches Problem tritt auf, wenn ich die DL-Größe über die header herausfinden will (HEAD-Request).

Danke erstmal für 's Lesen bis hier her :) Ich hoffe mir kann jemand weiterhelfen ;)

Gruss
M_Kay
 
Zurück