Documentation du code de SPIP et de ses plugins

SPIP

Distant

Table of Contents

_DELAI_RECUPERER_URL_CACHE  = 3600
_INC_DISTANT_CONNECT_TIMEOUT  = 10
_INC_DISTANT_CONTENT_ENCODING  = 'gzip'
_INC_DISTANT_MAX_SIZE  = 2097152
_INC_DISTANT_USER_AGENT  = 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')'
_INC_DISTANT_VERSION_HTTP  = 'HTTP/1.0'
_REGEXP_COPIE_LOCALE  = ',' . \preg_replace('@^https?:@', 'https?:', $GLOBALS['meta']['adresse_site'] ?? '') . '/?spip.php[?]action=acceder_document.*file=(.*)$,'
copie_locale()  : bool|string
Crée au besoin la copie locale d'un fichier distant
valider_url_distante()  : false|string
Valider qu'une URL d'un document distant est bien distante et pas une url localhost qui permet d'avoir des infos sur le serveur inspiree de https://core.trac.wordpress.org/browser/trunk/src/wp-includes/http.php?rev=36435#L500
prepare_donnees_post()  : array<string|int, mixed>
Preparer les donnes pour un POST si $donnees est une chaine - charge a l'envoyeur de la boundariser, de gerer le Content-Type, de séparer les entetes des données par une ligne vide etc... - on traite les retour ligne pour les mettre au bon format - on decoupe en entete/corps (separes par ligne vide) si $donnees est un tableau - structuration en chaine avec boundary si necessaire ou fournie et bon Content-Type
url_to_ascii()  : array<string|int, mixed>|string
Convertir une URL dont le host est en utf8 en ascii Utilise la librairie https://github.com/phlylabs/idna-convert/tree/v0.9.1 dans sa derniere version compatible toutes version PHP 5 La fonction PHP idn_to_ascii depend d'un package php5-intl et est rarement disponible
recuperer_url()  : array<string|int, mixed>|bool
Récupère le contenu d'une URL au besoin encode son contenu dans le charset local
recuperer_url_cache()  : array<string|int, mixed>|bool|mixed
Récuperer une URL si on l'a pas déjà dans un cache fichier
recuperer_body()  : bool|int|string
Recuperer le contenu sur lequel pointe la resource passee en argument $taille_max permet de tronquer de l'url dont on a deja recupere les en-tetes
recuperer_entetes_complets()  : bool|array<string|int, mixed>
Lit les entetes de reponse HTTP sur la socket $handle et retourne false en cas d'echec, un tableau associatif en cas de succes, contenant : - le status - le tableau complet des headers - la date de derniere modif si connue - l'url de redirection si specifiee
nom_fichier_copie_locale()  : string
Calcule le nom canonique d'une copie local d'un fichier distant
fichier_copie_locale()  : string
Donne le nom de la copie locale de la source
recuperer_infos_distantes()  : array<string|int, mixed>|false
Récupérer les infos d'un document distant, sans trop le télécharger
distant_trouver_extension_selon_headers()  : false|mixed
need_proxy()  : string
Tester si un host peut etre recuperer directement ou doit passer par un proxy
init_http()  : array<string|int, mixed>
Initialise une requete HTTP avec entetes
lance_requete()  : bool|resource
Lancer la requete proprement dite

Constants

_DELAI_RECUPERER_URL_CACHE

public mixed _DELAI_RECUPERER_URL_CACHE = 3600

_INC_DISTANT_CONNECT_TIMEOUT

public mixed _INC_DISTANT_CONNECT_TIMEOUT = 10

_INC_DISTANT_CONTENT_ENCODING

public mixed _INC_DISTANT_CONTENT_ENCODING = 'gzip'

_INC_DISTANT_MAX_SIZE

public mixed _INC_DISTANT_MAX_SIZE = 2097152

_INC_DISTANT_USER_AGENT

public mixed _INC_DISTANT_USER_AGENT = 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')'

_INC_DISTANT_VERSION_HTTP

public mixed _INC_DISTANT_VERSION_HTTP = 'HTTP/1.0'

_REGEXP_COPIE_LOCALE

public mixed _REGEXP_COPIE_LOCALE = ',' . \preg_replace('@^https?:@', 'https?:', $GLOBALS['meta']['adresse_site'] ?? '') . '/?spip.php[?]action=acceder_document.*file=(.*)$,'

Functions

copie_locale()

Crée au besoin la copie locale d'un fichier distant

copie_locale(string $source[, string $mode = 'auto' ][, string $local = null ][, int $taille_max = null ][, string $callback_valider_url = null ]) : bool|string

Prend en argument un chemin relatif au rep racine, ou une URL Renvoie un chemin relatif au rep racine, ou false

Parameters
$source : string
$mode : string = 'auto'
  • 'test' - ne faire que tester
  • 'auto' - charger au besoin
  • 'modif' - Si deja present, ne charger que si If-Modified-Since
  • 'force' - charger toujours (mettre a jour)
