2
0
Просмотр исходного кода

ZF-7092: Add a method to retrieve the client's IP address

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@16267 44c647ce-9c0f-0410-b52a-842ac1e357ba
norm2782 16 лет назад
Родитель
Сommit
680175fcec
2 измененных файлов с 75 добавлено и 21 удалено
  1. 17 0
      library/Zend/Controller/Request/Http.php
  2. 58 21
      tests/Zend/Controller/Request/HttpTest.php

+ 17 - 0
library/Zend/Controller/Request/Http.php

@@ -994,4 +994,21 @@ class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract
             return $name . ':' . $port;
         }
     }
+
+    /**
+     * Get the client's IP addres
+     *
+     * @return string
+     */
+    public function getClientIp()
+    {
+        if ($this->getServer('HTTP_CLIENT_IP') != null) {
+            $ip = $this->getServer('HTTP_CLIENT_IP');
+        } else if ($this->getServer('HTTP_X_FORWARDED_FOR') != null) {
+            $ip = $this->getServer('HTTP_X_FORWARDED_FOR');
+        } else {
+            $ip = $this->getServer('REMOTE_ADDR');
+        }
+        return $ip;
+    }
 }

+ 58 - 21
tests/Zend/Controller/Request/HttpTest.php

@@ -7,7 +7,7 @@ require_once dirname(__FILE__) . '/../../../TestHelper.php';
 
 require_once 'Zend/Controller/Request/Http.php';
 
-class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase 
+class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
 {
     /**
      * @var Zend_Controller_Request_Http
@@ -16,7 +16,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
 
     /**
      * Original $_SERVER
-     * @var array 
+     * @var array
      */
     protected $_origServer;
 
@@ -53,7 +53,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
 
         $this->_request->setControllerKey('foo');
         $this->assertEquals('foo', $this->_request->getControllerKey());
-    } 
+    }
 
     public function testSetGetActionKey()
     {
@@ -62,7 +62,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
 
         $this->_request->setActionKey('foo');
         $this->assertEquals('foo', $this->_request->getActionKey());
-    } 
+    }
 
     public function testSetGetControllerName()
     {
@@ -72,7 +72,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
         $this->_request->setControllerName('bar');
         $this->assertEquals('bar', $this->_request->getControllerName());
     }
- 
+
     public function testSetGetActionName()
     {
         $this->_request->setActionName('foo');
@@ -160,13 +160,13 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
             // success
         }
     }
- 
+
     public function testSetGetParam()
     {
         $this->_request->setParam('foo', 'bar');
         $this->assertEquals('bar', $this->_request->getParam('foo'));
     }
