From 8395dca859af7be35729e8c49c95c4d5b6966aac Mon Sep 17 00:00:00 2001
From: Michael Dowling <mtdowling@gmail.com>
Date: Mon, 11 Apr 2011 17:01:35 -0500
Subject: [PATCH] [Http] Ensuring that cloned requests will attach observers to
 the cloned request using the same priority as the original request for each
 event observer.

---
 src/Guzzle/Http/Message/Request.php             | 6 +++++-
 tests/Guzzle/Tests/Http/Message/RequestTest.php | 3 ++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/Guzzle/Http/Message/Request.php b/src/Guzzle/Http/Message/Request.php
index d9b8a13f..be19ab0b 100644
--- a/src/Guzzle/Http/Message/Request.php
+++ b/src/Guzzle/Http/Message/Request.php
@@ -165,7 +165,11 @@ class Request extends AbstractMessage implements RequestInterface
      */
     public function __clone()
     {
-        $this->eventManager = new EventManager($this, $this->eventManager->getAttached());
+        $eventManager = new EventManager($this);
+        foreach ($this->eventManager->getAttached() as $o) {
+            $eventManager->attach($o, $this->eventManager->getPriority($o));
+        }
+        $this->eventManager = $eventManager;
         $this->curlOptions = clone $this->curlOptions;
         $this->headers = clone $this->headers;
         $this->params = clone $this->params;
diff --git a/tests/Guzzle/Tests/Http/Message/RequestTest.php b/tests/Guzzle/Tests/Http/Message/RequestTest.php
index b8e7a102..058f0f70 100644
--- a/tests/Guzzle/Tests/Http/Message/RequestTest.php
+++ b/tests/Guzzle/Tests/Http/Message/RequestTest.php
@@ -495,7 +495,7 @@ class RequestTest extends \Guzzle\Tests\GuzzleTestCase
     public function testClonedRequestsUseNewInternalState()
     {
         $p = new ExponentialBackoffPlugin();
-        $this->request->getEventManager()->attach($p);
+        $this->request->getEventManager()->attach($p, 100);
 
         $r = clone $this->request;
 
@@ -508,6 +508,7 @@ class RequestTest extends \Guzzle\Tests\GuzzleTestCase
         $this->assertNull($r->getParams()->get('queued_response'));
 
         $this->assertTrue($this->request->getEventManager()->hasObserver($p));
+        $this->assertEquals(100, $r->getEventManager()->getPriority($p));
         $this->assertTrue($r->getEventManager()->hasObserver($p));
     }