Skip to content

Commit

Permalink
Added tests for new options
Browse files Browse the repository at this point in the history
  • Loading branch information
mt-omarov committed Dec 19, 2023
1 parent a91c7d0 commit f9dcbf0
Show file tree
Hide file tree
Showing 6 changed files with 297 additions and 175 deletions.
40 changes: 25 additions & 15 deletions builtin-functions/_functions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1299,7 +1299,7 @@ define('CURLOPT_PROXY_SSL_VERIFYPEER', 200147);
define('CURLOPT_SUPPRESS_CONNECT_HEADERS', 200148);
define('CURLOPT_TCP_FASTOPEN', 200149);
define('CURLOPT_TFTP_NO_OPTIONS', 200150);
define('CURLOPT_SSH_COMPRESSION', 200151);
define('CURLOPT_SSH_COMPRESSION', 200151); // don't work (kphp failed)
define('CURLOPT_SSL_FALSESTART', 200152); // work only on IOS with TLS backend (will be removed)
define('CURLOPT_HTTP09_ALLOWED', 200153);
define('CURLOPT_MAIL_RCPT_ALLLOWFAILS', 200154);
Expand All @@ -1311,24 +1311,25 @@ define('CURLOPT_SSL_OPTIONS', 200159);
define('CURLOPT_PROXY_SSL_OPTIONS', 200160);
define('CURLOPT_PROXY_SSL_VERIFYHOST', 200161);
define('CURLOPT_PROXY_SSLVERSION', 200162); // without CURL_SSLVERSION_MAX_* options
define('CURLOPT_STREAM_WEIGHT', 200163);
define('CURLOPT_STREAM_WEIGHT', 200163); // don't work (kphp failed)
define('CURLOPT_TIMEVALUE', 200164);
define('CURLOPT_TIMECONDITION', 200165);
define('CURLOPT_TIMEVALUE_LARGE', 200166);
define('CURLOPT_UPKEEP_INTERVAL_MS', 200167);
define('CURLOPT_UPLOAD_BUFFERSIZE', 200168);
define('CURLOPT_SSH_AUTH_TYPES', 200169);
define('CURLOPT_SSH_AUTH_TYPES', 200169); // kphp-curl doesn't support this option
// new slist options
define('CURLOPT_CONNECT_TO', 200170);
define('CURLOPT_PROXYHEADER', 200171);
// new string options
define('CURLOPT_ENCODING', 200172);
define('CURLOPT_ENCODING', 200172);
// curl must be build with zlib for decompressing gzip, with brotli – for brotli, with zstd – for zstd
define('CURLOPT_ACCEPT_ENCODING', CURLOPT_ENCODING);
define('CURLOPT_ABSTRACT_UNIX_SOCKET', 200173);
define('CURLOPT_DEFAULT_PROTOCOL', 200174);
define('CURLOPT_DNS_INTERFACE', 200175);
define('CURLOPT_DNS_LOCAL_IP4', 200176);
define('CURLOPT_DNS_LOCAL_IP6', 200177);
define('CURLOPT_DNS_LOCAL_IP4', 200176); // curl must be build with c-ares library
define('CURLOPT_DNS_LOCAL_IP6', 200177); // curl must be build with c-ares library
define('CURLOPT_KEYPASSWD', 200178);
define('CURLOPT_KRB4LEVEL', CURLOPT_KRBLEVEL);
define('CURLOPT_LOGIN_OPTIONS', 200179);
Expand Down Expand Up @@ -1394,18 +1395,27 @@ define('CURLSSH_AUTH_HOST', 1<<2);
define('CURLSSH_AUTH_KEYBOARD', 1<<3);

// bitmasks for CURLAUTH options
define('CURLAUTH_NONE', 0);
define('CURLAUTH_BASIC', 1<<0);
define('CURLAUTH_DIGEST', 1<<1);
define('CURLAUTH_GSSNEGOTIATE', 1<<2);
define('CURLAUTH_NTLM', 1<<3);
define('CURLAUTH_DIGEST_IE', 1<<4);
define('CURLAUTH_ANYSAFE', ~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE));
define('CURLAUTH_ANY', ~CURLAUTH_DIGEST_IE);
define('CURLAUTH_NONE', 0);
define('CURLAUTH_BASIC', 1<<0);
define('CURLAUTH_DIGEST', 1<<1);
define('CURLAUTH_NEGOTIATE', 1<<2);
define('CURLAUTH_GSSNEGOTIATE', CURLAUTH_NEGOTIATE);
define('CURLAUTH_GSSAPI', CURLAUTH_NEGOTIATE);
define('CURLAUTH_NTLM', 1<<3);
define('CURLAUTH_DIGEST_IE', 1<<4);
define('CURLAUTH_ANYSAFE', ~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE));
define('CURLAUTH_ANY', ~CURLAUTH_DIGEST_IE);

