2013-06-03 15:44:55 +00:00
< ? php
2025-03-24 00:08:08 +00:00
/* Copyright ( C ) 2008 - 2020 Laurent Destailleur < eldy @ users . sourceforge . net >
* Copyright ( C ) 2024 MDW < mdeweerd @ users . noreply . github . com >
2026-03-29 14:29:25 +00:00
* Copyright ( C ) 2025 - 2026 Frédéric France < frederic . france @ free . fr >
2013-06-03 15:44:55 +00:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 19:55:30 +00:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
* or see https :// www . gnu . org /
2013-06-03 15:44:55 +00:00
*/
/**
2013-09-18 21:39:53 +00:00
* \file htdocs / core / lib / geturl . lib . php
2020-10-27 17:02:05 +00:00
* \brief This file contains functions dedicated to get URLs .
2013-06-03 15:44:55 +00:00
*/
/**
2020-10-27 17:02:05 +00:00
* Function to get a content from an URL ( use proxy if proxy defined ) .
2025-09-04 12:01:27 +00:00
* Support Dolibarr setup for timeout ( MAIN_USE_ * _TIMEOUT ) and proxy ( MAIN_PROXY_ * )
2021-06-09 10:41:53 +00:00
* Enhancement of CURL to add an anti SSRF protection :
* - you can set MAIN_SECURITY_ANTI_SSRF_SERVER_IP to set static ip of server
* - common local lookup ips like 127. *.*.* are automatically added
2013-06-03 15:44:55 +00:00
*
2026-04-18 18:32:45 +00:00
* To test there is no error , you can do : if ( empty ( $resultget [ 'curl_error_no' ]) && $resultget [ 'http_code' ] == 200 ) ...
*
2025-11-20 18:40:57 +00:00
* You can enable constant MAIN_CURL_DEBUG to get detail of output / input into dolibarr_curl . log file .
2025-07-15 14:15:59 +00:00
*
2026-02-27 12:49:09 +00:00
* @ param string $url URL to call .
2025-09-04 11:51:56 +00:00
* @ param 'POST' | 'GET' | 'HEAD' | 'PUT' | 'PATCH' | 'PUTALREADYFORMATED' | 'POSTALREADYFORMATED' | 'PATCHALREADYFORMATED' | 'DELETE' $postorget 'POST' , 'GET' , 'HEAD' , 'PUT' , 'PATCH' , 'PUTALREADYFORMATED' , 'POSTALREADYFORMATED' , 'PATCHALREADYFORMATED' , 'DELETE'
2026-02-27 12:49:09 +00:00
* @ param string | array < mixed , mixed > $param Parameters of URL ( x = value1 & y = value2 urlencoded even with POST ) or may be a formatted content with $postorget = 'POSTALREADYFORMATED/PUTALREADYFORMATED'
* @ param int < 0 , 1 > $followlocation 0 = Do not follow , 1 = Follow location .
* @ param string [] $addheaders Array of string to add into header . Example : ( 'Accept: application/xrds+xml' , .... )
* @ param string [] $allowedschemes List of schemes that are allowed ( 'http' + 'https' only by default )
* @ param int < 0 , 2 > $localurl 0 = Only external URL are possible , 1 = Only local URL , 2 = Both external and local URL are allowed .
* @ param int <- 1 , 1 > $ssl_verifypeer - 1 = Auto ( no ssl check on dev , check on prod ), 0 = No ssl check , 1 = Always ssl check
* @ param int $timeoutconnect Timeout for connection time
* @ param int $timeoutresponse Timeout for total time including connection
* @ param array < int , mixed >| null $otherCurlOptions Array of other curl options to set . Example : array ( CURLOPT_SSL_VERIFYPEER => false )
* @ param string $morelogsuffix If set to a string '_suffix' , some logs are also added into the file " dolibarr_suffix.log "
2024-11-04 11:32:13 +00:00
* @ return array { http_code : int , content : string , curl_error_no : int , curl_error_msg : string } Returns an associative array containing the response from the server array ( 'http_code' => http response code , 'content' => response , 'curl_error_no' => errno , 'curl_error_msg' => errmsg ... )
2013-06-03 15:44:55 +00:00
*/
2026-01-08 21:55:03 +00:00
function getURLContent ( $url , $postorget = 'GET' , $param = '' , $followlocation = 1 , $addheaders = array (), $allowedschemes = array ( 'http' , 'https' ), $localurl = 0 , $ssl_verifypeer = - 1 , $timeoutconnect = 0 , $timeoutresponse = 0 , $otherCurlOptions = array (), $morelogsuffix = '' )
2013-06-03 15:44:55 +00:00
{
2025-07-15 14:15:59 +00:00
// Get global variables for proxy use
$USE_PROXY = getDolGlobalInt ( 'MAIN_PROXY_USE' );
$PROXY_HOST = getDolGlobalString ( 'MAIN_PROXY_HOST' );
$PROXY_PORT = getDolGlobalInt ( 'MAIN_PROXY_PORT' );
$PROXY_USER = getDolGlobalString ( 'MAIN_PROXY_USER' );
$PROXY_PASS = getDolGlobalString ( 'MAIN_PROXY_PASS' );
2013-06-03 15:44:55 +00:00
2025-11-20 18:40:57 +00:00
dol_syslog ( " getURLContent postorget= " . $postorget . " URL= " . $url );
if ( getDolGlobalInt ( 'MAIN_CURL_DEBUG' )) {
2026-02-27 12:49:09 +00:00
dol_syslog ( " getURLContent postorget= " . $postorget . " URL= " . $url . " json_encode(param)= " . json_encode ( $param ), LOG_DEBUG , 0 , '_curl' );
2025-11-20 18:40:57 +00:00
}
2026-01-08 21:55:03 +00:00
if ( $morelogsuffix ) {
2026-02-27 12:49:09 +00:00
dol_syslog ( " getURLContent postorget= " . $postorget . " URL= " . $url . " json_encode(param)= " . json_encode ( $param ), LOG_DEBUG , 0 , $morelogsuffix );
2026-01-08 21:55:03 +00:00
}
2013-06-03 15:44:55 +00:00
2025-02-15 17:10:41 +00:00
if ( ! function_exists ( 'curl_init' )) {
2025-11-20 18:40:57 +00:00
if ( getDolGlobalInt ( 'MAIN_CURL_DEBUG' )) {
dol_syslog ( " getURLContent PHP curl library must be installed " , LOG_DEBUG , 0 , '_curl' );
}
2026-01-08 21:55:03 +00:00
if ( $morelogsuffix ) {
dol_syslog ( " getURLContent PHP curl library must be installed " , LOG_DEBUG , 0 , $morelogsuffix );
}
2025-02-17 02:49:11 +00:00
return array ( 'http_code' => 500 , 'content' => '' , 'curl_error_no' => 1 , 'curl_error_msg' => 'PHP curl library must be installed' );
2025-02-15 17:10:41 +00:00
}
2020-10-31 13:32:18 +00:00
//setting the curl parameters.
$ch = curl_init ();
2013-06-03 15:44:55 +00:00
2020-10-31 13:32:18 +00:00
/* print $API_Endpoint . " - " . $API_version . " - " . $PAYPAL_API_USER . " - " . $PAYPAL_API_PASSWORD . " - " . $PAYPAL_API_SIGNATURE . " <br> " ;
2021-02-23 21:03:23 +00:00
print $USE_PROXY . " - " . $gv_ApiErrorURL . " <br> " ;
print $nvpStr ;
exit ; */
2025-09-27 10:23:48 +00:00
curl_setopt ( $ch , CURLOPT_VERBOSE , true );
2025-07-11 12:24:22 +00:00
curl_setopt ( $ch , CURLOPT_USERAGENT , 'Dolibarr geturl function' ); // set the Dolibarr user agent name
2013-09-18 19:22:24 +00:00
2020-10-27 14:06:16 +00:00
// We use @ here because this may return warning if safe mode is on or open_basedir is on (following location is forbidden when safe mode is on).
// We force value to false so we will manage redirection ourself later.
@ curl_setopt ( $ch , CURLOPT_FOLLOWLOCATION , false );
2017-10-01 16:27:54 +00:00
2021-02-23 21:03:23 +00:00
if ( is_array ( $addheaders ) && count ( $addheaders )) {
curl_setopt ( $ch , CURLOPT_HTTPHEADER , $addheaders );
}
2020-04-10 08:59:32 +00:00
curl_setopt ( $ch , CURLINFO_HEADER_OUT , true ); // To be able to retrieve request header and log it
2013-06-03 15:44:55 +00:00
2025-08-01 22:49:19 +00:00
if ( getDolGlobalInt ( 'MAIN_CURL_GET_RESPONSE_HEADER' )) {
curl_setopt ( $ch , CURLOPT_HEADER , true ); // To be able to retrieve response header
}
2024-01-13 18:48:20 +00:00
// By default use the TLS version decided by PHP.
2017-05-08 10:08:43 +00:00
// You can force, if supported a version like TLSv1 or TLSv1.2
2023-11-27 10:39:32 +00:00
if ( getDolGlobalString ( 'MAIN_CURL_SSLVERSION' )) {
2025-03-24 00:08:08 +00:00
$sslversion = is_numeric ( getDolGlobalString ( 'MAIN_CURL_SSLVERSION' )) ? getDolGlobalInt ( 'MAIN_CURL_SSLVERSION' ) : constant ( getDolGlobalString ( 'MAIN_CURL_SSLVERSION' ));
curl_setopt ( $ch , CURLOPT_SSLVERSION , ( int ) $sslversion );
2021-02-23 21:03:23 +00:00
}
2017-05-08 10:08:43 +00:00
//curl_setopt($ch, CURLOPT_SSLVERSION, 6); for tls 1.2
2017-10-01 16:27:54 +00:00
2022-01-22 16:14:45 +00:00
// Turning on or off the ssl target certificate
if ( $ssl_verifypeer < 0 ) {
global $dolibarr_main_prod ;
$ssl_verifypeer = ( $dolibarr_main_prod ? true : false );
}
2023-11-27 10:39:32 +00:00
if ( getDolGlobalString ( 'MAIN_CURL_DISABLE_VERIFYPEER' )) {
2022-01-22 16:14:45 +00:00
$ssl_verifypeer = 0 ;
}
2020-10-31 13:32:18 +00:00
// Turning off the server and peer verification(TrustManager Concept).
2022-01-22 16:14:45 +00:00
curl_setopt ( $ch , CURLOPT_SSL_VERIFYPEER , ( $ssl_verifypeer ? true : false ));
2025-09-27 10:23:48 +00:00
// 0 to not check the names
// 1 to check the existence of a common name in the SSL peer certificate
// 2 to check the existence of a common name and also verify that it matches the hostname provided.
// In production environments the value of this option should be kept at 2 (default value).
curl_setopt ( $ch , CURLOPT_SSL_VERIFYHOST , ( $ssl_verifypeer ? 2 : 0 ));
2020-10-31 13:32:18 +00:00
// Restrict use to some protocols only
$protocols = 0 ;
2024-02-15 14:20:21 +00:00
$redir_list = array ();
2020-10-31 13:32:18 +00:00
if ( is_array ( $allowedschemes )) {
foreach ( $allowedschemes as $allowedscheme ) {
2021-02-23 21:03:23 +00:00
if ( $allowedscheme == 'http' ) {
$protocols |= CURLPROTO_HTTP ;
2024-02-15 14:20:21 +00:00
$redir_list [ " HTTP " ] = 1 ;
} elseif ( $allowedscheme == 'https' ) {
2021-02-23 21:03:23 +00:00
$protocols |= CURLPROTO_HTTPS ;
2024-02-15 14:20:21 +00:00
$redir_list [ " HTTPS " ] = 1 ;
} elseif ( $allowedscheme == 'ftp' ) {
$protocols |= CURLPROTO_FTP ;
$redir_list [ " FTP " ] = 1 ;
} elseif ( $allowedscheme == 'ftps' ) {
$protocols |= CURLPROTO_FTPS ;
$redir_list [ " FTPS " ] = 1 ;
2021-02-23 21:03:23 +00:00
}
2020-10-31 13:32:18 +00:00
}
2026-01-08 22:20:56 +00:00
} else {
return array ( 'http_code' => 500 , 'content' => '' , 'curl_error_no' => 1 , 'curl_error_msg' => 'Parameter allowedschemes of getURLContent must be an array of protocol schemes' );
2020-10-31 13:32:18 +00:00
}
2025-07-24 23:45:15 +00:00
$newtimeoutconnect = ( $timeoutconnect ? $timeoutconnect : getDolGlobalInt ( 'MAIN_USE_CONNECT_TIMEOUT' , 5 ));
$newtimeoutresponse = ( $timeoutresponse ? $timeoutresponse : getDolGlobalInt ( 'MAIN_USE_RESPONSE_TIMEOUT' , 30 ));
2025-07-24 23:37:48 +00:00
2025-11-20 18:40:57 +00:00
if ( getDolGlobalInt ( 'MAIN_CURL_DEBUG' )) {
dol_syslog ( " getURLContent newtimeoutconnect= " . $newtimeoutconnect . " newtimeoutresponse= " . $newtimeoutresponse , LOG_DEBUG , 0 , '_curl' );
}
2026-01-08 21:55:03 +00:00
if ( $morelogsuffix ) {
dol_syslog ( " getURLContent newtimeoutconnect= " . $newtimeoutconnect . " newtimeoutresponse= " . $newtimeoutresponse , LOG_DEBUG , 0 , $morelogsuffix );
}
2025-07-24 23:37:48 +00:00
2026-01-08 02:47:32 +00:00
curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT , $newtimeoutconnect ); // Timeout for connection
curl_setopt ( $ch , CURLOPT_TIMEOUT , $newtimeoutresponse ); // Timeout for total time including connection
2020-10-31 13:32:18 +00:00
2025-02-06 15:33:09 +00:00
// limit size of downloaded files.
2023-02-04 10:32:38 +00:00
$maxsize = getDolGlobalInt ( 'MAIN_SECURITY_MAXFILESIZE_DOWNLOADED' );
if ( $maxsize && defined ( 'CURLOPT_MAXFILESIZE_LARGE' )) {
2025-04-01 17:56:50 +00:00
curl_setopt ( $ch , CURLOPT_MAXFILESIZE_LARGE , $maxsize * 1024 ); // @phan-suppress-current-line PhanTypeMismatchArgumentNullableInternal
2023-02-04 10:32:38 +00:00
}
if ( $maxsize && defined ( 'CURLOPT_MAXFILESIZE' )) {
2025-04-01 17:56:50 +00:00
curl_setopt ( $ch , CURLOPT_MAXFILESIZE , $maxsize * 1024 );
2023-02-04 10:32:38 +00:00
}
2022-06-25 00:18:16 +00:00
2020-10-31 13:32:18 +00:00
//curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); // PHP 5.5
2025-09-27 10:23:48 +00:00
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true ); // We want response
2020-10-31 13:32:18 +00:00
if ( $postorget == 'POST' ) {
2025-09-27 10:23:48 +00:00
curl_setopt ( $ch , CURLOPT_POST , true ); // POST
2020-10-31 13:32:18 +00:00
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $param ); // Setting param x=a&y=z as POST fields
} elseif ( $postorget == 'POSTALREADYFORMATED' ) {
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST , 'POST' ); // HTTP request is 'POST' but param string is taken as it is
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $param ); // param = content of post, like a xml string
} elseif ( $postorget == 'PUT' ) {
2025-09-04 12:39:41 +00:00
$array_param = array ();
2020-10-31 13:32:18 +00:00
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST , 'PUT' ); // HTTP request is 'PUT'
2021-02-23 21:03:23 +00:00
if ( ! is_array ( $param )) {
2025-09-04 12:39:41 +00:00
parse_str ( $param , $array_param );
2021-02-23 21:03:23 +00:00
} else {
2020-10-31 13:32:18 +00:00
dol_syslog ( " parameter param must be a string " , LOG_WARNING );
$array_param = $param ;
}
curl_setopt ( $ch , CURLOPT_POSTFIELDS , http_build_query ( $array_param )); // Setting param x=a&y=z as PUT fields
} elseif ( $postorget == 'PUTALREADYFORMATED' ) {
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST , 'PUT' ); // HTTP request is 'PUT'
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $param ); // param = content of post, like a xml string
2025-09-04 11:26:47 +00:00
} elseif ( $postorget == 'PATCH' ) {
2025-09-04 12:39:41 +00:00
$array_param = array ();
2025-09-04 11:26:47 +00:00
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST , 'PATCH' ); // RFC 5789
if ( ! is_array ( $param )) {
2025-09-04 12:39:41 +00:00
parse_str ( $param , $array_param );
2025-09-04 11:26:47 +00:00
} else {
dol_syslog ( " parameter param must be a string " , LOG_WARNING );
$array_param = $param ;
}
curl_setopt ( $ch , CURLOPT_POSTFIELDS , http_build_query ( $array_param ));
} elseif ( $postorget == 'PATCHALREADYFORMATED' ) {
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST , 'PATCH' ); // RFC 5789
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $param );
2020-10-31 13:32:18 +00:00
} elseif ( $postorget == 'HEAD' ) {
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST , 'HEAD' ); // HTTP request is 'HEAD'
curl_setopt ( $ch , CURLOPT_NOBODY , true );
2026-05-22 11:20:54 +00:00
curl_setopt ( $ch , CURLOPT_HEADER , true );
2020-10-31 13:32:18 +00:00
} elseif ( $postorget == 'DELETE' ) {
curl_setopt ( $ch , CURLOPT_CUSTOMREQUEST , 'DELETE' ); // POST
} else {
2025-09-27 10:23:48 +00:00
curl_setopt ( $ch , CURLOPT_POST , false ); // GET
2020-10-31 13:32:18 +00:00
}
//if USE_PROXY constant set at begin of this method.
if ( $USE_PROXY ) {
dol_syslog ( " getURLContent set proxy to " . $PROXY_HOST . " : " . $PROXY_PORT . " - " . $PROXY_USER . " : " . $PROXY_PASS );
//curl_setopt ($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); // Curl 7.10
curl_setopt ( $ch , CURLOPT_PROXY , $PROXY_HOST . " : " . $PROXY_PORT );
2021-02-23 21:03:23 +00:00
if ( $PROXY_USER ) {
curl_setopt ( $ch , CURLOPT_PROXYUSERPWD , $PROXY_USER . " : " . $PROXY_PASS );
2025-09-23 19:41:32 +00:00
}
}
if ( is_array ( $otherCurlOptions )) {
foreach ( $otherCurlOptions as $option => $value ) {
curl_setopt ( $ch , $option , $value );
2021-02-23 21:03:23 +00:00
}
2020-10-31 13:32:18 +00:00
}
$newUrl = $url ;
$maxRedirection = 5 ;
$info = array ();
$response = '' ;
do {
2021-02-23 21:03:23 +00:00
if ( $maxRedirection < 1 ) {
2025-11-20 18:40:57 +00:00
if ( getDolGlobalInt ( 'MAIN_CURL_DEBUG' )) {
dol_syslog ( " getURLContent http_code=400 Maximum number of redirections reached " , LOG_DEBUG , 0 , '_curl' );
}
2025-07-04 06:54:01 +00:00
return array ( 'http_code' => 400 , 'content' => 'Maximum number of redirections reached' , 'curl_error_no' => 1 , 'curl_error_msg' => 'Maximum number of redirections reached' );
2021-02-23 21:03:23 +00:00
}
2020-10-31 13:32:18 +00:00
curl_setopt ( $ch , CURLOPT_URL , $newUrl );
// Parse $newUrl
2020-10-27 17:02:05 +00:00
$newUrlArray = parse_url ( $newUrl );
2026-06-02 13:18:57 +00:00
$hosttocheck = $newUrlArray [ 'host' ] ? : $newUrlArray [ 'path' ];
2020-10-31 13:32:18 +00:00
$hosttocheck = str_replace ( array ( '[' , ']' ), '' , $hosttocheck ); // Remove brackets of IPv6
2020-10-27 17:02:05 +00:00
2021-04-12 09:20:44 +00:00
// Deny some reserved host names
if ( in_array ( $hosttocheck , array ( 'metadata.google.internal' ))) {
$info [ 'http_code' ] = 400 ;
2021-04-25 20:11:57 +00:00
$info [ 'content' ] = 'Error bad hostname ' . $hosttocheck . ' (Used by Google metadata). This value for hostname is not allowed.' ;
2025-11-20 18:40:57 +00:00
if ( getDolGlobalInt ( 'MAIN_CURL_DEBUG' )) {
dol_syslog ( " getURLContent http_code=400 " . $info [ 'content' ], LOG_DEBUG , 0 , '_curl' );
}
2025-07-04 06:54:01 +00:00
return array ( 'http_code' => 400 , 'content' => $info [ 'content' ], 'curl_error_no' => 1 , 'curl_error_msg' => $info [ 'content' ]);
2021-04-12 09:20:44 +00:00
}
2026-07-29 10:16:48 +00:00
/* Discard full numeric hostname */
if ( preg_match ( '/^[x0-9a-f]+$/' , $hosttocheck )) {
2026-07-30 14:59:25 +00:00
return array ( 'http_code' => 400 , 'content' => '' , 'curl_error_no' => 1 , 'curl_error_msg' => 'Host is a numeric address that is not allowed' );
2026-07-29 10:16:48 +00:00
}
2021-04-12 09:20:44 +00:00
// Clean host name $hosttocheck to convert it into an IP $iptocheck
2020-10-27 17:02:05 +00:00
if ( in_array ( $hosttocheck , array ( 'localhost' , 'localhost.domain' ))) {
$iptocheck = '127.0.0.1' ;
2021-04-12 09:20:44 +00:00
} elseif ( in_array ( $hosttocheck , array ( 'ip6-localhost' , 'ip6-loopback' ))) {
$iptocheck = '::1' ;
2020-10-27 17:02:05 +00:00
} else {
2023-06-03 10:06:15 +00:00
// Resolve $hosttocheck to get the IP $iptocheck
2026-07-29 10:16:48 +00:00
// Not that a bad numeric hostname like 2130706433 will be resolved int 127.0.0.1 but
// this case is filtered previously.
2026-03-29 14:29:25 +00:00
$iptocheck = resolveDns ( $hosttocheck );
2020-10-27 17:02:05 +00:00
}
2021-04-19 11:52:12 +00:00
// Check $iptocheck is an IP (v4 or v6), if not clear value.
2026-07-29 10:16:48 +00:00
if ( ! filter_var ( $iptocheck , FILTER_VALIDATE_IP , FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 )) { // This is not an IP
2026-03-26 13:40:53 +00:00
$iptocheck = '0' ; // will disabled check on IP
2026-07-30 14:59:25 +00:00
return array ( 'http_code' => 400 , 'content' => '' , 'curl_error_no' => 1 , 'curl_error_msg' => 'Host is a numeric address that is not allowed' );
2020-10-27 17:02:05 +00:00
}
if ( $iptocheck ) {
2023-06-03 10:06:15 +00:00
$tmpresult = isIPAllowed ( $iptocheck , $localurl );
if ( $tmpresult ) {
$info [ 'http_code' ] = 400 ;
$info [ 'content' ] = $tmpresult ;
2025-11-20 18:40:57 +00:00
if ( getDolGlobalInt ( 'MAIN_CURL_DEBUG' )) {
dol_syslog ( " getURLContent http_code=400 " . $info [ 'content' ], LOG_DEBUG , 0 , '_curl' );
}
2025-07-04 06:54:01 +00:00
return array ( 'http_code' => 400 , 'content' => $tmpresult , 'curl_error_no' => 1 , 'curl_error_msg' => $tmpresult );
2021-04-19 13:01:36 +00:00
}
2023-06-03 10:06:15 +00:00
}
2021-04-19 11:52:12 +00:00
2023-06-03 10:06:15 +00:00
if ( $iptocheck ) {
2021-04-19 18:49:31 +00:00
// Set CURLOPT_CONNECT_TO so curl will not try another resolution that may give a different result. Possible only on PHP v7+
if ( defined ( 'CURLOPT_CONNECT_TO' )) {
2023-12-04 11:05:28 +00:00
$connect_to = array ( sprintf ( " %s:%d:%s:%d " , $newUrlArray [ 'host' ], empty ( $newUrlArray [ 'port' ]) ? '' : $newUrlArray [ 'port' ], $iptocheck , empty ( $newUrlArray [ 'port' ]) ? '' : $newUrlArray [ 'port' ]));
2021-04-20 10:19:46 +00:00
//var_dump($newUrlArray);
//var_dump($connect_to);
curl_setopt ( $ch , CURLOPT_CONNECT_TO , $connect_to );
2021-04-19 18:49:31 +00:00
}
2020-10-31 13:32:18 +00:00
}
2013-06-03 15:44:55 +00:00
2024-02-15 14:20:21 +00:00
// Moving these just before the curl_exec option really limits
// on windows PHP 7.4.
curl_setopt ( $ch , CURLOPT_PROTOCOLS , $protocols );
curl_setopt ( $ch , CURLOPT_REDIR_PROTOCOLS , $protocols );
2024-02-15 14:22:33 +00:00
/* CURLOPT_REDIR_PROTOCOLS_STR available from PHP 7.85 . 0
2024-02-15 14:20:21 +00:00
if ( version_compare ( PHP_VERSION , '8.3.0' , '>=' ) && version_compare ( curl_version ()[ 'version' ], '7.85.0' , '>=' )) {
curl_setopt ( $ch , CURLOPT_REDIR_PROTOCOLS_STR , implode ( " , " , array_keys ( $redir_list )));
}
2024-02-15 14:22:33 +00:00
*/
2024-02-15 14:20:21 +00:00
2020-10-31 13:32:18 +00:00
// Getting response from server
2025-03-24 14:23:13 +00:00
$response = curl_exec ( $ch ); // return false on error, result on success
2020-10-31 13:32:18 +00:00
$info = curl_getinfo ( $ch ); // Reading of request must be done after sending request
$http_code = $info [ 'http_code' ];
2021-04-07 21:31:16 +00:00
2020-10-31 13:32:18 +00:00
if ( $followlocation && ( $http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307 )) {
$newUrl = $info [ 'redirect_url' ];
$maxRedirection -- ;
// TODO Use $info['local_ip'] and $info['primary_ip'] ?
continue ;
}
2023-01-08 18:28:38 +00:00
$http_code = 0 ;
2025-11-20 18:40:57 +00:00
} while ( $http_code ); // Stop if http_code is 0
2020-10-31 13:32:18 +00:00
$request = curl_getinfo ( $ch , CURLINFO_HEADER_OUT ); // Reading of request must be done after sending request
2013-09-18 19:22:24 +00:00
2025-11-20 18:40:57 +00:00
dol_syslog ( " getURLContent request without content body= " . $request );
2023-09-15 20:38:19 +00:00
if ( getDolGlobalInt ( 'MAIN_CURL_DEBUG' )) {
2024-01-13 18:48:20 +00:00
// This may contains binary data, so we don't output response by default.
2025-11-20 18:40:57 +00:00
dol_syslog ( " getURLContent request without body= " . $request , LOG_DEBUG , 0 , '_curl' );
dol_syslog ( " getURLContent response= " . $response , LOG_DEBUG , 0 , '_curl' );
2021-10-29 11:32:32 +00:00
}
2026-01-08 21:55:03 +00:00
if ( $morelogsuffix ) {
// This may contains binary data, so we don't output response by default.
dol_syslog ( " getURLContent request without body= " . $request , LOG_DEBUG , 0 , $morelogsuffix );
dol_syslog ( " getURLContent response= " . $response , LOG_DEBUG , 0 , $morelogsuffix );
}
dol_syslog ( " getURLContent response size= " . strlen ( $response )); // This $response may contains binary data, so we don't output it
2017-10-01 16:27:54 +00:00
2020-10-31 13:32:18 +00:00
$rep = array ();
if ( curl_errno ( $ch )) {
2021-04-19 11:52:12 +00:00
// Add keys to $rep
2025-03-24 14:23:13 +00:00
if ( $response ) {
2025-03-24 14:52:59 +00:00
$rep [ 'content' ] = ( string ) $response ;
2025-03-24 14:23:13 +00:00
} else {
$rep [ 'content' ] = '' ;
}
2020-10-31 13:32:18 +00:00
2025-03-24 15:22:14 +00:00
$rep [ 'http_code' ] = 0 ;
2020-10-31 13:32:18 +00:00
$rep [ 'curl_error_no' ] = curl_errno ( $ch );
$rep [ 'curl_error_msg' ] = curl_error ( $ch );
Qual: Apply automatic phan fixes (deprecations, unneeded imports) (#28154)
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
2024-02-13 20:46:12 +00:00
dol_syslog ( " getURLContent response array is " . implode ( ',' , $rep ));
2026-01-16 17:08:48 +00:00
2025-11-20 18:40:57 +00:00
if ( getDolGlobalInt ( 'MAIN_CURL_DEBUG' )) {
dol_syslog ( " getURLContent curl_error_no= " . $rep [ 'curl_error_no' ] . " curl_error_msg= " . $rep [ 'curl_error_msg' ], LOG_DEBUG , 0 , '_curl' );
}
2026-01-08 21:55:03 +00:00
if ( $morelogsuffix ) {
dol_syslog ( " getURLContent curl_error_no= " . $rep [ 'curl_error_no' ] . " curl_error_msg= " . $rep [ 'curl_error_msg' ], LOG_DEBUG , 0 , $morelogsuffix );
}
2020-10-31 13:32:18 +00:00
} else {
//$info = curl_getinfo($ch);
2025-03-24 15:22:14 +00:00
// Return all fields found into $info.
2020-10-31 13:32:18 +00:00
$rep = $info ;
2025-03-24 15:22:14 +00:00
//$rep['header_size'] = $info['header_size'];
//$rep['http_code'] = $info['http_code'];
//$rep['content_type'] = $info['http_code'];
2020-10-31 13:32:18 +00:00
dol_syslog ( " getURLContent http_code= " . $rep [ 'http_code' ]);
// Add more keys to $rep
2021-04-19 11:52:12 +00:00
if ( $response ) {
2025-03-24 14:52:59 +00:00
$rep [ 'content' ] = ( string ) $response ;
2026-05-22 11:20:54 +00:00
if ( $postorget == 'HEAD' || getDolGlobalInt ( 'MAIN_CURL_GET_RESPONSE_HEADER' )) { // In this case, response contains header + body
2025-08-01 22:49:19 +00:00
$rep [ 'header' ] = substr ( $rep [ 'content' ], 0 , intval ( $rep [ 'header_size' ]));
$rep [ 'content' ] = substr ( $rep [ 'content' ], intval ( $rep [ 'header_size' ]));
}
2025-03-24 14:23:13 +00:00
} else {
$rep [ 'content' ] = '' ;
2021-04-19 11:52:12 +00:00
}
2025-03-24 14:23:13 +00:00
2025-03-24 15:22:14 +00:00
$rep [ 'curl_error_no' ] = 0 ;
2020-10-31 13:32:18 +00:00
$rep [ 'curl_error_msg' ] = '' ;
}
2013-06-03 15:44:55 +00:00
2020-10-31 13:32:18 +00:00
//closing the curl
curl_close ( $ch );
2020-10-27 14:06:16 +00:00
2025-03-24 15:22:14 +00:00
// We must exclude phpstant wwarning, because all fields found in result of curl_getinfo may not be all defined into description of this method.
// @phpstan-ignore-next-line
2020-10-31 13:32:18 +00:00
return $rep ;
2013-06-03 15:44:55 +00:00
}
2026-03-26 13:40:53 +00:00
/**
* Resolve a hostname into its IP
*
* @ param string $hosttocheck Hostname to check
* @ return string First ip found ( IP v4 or IP v6 ) . If resolution fails , the $hosttocheck is returned .
*/
function resolveDns ( $hosttocheck )
{
$iptocheck = null ;
// Resolve $hosttocheck to get the IP $iptocheck
if ( function_exists ( 'dns_get_record' ) && ! getDolGlobalString ( 'MAIN_DISABLE_DNS_GET_RECORD_FOR_IP_RESOLUTION' )) {
try {
$records = dns_get_record ( $hosttocheck , DNS_A + DNS_AAAA );
if ( ! empty ( $records [ 0 ]) && is_array ( $records [ 0 ]) && ! empty ( $records [ 0 ][ 'ip' ])) { // We take the first one
$iptocheck = $records [ 0 ][ 'ip' ];
} elseif ( ! empty ( $records [ 0 ]) && is_array ( $records [ 0 ]) && ! empty ( $records [ 0 ][ 'ipv6' ])) { // We take the first one
$iptocheck = $records [ 0 ][ 'ipv6' ];
}
} catch ( Exception $e ) {
// Nothing done
}
} elseif ( function_exists ( 'gethostbyname' )) { // resolve only ipv4
$iptocheck = gethostbyname ( $hosttocheck );
} else {
$iptocheck = $hosttocheck ;
}
if ( $iptocheck === null ) {
$iptocheck = $hosttocheck ;
}
return $iptocheck ;
}
2023-06-03 10:06:15 +00:00
/**
* Is IP allowed
*
* @ param string $iptocheck IP to check
* @ param int $localurl 0 = external url only , 1 = internal url only
* @ return string Error message or ''
*/
function isIPAllowed ( $iptocheck , $localurl )
{
if ( $localurl == 0 ) { // Only external url allowed (dangerous, may allow to get malware)
if ( ! filter_var ( $iptocheck , FILTER_VALIDATE_IP , FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE )) {
// Deny ips like 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8 et 240.0.0.0/4, ::1/128, ::/128, ::ffff:0:0/96, fe80::/10...
$errormsg = 'Error bad hostname IP (private or reserved range). Must be an external URL.' ;
return $errormsg ;
}
if ( ! empty ( $_SERVER [ " SERVER_ADDR " ]) && $iptocheck == $_SERVER [ " SERVER_ADDR " ]) {
$errormsg = 'Error bad hostname IP (IP is a local IP). Must be an external URL.' ;
return $errormsg ;
}
2023-12-13 14:20:53 +00:00
if ( getDolGlobalString ( 'MAIN_SECURITY_ANTI_SSRF_SERVER_IP' ) && in_array ( $iptocheck , explode ( ',' , getDolGlobalString ( 'MAIN_SECURITY_ANTI_SSRF_SERVER_IP' )))) {
2023-06-03 10:06:15 +00:00
$errormsg = 'Error bad hostname IP (IP is a local IP defined into MAIN_SECURITY_SERVER_IP). Must be an external URL.' ;
return $errormsg ;
}
}
if ( $localurl == 1 ) { // Only local url allowed (dangerous, may allow to get metadata on server or make internal port scanning)
// Deny ips NOT like 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8 et 240.0.0.0/4, ::1/128, ::/128, ::ffff:0:0/96, fe80::/10...
if ( filter_var ( $iptocheck , FILTER_VALIDATE_IP , FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE )) {
$errormsg = 'Error bad hostname ' . $iptocheck . '. Must be a local URL.' ;
return $errormsg ;
}
2023-12-13 14:20:53 +00:00
if ( getDolGlobalString ( 'MAIN_SECURITY_ANTI_SSRF_SERVER_IP' ) && ! in_array ( $iptocheck , explode ( ',' , getDolGlobalString ( 'MAIN_SECURITY_ANTI_SSRF_SERVER_IP' )))) {
2023-06-03 10:06:15 +00:00
$errormsg = 'Error bad hostname IP (IP is not a local IP defined into list MAIN_SECURITY_SERVER_IP). Must be a local URL in allowed list.' ;
return $errormsg ;
}
}
// Common check on ip (local and external)
// See list on https://tagmerge.com/gist/a7b9d57ff8ec11d63642f8778609a0b8
// Not evasive url that ar enot IP are excluded by test on IP v4/v6 validity.
$arrayofmetadataserver = array (
'100.100.100.200' => 'Alibaba' ,
'192.0.0.192' => 'Oracle' ,
'192.80.8.124' => 'Packet' ,
'100.88.222.5' => 'Tencent cloud' ,
);
foreach ( $arrayofmetadataserver as $ipofmetadataserver => $nameofmetadataserver ) {
if ( $iptocheck == $ipofmetadataserver ) {
$errormsg = 'Error bad hostname IP (Used by ' . $nameofmetadataserver . ' metadata server). This IP is forbidden.' ;
return $errormsg ;
}
}
return '' ;
}
2017-10-01 16:27:54 +00:00
/**
* Function get second level domain name .
2025-07-27 23:47:34 +00:00
* For example : https :// www . abc . mydomain . com / dir / page . html returns 'mydomain' with mode 0 , 'mydomain.om' with mode 1 , 'abc.mydomain.com' with mode 2.
* For example : part1 @ mydomain . com returns 'mydomain.com' with mode 1
2017-10-01 16:27:54 +00:00
*
2025-07-27 23:47:34 +00:00
* @ param string $url Full URL or Email .
2019-06-19 20:05:38 +00:00
* @ param int $mode 0 = return 'mydomain' , 1 = return 'mydomain.com' , 2 = return 'abc.mydomain.com'
2017-10-01 16:27:54 +00:00
* @ return string Returns domaine name
2026-04-26 11:27:20 +00:00
* @ see getRootURLFromURL ()
2017-10-01 16:27:54 +00:00
*/
2019-05-29 08:03:05 +00:00
function getDomainFromURL ( $url , $mode = 0 )
2017-10-01 16:27:54 +00:00
{
2023-12-05 23:24:59 +00:00
$arrayof2levetopdomain = array (
'co.at' , 'or.at' , 'gv.at' ,
'avocat.fr' , 'aeroport.fr' , 'veterinaire.fr' ,
'com.ng' , 'gov.ng' , 'gov.ua' , 'com.ua' , 'in.ua' , 'org.ua' , 'edu.ua' , 'net.ua' ,
'net.uk' , 'org.uk' , 'gov.uk' , 'co.uk' ,
'com.mx'
);
2023-12-05 23:46:00 +00:00
// Set if tld is on 2 levels
$tldon2level = 0 ;
2023-12-05 23:24:59 +00:00
$parts = array_reverse ( explode ( '.' , $url ));
2023-12-05 23:46:00 +00:00
if ( ! empty ( $parts [ 1 ]) && in_array ( $parts [ 1 ] . '.' . $parts [ 0 ], $arrayof2levetopdomain )) {
$tldon2level = 1 ;
}
if ( $tldon2level && $mode > 0 ) {
$mode ++ ;
2023-12-05 23:24:59 +00:00
}
2025-07-27 23:47:34 +00:00
$tmpdomain = preg_replace ( '/^https?:\/\/[^:]+:[^@]+@/i' , '' , $url ); // Remove http(s)://login@pass in https://login@pass:mydomain.com/path, so we now got mydomain.com/path
$tmpdomain = preg_replace ( '/^https?:\/\//i' , '' , $tmpdomain ); // Remove http(s)://
$tmpdomain = preg_replace ( '/\/.*$/i' , '' , $tmpdomain ); // Remove part after /
$tmpdomain = preg_replace ( '/^[^@]+@/i' , '' , $tmpdomain ); // Remove part1@ in part1@part2 (for emails)
2023-12-05 23:24:59 +00:00
if ( $mode == 3 ) {
$tmpdomain = preg_replace ( '/^.*\.([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)$/' , '\1.\2.\3.\4' , $tmpdomain );
} elseif ( $mode == 2 ) {
2020-04-10 08:59:32 +00:00
$tmpdomain = preg_replace ( '/^.*\.([^\.]+)\.([^\.]+)\.([^\.]+)$/' , '\1.\2.\3' , $tmpdomain ); // Remove part 'www.' before 'abc.mydomain.com'
2023-12-05 23:46:00 +00:00
} elseif ( $mode == 1 ) {
2020-04-10 08:59:32 +00:00
$tmpdomain = preg_replace ( '/^.*\.([^\.]+)\.([^\.]+)$/' , '\1.\2' , $tmpdomain ); // Remove part 'www.abc.' before 'mydomain.com'
2019-06-19 20:05:38 +00:00
}
2023-12-05 23:46:00 +00:00
2020-10-27 20:28:26 +00:00
if ( empty ( $mode )) {
2023-12-05 23:46:00 +00:00
if ( $tldon2level ) {
$tmpdomain = preg_replace ( '/^.*\.([^\.]+)\.([^\.]+)\.([^\.]+)$/' , '\1.\2.\3' , $tmpdomain ); // Remove part 'www.abc.' before 'mydomain.com'
$tmpdomain = preg_replace ( '/\.[^\.]+\.[^\.]+$/' , '' , $tmpdomain ); // Remove TLD (.com.mx, .co.uk, ...)
} else {
$tmpdomain = preg_replace ( '/^.*\.([^\.]+)\.([^\.]+)$/' , '\1.\2' , $tmpdomain ); // Remove part 'www.abc.' before 'mydomain.com'
$tmpdomain = preg_replace ( '/\.[^\.]+$/' , '' , $tmpdomain ); // Remove TLD (.com, .net, ...)
}
2019-05-28 20:18:22 +00:00
}
2017-12-10 16:59:19 +00:00
2017-10-01 16:27:54 +00:00
return $tmpdomain ;
}
2017-12-10 16:59:19 +00:00
/**
* Function root url from a long url
* For example : https :// www . abc . mydomain . com / dir / page . html return 'https://www.abc.mydomain.com'
2024-02-08 01:08:18 +00:00
* For example : https :// www . abc . mydomain . com / return 'https://www.abc.mydomain.com'
* For example : http :// www . abc . mydomain . com / return 'http://www.abc.mydomain.com'
2017-12-10 16:59:19 +00:00
*
* @ param string $url Full URL .
* @ return string Returns root url
2026-04-26 11:27:20 +00:00
* @ see getDomainFromURL ()
2017-12-10 16:59:19 +00:00
*/
function getRootURLFromURL ( $url )
{
2024-02-08 01:08:18 +00:00
return preg_replace ( '/^([a-z]*:\/\/[^\/]*).*/i' , '$1' , $url );
2017-12-10 16:59:19 +00:00
}
/**
* Function to remove comments into HTML content
*
* @ param string $content Text content
* @ return string Returns text without HTML comments
*/
function removeHtmlComment ( $content )
{
$content = preg_replace ( '/<!--[^\-]+-->/' , '' , $content );
return $content ;
}