$local : string = null

permet de specifier le nom du fichier local (stockage d'un cache par exemple, et non document IMG)

$taille_max : int = null

taille maxi de la copie local, par defaut _COPIE_LOCALE_MAX_SIZE

$callback_valider_url : string = null

fonction de callback pour valider l'URL finale apres redirection eventuelle

Tags
link
https://www.spip.net/4155
pipeline_appel

post_edition

Return values
bool|string

valider_url_distante()

Valider qu'une URL d'un document distant est bien distante et pas une url localhost qui permet d'avoir des infos sur le serveur inspiree de https://core.trac.wordpress.org/browser/trunk/src/wp-includes/http.php?rev=36435#L500

valider_url_distante(string $url[, array<string|int, mixed> $known_hosts = [] ]) : false|string
Parameters
$url : string
$known_hosts : array<string|int, mixed> = []

url/hosts externes connus et acceptes

Return values
false|string

url ou false en cas d'echec

prepare_donnees_post()

Preparer les donnes pour un POST si $donnees est une chaine - charge a l'envoyeur de la boundariser, de gerer le Content-Type, de séparer les entetes des données par une ligne vide etc... - on traite les retour ligne pour les mettre au bon format - on decoupe en entete/corps (separes par ligne vide) si $donnees est un tableau - structuration en chaine avec boundary si necessaire ou fournie et bon Content-Type

prepare_donnees_post(string|array<string|int, mixed> $donnees[, string $boundary = '' ]) : array<string|int, mixed>
Parameters
$donnees : string|array<string|int, mixed>
$boundary : string = ''
Return values
array<string|int, mixed>

entete,corps

url_to_ascii()

Convertir une URL dont le host est en utf8 en ascii Utilise la librairie https://github.com/phlylabs/idna-convert/tree/v0.9.1 dans sa derniere version compatible toutes version PHP 5 La fonction PHP idn_to_ascii depend d'un package php5-intl et est rarement disponible

url_to_ascii(string $url_idn) : array<string|int, mixed>|string
Parameters
$url_idn : string
Return values
array<string|int, mixed>|string

recuperer_url()

Récupère le contenu d'une URL au besoin encode son contenu dans le charset local

recuperer_url(string $url[, array<string|int, mixed> $options = [] ]) : array<string|int, mixed>|bool
Parameters
$url : string
$options : array<string|int, mixed> = []

bool transcoder : true si on veut transcoder la page dans le charset du site string methode : Type de requête HTTP à faire (HEAD, GET, POST, PUT, DELETE) int taille_max : Arrêter le contenu au-delà (0 = seulement les entetes ==> requête HEAD). Par defaut taille_max = 1Mo ou 16Mo si copie dans un fichier array headers : tableau associatif d'entetes https a envoyer string|array datas : Pour envoyer des donnees (array) et/ou entetes au complet, avec saut de ligne entre headers et donnees ( string @see prepare_donnees_post()) (force la methode POST si donnees non vide) string boundary : boundary pour formater les datas au format array bool refuser_gz : Pour forcer le refus de la compression (cas des serveurs orthographiques) int if_modified_since : Un timestamp unix pour arrêter la récuperation si la page distante n'a pas été modifiée depuis une date donnée string uri_referer : Pour préciser un référer différent string file : nom du fichier dans lequel copier le contenu int follow_location : nombre de redirections a suivre (0 pour ne rien suivre) string version_http : version du protocole HTTP a utiliser (par defaut defini par la constante _INC_DISTANT_VERSION_HTTP)

Tags
uses
init_http()
uses
recuperer_entetes_complets()
uses
recuperer_body()
uses
transcoder_page()
uses
prepare_donnees_post()
Return values
array<string|int, mixed>|bool

false si echec array sinon : int status : le status de la page string headers : les entetes de la page string page : le contenu de la page (vide si copie dans un fichier) int last_modified : timestamp de derniere modification string location : url de redirection envoyee par la page string url : url reelle de la page recuperee int length : taille du contenu ou du fichier

string file : nom du fichier si enregistre dans un fichier

recuperer_url_cache()

Récuperer une URL si on l'a pas déjà dans un cache fichier

recuperer_url_cache(string $url[, array<string|int, mixed> $options = [] ]) : array<string|int, mixed>|bool|mixed

Le délai de cache est fourni par l'option delai_cache Les autres options et le format de retour sont identiques à la fonction recuperer_url

Parameters
$url : string
$options : array<string|int, mixed> = []

int delai_cache : anciennete acceptable pour le contenu (en seconde)

Tags
uses
recuperer_url()
Return values
array<string|int, mixed>|bool|mixed

recuperer_body()

Recuperer le contenu sur lequel pointe la resource passee en argument $taille_max permet de tronquer de l'url dont on a deja recupere les en-tetes

recuperer_body(resource $handle[, int $taille_max = _INC_DISTANT_MAX_SIZE ][, string $fichier = '' ]) : bool|int|string
Parameters
$handle : resource
$taille_max : int = _INC_DISTANT_MAX_SIZE
$fichier : string = ''

fichier dans lequel copier le contenu de la resource

Return values
bool|int|string

bool false si echec int taille du fichier si argument fichier fourni string contenu de la resource

recuperer_entetes_complets()

Lit les entetes de reponse HTTP sur la socket $handle et retourne false en cas d'echec, un tableau associatif en cas de succes, contenant : - le status - le tableau complet des headers - la date de derniere modif si connue - l'url de redirection si specifiee

recuperer_entetes_complets(resource $handle[, int|bool $if_modified_since = false ]) : bool|array<string|int, mixed>
Parameters
$handle : resource
$if_modified_since : int|bool = false
Return values
bool|array<string|int, mixed>

int status string headers int last_modified string location

nom_fichier_copie_locale()

Calcule le nom canonique d'une copie local d'un fichier distant

nom_fichier_copie_locale(string $source, string $extension) : string

Si on doit conserver une copie locale des fichiers distants, autant que ca soit à un endroit canonique

Parameters
$source : string

URL de la source

$extension : string

Extension du fichier

Tags
note

Si ca peut être bijectif c'est encore mieux, mais là tout de suite je ne trouve pas l'idee, étant donné les limitations des filesystems

Return values
string

Nom du fichier pour copie locale

fichier_copie_locale()

Donne le nom de la copie locale de la source

fichier_copie_locale(string $source) : string

Soit obtient l'extension du fichier directement de l'URL de la source, soit tente de le calculer.

Parameters
$source : string

URL de la source distante

Tags
uses
nom_fichier_copie_locale()
uses
recuperer_infos_distantes()
Return values
string

Nom du fichier calculé

recuperer_infos_distantes()

Récupérer les infos d'un document distant, sans trop le télécharger

recuperer_infos_distantes(string $source[, array<string|int, mixed> $options = [] ]) : array<string|int, mixed>|false
Parameters
$source : string

URL de la source

$options : array<string|int, mixed> = []

int $taille_max : Taille maximum du fichier à télécharger bool $charger_si_petite_image : Pour télécharger le document s'il est petit string $callback_valider_url : callback pour valider l'URL finale du document apres redirection

Return values
array<string|int, mixed>|false

Couples des informations obtenues parmis :

  • 'body' = chaine
  • 'type_image' = booleen
  • 'titre' = chaine
  • 'largeur' = intval
  • 'hauteur' = intval
  • 'taille' = intval
  • 'extension' = chaine
  • 'fichier' = chaine
  • 'mime_type' = chaine

distant_trouver_extension_selon_headers()

distant_trouver_extension_selon_headers(string $source, string $headers) : false|mixed
Parameters
$source : string
$headers : string
Return values
false|mixed

need_proxy()

Tester si un host peut etre recuperer directement ou doit passer par un proxy

need_proxy(string $host[, string $http_proxy = null ][, string $http_noproxy = null ]) : string

On peut passer en parametre le proxy et la liste des host exclus, pour les besoins des tests, lors de la configuration

Parameters
$host : string
$http_proxy : string = null
$http_noproxy : string = null
Return values
string

init_http()

Initialise une requete HTTP avec entetes

init_http(string $method, string $url[, bool $refuse_gz = false ][, string $referer = '' ][, string $datas = '' ][, string $vers = 'HTTP/1.0' ][, string $date = '' ]) : array<string|int, mixed>

Décompose l'url en son schema+host+path+port et lance la requete. Retourne le descripteur sur lequel lire la réponse.

Parameters
$method : string

HEAD, GET, POST

$url : string
$refuse_gz : bool = false
$referer : string = ''
$datas : string = ''
$vers : string = 'HTTP/1.0'
$date : string = ''
Tags
uses
lance_requete()
Return values
array<string|int, mixed>

lance_requete()

Lancer la requete proprement dite

lance_requete(string $method, string $scheme, array<string|int, mixed> $user, string $host, string $path, string $port, bool $noproxy[, bool $refuse_gz = false ][, string $referer = '' ][, string $datas = '' ][, string $vers = 'HTTP/1.0' ][, int|string $date = '' ]) : bool|resource
Parameters
$method : string

type de la requete (GET, HEAD, POST...)

$scheme : string

protocole (http, tls, ftp...)

$user : array<string|int, mixed>

couple (utilisateur, mot de passe) en cas d'authentification http

$host : string

nom de domaine

$path : string

chemin de la page cherchee

$port : string

port utilise pour la connexion

$noproxy : bool

protocole utilise si requete sans proxy

$refuse_gz : bool = false

refuser la compression GZ

$referer : string = ''

referer

$datas : string = ''

donnees postees

$vers : string = 'HTTP/1.0'

version HTTP

$date : int|string = ''

timestamp pour entente If-Modified-Since

Return values
bool|resource

false|int si echec resource socket vers l'url demandee

Search results