// bitmasks for SSL options
define('CURLSSLOPT_ALLOW_BEAST', 1<<0);
define('CURLSSLOPT_NO_REVOKE', 1<<1);
// define('CURLSSLOPT_NO_REVOKE', 1<<1);
// CURLSSLOPT_NO_REVOKE is only supported for Schannel (the native Windows SSL library)
define('CURLSSLOPT_NO_PARTIALCHAIN', 1<<2);
// define('CURLSSLOPT_REVOKE_BEST_EFFORT', 1<<3);
// CURLSSLOPT_REVOKE_BEST_EFFORT is only supported for Schannel (the native Windows SSL library)
define('CURLSSLOPT_NATIVE_CA', 1<<4);
// define('CURLSSLOPT_AUTO_CLIENT_CERT', 1<<5);
// CURLSSLOPT_AUTO_CLIENT_CERT is only supported for Schannel (the native Windows SSL library)

define('CURL_TIMECOND_NONE', 0);
define('CURL_TIMECOND_IFMODSINCE', 1);
Expand Down
91 changes: 22 additions & 69 deletions docs/various-topics/curl-options.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,26 @@
# Available cURL options
# About cURL options
(for debug)

## Not supported options
## Problem list
- CURLOPT_SSH_COMPRESSION (48)
- CURLOPT_SSL_FALSESTART (4)
- CURLOPT_MAIL_RCPT_ALLLOWFAILS (NULL in PHP)
- CURLOPT_MAXAGE_CONN (NULL in PHP)
- CURLOPT_MAXFILESIZE_LARGE (NULL in PHP)
- CURLOPT_MAXLIFETIME_CONN (NULL in PHP)
- CURLOPT_STREAM_WEIGHT (kphp fails)
- CURLOPT_SSH_AUTH_TYPES (48)
- CURLOPT_DNS_INTERFACE (48) c-ares
- CURLOPT_DNS_LOCAL_IP4 (48) c-ares
- CURLOPT_DNS_LOCAL_IP6 (48) c-ares
- CURLOPT_PROXY_TLS13_CIPHERS (4)
- CURLOPT_PROXY_TLSAUTH_PASSWORD (48)
- CURLOPT_PROXY_TLSAUTH_TYPE (48) OpenSSL with TLS-SRP
- CURLOPT_SASL_AUTHZID (NULL in PHP)
- CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 (48) libssh2
- CURLOPT_TLS13_CIPHERS (4)

