Demande Curl avec digest authentification en PHP pour télécharger Bitbucket repository privé

j'essaie de faire cette demande sur php, pour télécharger la dernière source de mon dépôt privé Bitbucket:

curl --digest --user user:pass https://bitbucket.org/user/repo/get/tip.zip -o test.zip

en ligne de commande son ok, le téléchargement de fichier parfait, mais en php ne fonctionne pas, ce mon code php:

$out = fopen('test.zip', 'w+');
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_USERPWD, 'user:pass');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FILE, $out);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_URL, 'https://bitbucket.org/user/repo/get/tip.zip');
curl_exec($ch);

C'est la réponse, le login son invalide et le serveur redirigent vers la page de login:

Error CURL: '' 
Error number: 0
Array
(
    [url] => https://bitbucket.org/account/signin/?next=/user/repo/get/tip.tar.gz
    [content_type] => text/html; charset=utf-8
    [http_code] => 200
    [header_size] => 1099
    [request_size] => 194
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 1
    [total_time] => 1.055465
    [namelookup_time] => 1.5E-5
    [connect_time] => 0.102969
    [pretransfer_time] => 0.216164
    [size_upload] => 0
    [size_download] => 10049
    [speed_download] => 9520
    [speed_upload] => 0
    [download_content_length] => 10049
    [upload_content_length] => 0
    [starttransfer_time] => 0.527512
    [redirect_time] => 0.527519
    [redirect_url] => 
)

quelqu'un sait comment je peux résoudre mon problème? Merci beaucoup!!!

11
demandé sur Guillermo GF 2012-04-25 20:03:25

3 réponses

ce code a bien fonctionné pour moi:

define('USERNAME','username');
define('PASSWORD','password');

function download($url, $destination) {
    try {
        $fp = fopen($destination, "w");
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        curl_setopt($ch, CURLOPT_USERPWD, USERNAME . ":" . PASSWORD);
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        $resp = curl_exec($ch);

        // validate CURL status
        if(curl_errno($ch))
            throw new Exception(curl_error($ch), 500);

        // validate HTTP status code (user/password credential issues)
        $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($status_code != 200)
            throw new Exception("Response with Status Code [" . $status_code . "].", 500);
    }
    catch(Exception $ex) {
        if ($ch != null) curl_close($ch);
        if ($fp != null) fclose($fp);
        throw new Exception('Unable to properly download file from url=[' + $url + '] to path [' + $destination + '].', 500, $ex);
    }
    if ($ch != null) curl_close($ch);
    if ($fp != null) fclose($fp);
}

download('https://bitbucket.org/brunobraga/playground/get/tip.tar.gz', '/tmp/test.tar.gz');
8
répondu bruno.braga 2013-04-17 02:04:27

je lui ai donné la coutume" 20 minutes tinker " et je serai damné, travailler avec CURL et mon client HTTP OSX cela ne semble pas vouloir bouger, et j'ai travaillé avec succès avec HTTP Digest et Curl dans le passé.

Une suggestion: si la ligne de commande fonctionne alors pourquoi ne pas utiliser la commande? Votre serveur de production supporte-t-il exec() ?

1
répondu Phil Sturgeon 2012-05-13 18:35:43

j'ai eu le même problème; j'ai supprimé tous les caractères non alphanumériques du mot de passe et ça a marché! Je ne sais pas pourquoi.

j'espère que ça aidera.

1
répondu Edi Budimilic 2012-08-15 11:57:58