- 
+
     public function testSetGetParams()
     {
         $params = array(
@@ -236,7 +236,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
         $_SERVER['REQUEST_METHOD'] = 'GET';
         $this->assertEquals('GET', $this->_request->getMethod());
     }
- 
+
     public function testIsPost()
     {
         $_SERVER['REQUEST_METHOD'] = 'POST';
@@ -295,7 +295,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
         $expected = array('var1' => 'val1', 'var2' => 'val2');
         $this->assertEquals( $expected, $this->_request->getQuery());
     }
- 
+
 
     public function testGetPost()
     {
@@ -309,12 +309,12 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
         $this->assertEquals($expected, $this->_request->getPost());
 
     }
- 
+
     public function testGetPathInfo()
     {
         $this->assertEquals('/news/3', $this->_request->getPathInfo(), 'Base URL: ' . var_export($this->_request->getBaseUrl(), 1));
     }
- 
+
     public function testSetPathInfo()
     {
         $this->_request->setPathInfo('/archives/past/4');
@@ -335,25 +335,25 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
 
         $this->assertEquals('/ctrl-name/act-name', $request->getPathInfo(), "Expected $pathInfo;");
     }
- 
+
     public function testGetSetAlias()
     {
         $this->_request->setAlias('controller', 'var1');
         $this->assertEquals('var1', $this->_request->getAlias('controller'));
     }
- 
+
     public function testGetAliases()
     {
         $this->_request->setAlias('controller', 'var1');
         $this->_request->setAlias('action', 'var2');
         $this->assertSame(array('controller' => 'var1', 'action' => 'var2'), $this->_request->getAliases());
     }
- 
+
     public function testGetRequestUri()
     {
         $this->assertEquals('/news/3?var1=val1&var2=val2', $this->_request->getRequestUri());
     }
- 
+
     public function testSetRequestUri()
     {
         $this->_request->setRequestUri('/archives/past/4?set=this&unset=that');
@@ -366,7 +366,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
     {
         $this->assertSame('', $this->_request->getBaseUrl());
     }
- 
+
     /*
      * Tests if an empty string gets returned when no basepath is set on the request.
      * This is important on windows, where before this fix '\' was returned instead of an empty string.
@@ -428,7 +428,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
 
         $this->assertEquals('/index.php', $request->getBaseUrl());
     }
- 
+
     public function testSetBaseUrlAutoDiscoveryUsingXRewriteUrl()
     {
         unset($_SERVER['REQUEST_URI']);
@@ -465,7 +465,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
         $this->_request->setBasePath('/news');
         $this->assertEquals('/news', $this->_request->getBasePath());
     }
- 
+
     public function testBasePathAutoDiscovery()
     {
         $_SERVER['REQUEST_URI']     = '/html/index.php/news/3?var1=val1&var2=val2';
@@ -497,7 +497,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('foo', $this->_request->getCookie('BAR', 'foo'));
         $this->assertEquals($_COOKIE, $this->_request->getCookie());
     }
- 
+
     public function testGetServer()
     {
         if (isset($_SERVER['REQUEST_METHOD'])) {
@@ -506,7 +506,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('foo', $this->_request->getServer('BAR', 'foo'));
         $this->assertEquals($_SERVER, $this->_request->getServer());
     }
- 
+
     public function testGetEnv()
     {
         if (isset($_ENV['PATH'])) {
@@ -569,7 +569,7 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
     {
         $this->_request->setParam('controller', 'value');
         $this->_request->setAlias('var1', 'controller');
-        
+
         $this->assertEquals('value', $this->_request->getParam('controller'));
         $this->assertEquals('value', $this->_request->getParam('var1'));
     }
@@ -680,6 +680,43 @@ class Zend_Controller_Request_HttpTest extends PHPUnit_Framework_TestCase
         $test = $request->getRequestUri();
         $this->assertEquals('/foo/bar?r=https://foo.example.com:8888/bar/baz', $test);
     }
+
+    /**
+     * @group ZF-7092
+     */
+    public function testGetClientIp()
+    {
+        $request = new Zend_Controller_Request_Http();
+
+        $_SERVER['HTTP_CLIENT_IP'] = '192.168.1.10';
+        $_SERVER['HTTP_X_FORWARDED_FOR'] = '192.168.1.11';
+        $_SERVER['REMOTE_ADDR'] = '192.168.1.12';
+
+        $this->assertEquals('192.168.1.10', $request->getClientIp());
+
+        $_SERVER['HTTP_CLIENT_IP'] = '';
+        $_SERVER['HTTP_X_FORWARDED_FOR'] = '192.168.1.11';
+        $_SERVER['REMOTE_ADDR'] = '192.168.1.12';
+
+        $this->assertEquals('192.168.1.11', $request->getClientIp());
+
+        $_SERVER['HTTP_CLIENT_IP'] = '';
+        $_SERVER['HTTP_X_FORWARDED_FOR'] = '';
+        $_SERVER['REMOTE_ADDR'] = '192.168.1.12';
+
+        $this->assertEquals('192.168.1.12', $request->getClientIp());
+//    public function getClientIp()
+//{
+//   if (!empty($this->getServer('HTTP_CLIENT_IP'))) {
+//       $ip = $this->getServer('HTTP_CLIENT_IP');
+//   } else if (!empty($this->getServer('HTTP_X_FORWARDED_FOR'))) {
+//       $ip = $this->getServer('HTTP_X_FORWARDED_FOR');
+//   } else {
+//       $ip = $this->getServer('REMOTE_ADDR');
+//   }
+//   return $ip;
+//}
+    }
 }
 
 // Call Zend_Controller_Request_HttpTest::main() if this source file is executed directly.