## Not supported options (will be refactored)
Because of the cURL 7.60.0:
- CURLOPT_SSH_COMPRESSION
- CURLOPT_SSL_FALSESTART
Expand Down Expand Up @@ -48,70 +68,3 @@ Because of the cURL 7.60.0:
- CURLOPT_PROXY_SSL_OPTIONS (kphp doesn't support CURLSSLOPT_NO_PARTIALCHAIN: available from curl >= 7.68.0)
- CURLOPT_PROXY_SSL_VERIFYHOST (in curl < 7.66.0 setting to 1 return an error and leaving the flag untouched)
- CURLOPT_PROXY_SSLVERSION (CURL_SSLVERSION_MAX_* and CURL_SSLVERSION_TLSv1_3 options are not available)
- CURLOPT_STREAM_WEIGHT
- CURLOPT_TIMEVALUE
- CURLOPT_TIMECONDITION
- CURLOPT_TIMEVALUE_LARGE
- CURLOPT_EXPECT_100_TIMEOUT_MS
- CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS
- CURLOPT_HEADEROPT
- CURLOPT_POSTREDIR
- CURLOPT_PROTOCOLS
- CURLOPT_REDIR_PROTOCOLS
- CURLOPT_HTTPAUTH (updated)
- CURLOPT_SOCKS5_AUTH

### string options
- CURLOPT_ABSTRACT_UNIX_SOCKET
- CURLOPT_DEFAULT_PROTOCOL
- CURLOPT_ENCODING
- CURLOPT_KEYPASSWD
- CURLOPT_KRB4LEVEL
- CURLOPT_LOGIN_OPTIONS
- CURLOPT_PINNEDPUBLICKEY
- CURLOPT_PRE_PROXY
- CURLOPT_PROXY_SERVICE_NAME
- CURLOPT_PROXY_CAINFO
- CURLOPT_PROXY_CAPATH
- CURLOPT_PROXY_CRLFILE
- CURLOPT_PROXY_KEYPASSWD
- CURLOPT_PROXY_PINNEDPUBLICKEY

### array options
- CURLOPT_CONNECT_TO
- CURLOPT_PROXYHEADER

## TO-DO

- Missing string options for `curl_setopt()`:
- CURLOPT_PROXY_SSL_CIPHER_LIST
- CURLOPT_PROXY_TLS13_CIPHERS
- CURLOPT_PROXY_SSLKEY
- CURLOPT_PROXY_SSLKEYTYPE
- CURLOPT_PROXY_TLSAUTH_PASSWORD
- CURLOPT_PROXY_TLSAUTH_TYPE
- CURLOPT_PROXY_TLSAUTH_USERNAME
- CURLOPT_SERVICE_NAME
- CURLOPT_SSLCERTPASSWD
- CURLOPT_TLS13_CIPHERS (from curl >= 7.61.0)
- CURLOPT_UNIX_SOCKET_PATH
- CURLOPT_XOAUTH2_BEARER

- Missing fopen options:
- CURLOPT_FILE
- CURLOPT_INFILE
- CURLOPT_STDERR
- CURLOPT_WRITEHEADER

- Closure options:
- CURLOPT_HEADERFUNCTION
- CURLOPT_PASSWDFUNCTION
- CURLOPT_PROGRESSFUNCTION
- CURLOPT_READFUNCTION
- CURLOPT_WRITEFUNCTION
- CURLOPT_XFERINFOFUNCTION

- PHP tests for recent added options

## What about callables?
// not ready yet
17 changes: 14 additions & 3 deletions runtime/curl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,16 @@ void set_enumerated_option(const std::array<T, N> &options, EasyContext *easy_co
}
}

void timecond_option_setter(EasyContext *easy_context, CURLoption option, const mixed &value) {
constexpr static auto options = vk::to_array(
{
CURL_TIMECOND_NONE,
CURL_TIMECOND_IFMODSINCE,
CURL_TIMECOND_IFUNMODSINCE
});
set_enumerated_option<0>(options, easy_context, option, value);
}

void proxy_type_option_setter(EasyContext *easy_context, CURLoption option, const mixed &value) {
constexpr static auto options = vk::to_array(
{
Expand All @@ -526,7 +536,7 @@ void ssl_version_option_setter(EasyContext *easy_context, CURLoption option, con
CURL_SSLVERSION_TLSv1_1,
CURL_SSLVERSION_TLSv1_2,
CURL_SSLVERSION_SSLv2,
CURL_SSLVERSION_SSLv3,
CURL_SSLVERSION_SSLv3
});
set_enumerated_option<0>(options, easy_context, option, value);
}
Expand All @@ -538,7 +548,7 @@ void proxy_ssl_version_option_setter(EasyContext *easy_context, CURLoption optio
CURL_SSLVERSION_TLSv1,
CURL_SSLVERSION_TLSv1_0,
CURL_SSLVERSION_TLSv1_1,
CURL_SSLVERSION_TLSv1_2,
CURL_SSLVERSION_TLSv1_2
});
set_enumerated_option<0>(options, easy_context, option, value);
}
Expand Down Expand Up @@ -879,7 +889,7 @@ bool curl_setopt(EasyContext *easy_context, int64_t option, const mixed &value)
{CURLOPT_PROXY_SSLVERSION, proxy_ssl_version_option_setter},
{CURLOPT_STREAM_WEIGHT, long_option_setter},
{CURLOPT_TIMEVALUE, long_option_setter},
{CURLOPT_TIMECONDITION, long_option_setter},
{CURLOPT_TIMECONDITION, timecond_option_setter},
{CURLOPT_TIMEVALUE_LARGE, off_option_setter},
{CURLOPT_UPKEEP_INTERVAL_MS, long_option_setter},
{CURLOPT_UPLOAD_BUFFERSIZE, long_option_setter},
Expand Down Expand Up @@ -932,6 +942,7 @@ bool curl_setopt(EasyContext *easy_context, int64_t option, const mixed &value)
easy_context->error_num = CURLE_OK;
curl_option.option_setter(easy_context, curl_option.option, value);
}
fprintf(stderr, "error num for option %d is %d\n", (int)option, (int)easy_context->error_num);
return easy_context->error_num == CURLE_OK;
}

