ソースを参照

allow FileDownloader to use username:password@ info when downloading through https?

Jan Prieser 11 年 前
コミット
cc1e10e8ae

+ 6 - 0
src/Composer/Util/RemoteFilesystem.php

@@ -99,7 +99,13 @@ class RemoteFilesystem
         $this->progress = $progress;
         $this->progress = $progress;
         $this->lastProgress = null;
         $this->lastProgress = null;
 
 
+        // capture username/password from URL if there is one
+        if (preg_match('{^https?://(.+):(.+)@([^/]+)}i', $fileUrl, $match)) {
+            $this->io->setAuthentication($originUrl, urldecode($match[1]), urldecode($match[2]));
+        }
+
         $options = $this->getOptionsForUrl($originUrl, $additionalOptions);
         $options = $this->getOptionsForUrl($originUrl, $additionalOptions);
+
         if ($this->io->isDebug()) {
         if ($this->io->isDebug()) {
             $this->io->write('Downloading '.$fileUrl);
             $this->io->write('Downloading '.$fileUrl);
         }
         }

+ 14 - 0
tests/Composer/Test/Util/RemoteFilesystemTest.php

@@ -13,6 +13,7 @@
 namespace Composer\Test\Util;
 namespace Composer\Test\Util;
 
 
 use Composer\Util\RemoteFilesystem;
 use Composer\Util\RemoteFilesystem;
+use Installer\Exception;
 
 
 class RemoteFilesystemTest extends \PHPUnit_Framework_TestCase
 class RemoteFilesystemTest extends \PHPUnit_Framework_TestCase
 {
 {
@@ -143,6 +144,19 @@ class RemoteFilesystemTest extends \PHPUnit_Framework_TestCase
         }
         }
     }
     }
 
 
+
+    public function testCaptureAuthenticationParamsFromUrl()
+    {
+        $io = $this->getMock('Composer\IO\IOInterface');
+        $io
+        ->expects($this->once())
+        ->method('setAuthentication')
+        ;
+
+        $fs = new RemoteFilesystem($io);
+        $fs->getContents('example.com', 'http://user:pass@www.example.com/something');
+    }
+
     public function testGetContents()
     public function testGetContents()
     {
     {
         $fs = new RemoteFilesystem($this->getMock('Composer\IO\IOInterface'));
         $fs = new RemoteFilesystem($this->getMock('Composer\IO\IOInterface'));