Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/Curl/Curl.php
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,8 @@ protected function setHttpAuth($httpauth)
*/
public function get($url, $data = array())
{
$this->setOpt(CURLOPT_CUSTOMREQUEST, "GET");
$this->setOpt(CURLOPT_CUSTOMREQUEST, null);
$this->setOpt(CURLOPT_POSTFIELDS, null);
if (count($data) > 0) {
$this->setOpt(CURLOPT_URL, $url.'?'.http_build_query($data));
} else {
Expand Down Expand Up @@ -338,7 +339,7 @@ public function purge($url, $hostName = null)
*/
public function post($url, $data = array(), $asJson = false)
{
$this->setOpt(CURLOPT_CUSTOMREQUEST, "POST");
$this->setOpt(CURLOPT_CUSTOMREQUEST, null);
$this->setOpt(CURLOPT_URL, $url);
if ($asJson) {
$this->prepareJsonPayload($data);
Expand Down
99 changes: 99 additions & 0 deletions tests/SequentialRequestsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
<?php

namespace Curl;

use Yoast\PHPUnitPolyfills\TestCases\TestCase;

/**
* Test sequential requests using the same Curl object instance
* to ensure options are properly reset between requests.
*
* This test addresses the issue where CURLOPT_CUSTOMREQUEST and
* related options are not cleared after PUT/PATCH/DELETE requests,
* causing subsequent GET requests to fail.
*/
class SequentialRequestsTest extends TestCase
{
const TEST_URL = 'http://localhost:1234';

/**
* @var Curl
*/
protected $curl;

public function set_up()
{
parent::set_up();
$this->curl = new Curl();
$this->curl->setOpt(CURLOPT_SSL_VERIFYPEER, false);
$this->curl->setOpt(CURLOPT_SSL_VERIFYHOST, false);
}

/**
* Test that GET works correctly after a PUT request
*/
public function testGetAfterPut()
{
// First, make a PUT request with payload
$this->curl->put(self::TEST_URL . '/server.php', ['test' => 'put', 'key' => 'test'], true);
$this->assertTrue($this->curl->isSuccess(), 'PUT request should succeed');

// Then, make a GET request
$this->curl->get(self::TEST_URL . '/server.php', ['test' => 'server', 'key' => 'REQUEST_METHOD']);
$this->assertTrue($this->curl->isSuccess(), 'GET request after PUT should succeed');
$this->assertEquals('GET', $this->curl->response, 'Request method should be GET, not PUT');
}

/**
* Test that GET works correctly after a DELETE request
*/
public function testGetAfterDelete()
{
// First, make a DELETE request with payload
$this->curl->delete(self::TEST_URL . '/server.php', ['test' => 'delete', 'key' => 'test'], true);
$this->assertTrue($this->curl->isSuccess(), 'DELETE request should succeed');

// Then, make a GET request
$this->curl->get(self::TEST_URL . '/server.php', ['test' => 'server', 'key' => 'REQUEST_METHOD']);
$this->assertTrue($this->curl->isSuccess(), 'GET request after DELETE should succeed');
$this->assertEquals('GET', $this->curl->response, 'Request method should be GET, not DELETE');
}

/**
* Test that GET works correctly after a PATCH request
*/
public function testGetAfterPatch()
{
// First, make a PATCH request with payload
$this->curl->patch(self::TEST_URL . '/server.php', ['test' => 'patch', 'key' => 'test'], true);
$this->assertTrue($this->curl->isSuccess(), 'PATCH request should succeed');

// Then, make a GET request
$this->curl->get(self::TEST_URL . '/server.php', ['test' => 'server', 'key' => 'REQUEST_METHOD']);
$this->assertTrue($this->curl->isSuccess(), 'GET request after PATCH should succeed');
$this->assertEquals('GET', $this->curl->response, 'Request method should be GET, not PATCH');
}

/**
* Test that POST works correctly after a PUT request
*/
public function testPostAfterPut()
{
// First, make a PUT request with payload
$this->curl->put(self::TEST_URL . '/server.php', ['test' => 'put', 'key' => 'test'], true);
$this->assertTrue($this->curl->isSuccess(), 'PUT request should succeed');

// Then, make a POST request
$this->curl->post(self::TEST_URL . '/server.php', ['test' => 'server', 'key' => 'REQUEST_METHOD']);
$this->assertTrue($this->curl->isSuccess(), 'POST request after PUT should succeed');
$this->assertEquals('POST', $this->curl->response, 'Request method should be POST, not PUT');
}

public function tear_down()
{
if ($this->curl) {
$this->curl->close();
}
parent::tear_down();
}
}