Expand Down
82 changes: 82 additions & 0 deletions tests/phpt/curl/13_curl_setopt_new.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
@ok
<?php

require_once 'kphp_tester_include.php';

function test_new_options() {
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://example.com/");

var_dump(curl_setopt($c, CURLOPT_SSL_VERIFYSTATUS, 1));
var_dump(curl_setopt($c, CURLOPT_DISALLOW_USERNAME_IN_URL, 1));
var_dump(curl_setopt($c, CURLOPT_CERTINFO, 1));
var_dump(curl_setopt($c, CURLOPT_NOPROGRESS, false));
var_dump(curl_setopt($c, CURLOPT_NOSIGNAL, false));
var_dump(curl_setopt($c, CURLOPT_PATH_AS_IS, true));
var_dump(curl_setopt($c, CURLOPT_PIPEWAIT, 1));
var_dump(curl_setopt($c, CURLOPT_SASL_IR, 1));
var_dump(curl_setopt($c, CURLOPT_EXPECT_100_TIMEOUT_MS, 200));
var_dump(curl_setopt($c, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, 1000));
var_dump(curl_setopt($c, CURLOPT_HEADEROPT, CURLHEADER_SEPARATE));
var_dump(curl_setopt($c, CURLOPT_POSTREDIR, 1));
var_dump(curl_setopt($c, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS|CURLPROTO_SCP));
var_dump(curl_setopt($c, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_FILE));
var_dump(curl_setopt($c, CURLOPT_DNS_SHUFFLE_ADDRESSES, true));
var_dump(curl_setopt($c, CURLOPT_HAPROXYPROTOCOL, false));
var_dump(curl_setopt($c, CURLOPT_DNS_USE_GLOBAL_CACHE, true));
var_dump(curl_setopt($c, CURLOPT_FTPAPPEND, true));
var_dump(curl_setopt($c, CURLOPT_FTPLISTONLY, true));
var_dump(curl_setopt($c, CURLOPT_KEEP_SENDING_ON_ERROR, false));
var_dump(curl_setopt($c, CURLOPT_PROXY_SSL_VERIFYPEER, false));
var_dump(curl_setopt($c, CURLOPT_SUPPRESS_CONNECT_HEADERS, true));
var_dump(curl_setopt($c, CURLOPT_TCP_FASTOPEN, true));
var_dump(curl_setopt($c, CURLOPT_TFTP_NO_OPTIONS, true));

var_dump(curl_setopt($c, CURLOPT_HTTP09_ALLOWED, false));
var_dump(curl_setopt($c, CURLOPT_SOCKS5_AUTH, CURLAUTH_GSSAPI));
var_dump(curl_setopt($c, CURLOPT_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST | CURLSSLOPT_NO_PARTIALCHAIN));
var_dump(curl_setopt($c, CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST | CURLSSLOPT_NO_PARTIALCHAIN));
var_dump(curl_setopt($c, CURLOPT_PROXY_SSL_VERIFYHOST, 2));

test_proxy_ssl_version_option(); // testing CURLOPT_PROXY_SSLVERSION option

var_dump(curl_setopt($c, CURLOPT_TIMEVALUE, 300));
var_dump(curl_setopt($c, CURLOPT_TIMEVALUE_LARGE, 1<<12));
var_dump(curl_setopt($c, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFUNMODSINCE));
var_dump(curl_setopt($c, CURLOPT_UPKEEP_INTERVAL_MS, 10000));
var_dump(curl_setopt($c, CURLOPT_UPLOAD_BUFFERSIZE, 100000));
var_dump(curl_setopt($c, CURLOPT_CONNECT_TO, ['example.com: server1.example.com']));
var_dump(curl_setopt($c, CURLOPT_PROXYHEADER, ["http://proxy.example.com:80"]));
var_dump(curl_setopt($c, CURLOPT_ENCODING, "gzip"));
var_dump(curl_setopt($c, CURLOPT_ABSTRACT_UNIX_SOCKET, "smth"));
var_dump(curl_setopt($c, CURLOPT_DEFAULT_PROTOCOL, "https"));

var_dump(curl_setopt($c, CURLOPT_KEYPASSWD, "smth"));
var_dump(curl_setopt($c, CURLOPT_LOGIN_OPTIONS, "AUTH=*"));
var_dump(curl_setopt($c, CURLOPT_PINNEDPUBLICKEY, "sha256//smth"));
var_dump(curl_setopt($c, CURLOPT_PRE_PROXY, "smth"));
var_dump(curl_setopt($c, CURLOPT_PROXY_SERVICE_NAME, "smth"));
var_dump(curl_setopt($c, CURLOPT_PROXY_CAINFO, "smth"));
var_dump(curl_setopt($c, CURLOPT_PROXY_CAPATH, "smth"));
var_dump(curl_setopt($c, CURLOPT_PROXY_KEYPASSWD, "smth"));
var_dump(curl_setopt($c, CURLOPT_PROXY_PINNEDPUBLICKEY, "sha256//smth"));

echo "creating pem file\n...";
$filename = "test";
exec("touch ./$filename.pem && echo 'smth' > $filename.pem");
var_dump(curl_setopt($c, CURLOPT_PROXY_SSLCERT, "$filename.pem"));
var_dump(curl_setopt($c, CURLOPT_PROXY_SSLCERTTYPE, "$filename.pem"));

var_dump(curl_setopt($c, CURLOPT_PROXY_SSL_CIPHER_LIST, "TLSv1"));
var_dump(curl_setopt($c, CURLOPT_PROXY_SSLKEY, "$filename.pem"));
var_dump(curl_setopt($c, CURLOPT_PROXY_SSLKEYTYPE, "PEM"));
var_dump(curl_setopt($c, CURLOPT_SERVICE_NAME, "custom"));
var_dump(curl_setopt($c, CURLOPT_SSL_EC_CURVES, "smth"));
var_dump(curl_setopt($c, CURLOPT_UNIX_SOCKET_PATH, "smth"));
var_dump(curl_setopt($c, CURLOPT_XOAUTH2_BEARER, "smth"));

var_dump(curl_exec($c) == true);
curl_close($c);
exec("rm ./$filename.pem");
echo "deleting $filename.pem file\n";
}
35 changes: 35 additions & 0 deletions tests/phpt/curl/14_curl_setopt_problems.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
@ok
<?php

