Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send an OPTIONS request using PHP

Tags:

php

curl

Does anyone know how to send an "OPTIONS" request using PHP.

I can't find a curl setopt that does this.

I'm using php 5.6.7

I've figured out GET, POST, DELETE, and PUT. Just need OPTIONS.

I have tried hd's answer below:

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"theurl");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "OPTIONS");
$r = curl_exec($ch);
print_r($http_response_header);
curl_close($ch);

and I'm getting the error:

Undefined variable: http_response_header in C:\IIS_Emea\WebRoot\Site01\test\rest1.php on line 7

How do I get the results?

like image 849
Graham Avatar asked Dec 24 '22 06:12

Graham


2 Answers

<?php

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL => 'http://stackoverflow.com/',
    CURLOPT_CUSTOMREQUEST => 'OPTIONS',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => true,
    CURLOPT_NOBODY => true,
    CURLOPT_VERBOSE => true,
));
$r = curl_exec($ch);

echo PHP_EOL.'Response Headers:'.PHP_EOL;
print_r($r);
curl_close($ch);

What it does:

  1. CURLOPT_CUSTOMREQUEST => 'OPTIONS' - defines the HTTP request method.
  2. CURLOPT_RETURNTRANSFER => true - tell curl_exec not to output results but return them.
  3. CURLOPT_HEADER => true - return headers.
  4. CURLOPT_NOBODY => true - do not return body.
  5. CURLOPT_VERBOSE => true - just for debugging, remove it on production. It allows to see the request done by the library and the response received.

The output from the script looks like this

*   Trying 104.16.36.249...
* Connected to stackoverflow.com (104.16.36.249) port 80 (#0)
> OPTIONS / HTTP/1.1
Host: stackoverflow.com
Accept: */*

< HTTP/1.1 200 OK
< Date: Wed, 20 Apr 2016 09:02:44 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Set-Cookie: __cfduid=d96e454843a81721eeb77cc4ebb49d2c91461142964; expires=Thu, 20-Apr-17 09:02:44 GMT; path=/; domain=.stackoverflow.com; HttpOnly
< Cache-Control: public, no-cache="Set-Cookie", max-age=60
< Expires: Wed, 20 Apr 2016 09:03:44 GMT
< Last-Modified: Wed, 20 Apr 2016 09:02:44 GMT
< Vary: *
< X-Frame-Options: SAMEORIGIN
< X-Request-Guid: a2f90416-9ec1-4ec9-b2d9-a69e22cc05d5
< Set-Cookie: prov=37be6386-6390-40fb-9f0a-42efdfcf2d71; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
< Server: cloudflare-nginx
< CF-RAY: 29676b4517f92b21-WAW
< 
* Excess found in a non pipelined read: excess = 725 url = / (zero-length body)
* Connection #0 to host stackoverflow.com left intact

Response Headers:
HTTP/1.1 200 OK
Date: Wed, 20 Apr 2016 09:02:44 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=d96e454843a81721eeb77cc4ebb49d2c91461142964; expires=Thu, 20-Apr-17 09:02:44 GMT; path=/; domain=.stackoverflow.com; HttpOnly
Cache-Control: public, no-cache="Set-Cookie", max-age=60
Expires: Wed, 20 Apr 2016 09:03:44 GMT
Last-Modified: Wed, 20 Apr 2016 09:02:44 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
X-Request-Guid: a2f90416-9ec1-4ec9-b2d9-a69e22cc05d5
Set-Cookie: prov=37be6386-6390-40fb-9f0a-42efdfcf2d71; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
Server: cloudflare-nginx
CF-RAY: 29676b4517f92b21-WAW

You get response headers as a string and you need to parse it. But I guess this is out of scope of the question.

like image 102
Victor Smirnov Avatar answered Dec 26 '22 19:12

Victor Smirnov


You can use curl_setopt to set the custom request

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'OPTIONS'); // HTTP request is 'OPTIONS'
like image 32
ʰᵈˑ Avatar answered Dec 26 '22 18:12

ʰᵈˑ