require_once 'kphp_tester_include.php';

function test_new_options() {
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://example.com/");

var_dump(curl_setopt($c, CURLOPT_SSH_COMPRESSION, true)); // got 48 error
var_dump(curl_setopt($c, CURLOPT_SSL_FALSESTART, false)); // got 4 error

var_dump(curl_setopt($c, CURLOPT_HTTP09_ALLOWED, false));
var_dump(@curl_setopt($c, CURLOPT_MAIL_RCPT_ALLLOWFAILS, true)); // got warning and NULL from php
var_dump(@curl_setopt($c, CURLOPT_MAXAGE_CONN, 30)); // got warning and NULL from php
var_dump(curl_setopt($c, CURLOPT_MAXFILESIZE_LARGE, 1<<58)); // got NULL from php
var_dump(curl_setopt($c, CURLOPT_MAXLIFETIME_CONN, 30)); // got NULL from php

var_dump(curl_setopt($c, CURLOPT_STREAM_WEIGHT, 20)); // dont work (very bad)

var_dump(curl_setopt($c, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_NONE)); // got 48 error


var_dump(curl_setopt($c, CURLOPT_DNS_INTERFACE, "eth0")); // got 48 error

var_dump(curl_setopt($c, CURLOPT_PROXY_TLS13_CIPHERS, "kDHE")); // got 4 error
var_dump(curl_setopt($c, CURLOPT_PROXY_TLSAUTH_PASSWORD, "smth")); // got 48 error
var_dump(curl_setopt($c, CURLOPT_PROXY_TLSAUTH_TYPE, "SRP")); // got 48 error, needs OpenSSL with TLS-SRP
var_dump(curl_setopt($c, CURLOPT_SASL_AUTHZID, "Ursel")); // got NULL from PHP
var_dump(curl_setopt($c, CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256, "smth")); // got 48 error, needs libssh2
var_dump(curl_setopt($c, CURLOPT_TLS13_CIPHERS, "smth")); // got 4 error (doesn't supported)

var_dump(curl_exec($c) == true);
curl_close($c);
}
Loading

0 comments on commit f9dcbf0

Please sign in to comment.