Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction getallheaders() non reconnue

    26 mars 2024 à 9:59:29

    Bonjour à tous

    Dans le cadre de mon boulot je suis en train de créer une API afin qu'un partenaire de mon client puisse récupérer de façon automatique des informations sur le site.

    J'ai développé le début de l'API REST en local sur wamp et ça fonctionne via une autorisation avec un Bearer token.

    Toutefois en ligne j'ai un souci d’authentification. En effet dans un premier temps je me suis rendu compte que la fonction getallheaders() ne fonctionnait pas sur leserveur. J'ai donc ajouté ce bout de code

    if(!function_exists('getallheaders')){
    
                function getallheaders(){
    		    $headers = [];
    		    foreach($_SERVER as $name => $value){
    		        if(substr($name, 0, 5) == 'HTTP_'){
    		            $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
    		        }
    		    }
    		    return $headers;
    	    }
    }


    Lors de l'appel de mon API je passe ce paramètre

     $authorization = "Authorization: Bearer ".$token;
     curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', $authorization));

    Ce qui fonctionne très bien en local ne fonctionne pas sur le serveur, le content-type et authorization ne sont pas envoyés dans l'en-tête. La seule différence entre le local et le serveur, c'est que sur le serveur on ne rentrer pas dans la fonction getallheaders(), mais dans le bout de code que j'ai du rajouter.
    J'ai fait un test en local, si je ne passe pas par la fonction native getallheaders(), je n'ai pas les informations d'en tête envoyées à l'appel de l'API.

    Donc je ne vois pas trop comment faire à part réussir à ce que le serveur puisse accepter getallheaders() sans passer par le bout de code, mais comment faire ?

    Merci d'avance pour vos réponses :)

    -
    Edité par devilyann 26 mars 2024 à 10:03:05

    • Partager sur Facebook
    • Partager sur Twitter
      26 mars 2024 à 10:19:42

      Bonjour, gère tu biens les inclusions(require, include, ..) ? Utilise par exemple des __DIR__  à la place des chemins relatifs classiques.

      Si ta fonction getAllHeaders(bien mieux que getallheaders) n'est pas reconnue tu devrais essayer de savoir pourquoi.

      Tu ne montres pas assez ton arborescence pour qu'on sache le réel problème, on fera que du tâtonnement là.

      • Partager sur Facebook
      • Partager sur Twitter
        26 mars 2024 à 13:29:54

        Salut la fonction getallrequest étant un alias à "apache_request_headers" essaie directement d'utiliser celle ci.

        pour ta fonction de remplacement str_starts_with est plus adapté que de faire un substr ligne 6 et justement je pense que ton soucis au niveau du remplacement vient de là , tu ne récupères que les éléments qui débutent par HTTP_ , si tu fais un dump sur ton $_SERVER le Content-Type s'y trouve sans HTTP_, en tous cas quand je fais le test avec postman de mon côté.

        • Partager sur Facebook
        • Partager sur Twitter

        yasakani no magatama

          26 mars 2024 à 14:37:43

          zvheer a écrit:

          Salut la fonction getallrequest étant un alias à "apache_request_headers" essaie directement d'utiliser celle ci.

          pour ta fonction de remplacement str_starts_with est plus adapté que de faire un substr ligne 6 et justement je pense que ton soucis au niveau du remplacement vient de là , tu ne récupères que les éléments qui débutent par HTTP_ , si tu fais un dump sur ton $_SERVER le Content-Type s'y trouve sans HTTP_, en tous cas quand je fais le test avec postman de mon côté.


          Oui j'ai oublié de préciser que j'avais aussi tenté la fonction apache_request_headers() mais j'ai droit comme pour getAllHeaders() à "Call to undefined function apache_request_headers()"

          Et j'avais pensé à faire un var_dump de $_SERVER pour savoir si les tests en suivant étaient bons, mais il n'y a aucune trace de l'Authorization que j'ai passé.
          Après je répète, en local sur wamp ça fonctionne bien, c'est juste que le fait que la fonction getAllHeaders() ne soit pas reconnue sur le serveur de prod fait que cela ne fonctionne pas :/

          -
          Edité par devilyann 27 mars 2024 à 15:43:21

          • Partager sur Facebook
          • Partager sur Twitter
            26 mars 2024 à 18:11:21

            Oui j'avais saisi qu'en ligne ça ne passe pas (peut être à cause de l'utilisation d'un serveur nginx)  , essaie de poster le résultat d'un dump $_SERVER après la requête postman directement sur ton site en ligne (en supprimant les infos que tu souhaites cacher).

            Si la requête est bien formée je ne vois pas pourquoi tu n'aurais pas trace de tes en-têtes dans $_SERVER

            • Partager sur Facebook
            • Partager sur Twitter

            yasakani no magatama

              27 mars 2024 à 15:51:58

              Voilà le résultat du var_dump sur $_SERVER sur le site en ligne, j'ai remplacé le site par xxx

              array(40) {
                ["PATH"]=>
                string(60) "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                ["HOSTNAME"]=>
                string(12) "0cb5f54a6097"
                ["PHP_INI_DIR"]=>
                string(18) "/usr/local/etc/php"
                ["PHP_EXTRA_CONFIGURE_ARGS"]=>
                string(63) "--enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data"
                ["GPG_KEYS"]=>
                string(40) "F38252826ACD957EF380D39F2F7956BC5DA04B5D"
                ["PHP_VERSION"]=>
                string(6) "5.4.45"
                ["HOME"]=>
                string(8) "/var/www"
                ["USER"]=>
                string(8) "www-data"
                ["FCGI_ROLE"]=>
                string(9) "RESPONDER"
                ["HTTPS"]=>
                string(2) "on"
                ["SSL_TLS_SNI"]=>
                string(6) "apache"
                ["proxy-nokeepalive"]=>
                string(1) "1"
                ["HTTP_HOST"]=>
                string(22) "www.xxx.com"
                ["HTTP_ACCEPT"]=>
                string(3) "*/*"
                ["CONTENT_TYPE"]=>
                string(16) "application/json"
                ["HTTP_X_FORWARDED_FOR"]=>
                string(12) "51.68.11.199"
                ["HTTP_X_FORWARDED_PROTO"]=>
                string(5) "https"
                ["HTTP_ACCEPT_ENCODING"]=>
                string(4) "gzip"
                ["SERVER_SIGNATURE"]=>
                string(0) ""
                ["SERVER_SOFTWARE"]=>
                string(37) "Apache/2.4.29 (Ubuntu) OpenSSL/1.1.0g"
                ["SERVER_NAME"]=>
                string(22) "www.xxx.com"
                ["SERVER_ADDR"]=>
                string(10) "172.22.0.9"
                ["SERVER_PORT"]=>
                string(3) "443"
                ["REMOTE_ADDR"]=>
                string(11) "172.22.0.10"
                ["DOCUMENT_ROOT"]=>
                string(16) "/app/public_html"
                ["REQUEST_SCHEME"]=>
                string(5) "https"
                ["CONTEXT_PREFIX"]=>
                string(0) ""
                ["CONTEXT_DOCUMENT_ROOT"]=>
                string(16) "/app/public_html"
                ["SERVER_ADMIN"]=>
                string(28) "webmaster@xxx.com"
                ["SCRIPT_FILENAME"]=>
                string(34) "/app/public_html/api/sd/agenda.php"
                ["REMOTE_PORT"]=>
                string(5) "44946"
                ["GATEWAY_INTERFACE"]=>
                string(7) "CGI/1.1"
                ["SERVER_PROTOCOL"]=>
                string(8) "HTTP/1.1"
                ["REQUEST_METHOD"]=>
                string(3) "GET"
                ["QUERY_STRING"]=>
                string(0) ""
                ["REQUEST_URI"]=>
                string(18) "/api/sd/agenda.php"
                ["SCRIPT_NAME"]=>
                string(18) "/api/sd/agenda.php"
                ["PHP_SELF"]=>
                string(18) "/api/sd/agenda.php"
                ["REQUEST_TIME_FLOAT"]=>
                float(1711550855.2962)
                ["REQUEST_TIME"]=>
                int(1711550855)
              }

              et l'appel de l'API

              $token = "xxxxxxxxx";
              
              header('Content-Type: application/json'); // Specify the type of data
              if($_SERVER["HTTP_HOST"] == "localhost") $ch = curl_init('http://localhost/xxx/api/sd/agenda.php'); // Initialise cURL
              else $ch = curl_init('https://www.xxx.com/api/sd/agenda.php'); // Initialise cURL    
              $authorization = "Authorization: Bearer ".$token; // Prepare the authorisation token
              curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', $authorization)); // Inject the token into the header
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
              curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // This will follow any redirects
              $result = curl_exec($ch); // Execute the cURL statement  
              
              curl_close($ch); // Close the cURL connection




              -
              Edité par devilyann 27 mars 2024 à 15:52:40

              • Partager sur Facebook
              • Partager sur Twitter
                27 mars 2024 à 16:00:14

                Salut

                Est-ce que tu as un .htaccess quelque part qui, lors de la redirection ou la réécriture, ne reprendrait pas les en-têtes ?

                Est-ce que par hasard ce ne serait pas le module Apache qui serait utilisé sur le serveur de production, mais FastCGI ?

                Auquel cas, est-ce qu'il n'y a pas une configuration à effectuer pour qu'Apache envoie les données à PHP, ce qu'il fait "automatiquement" en module mais pas autrement ?

                -
                Edité par Ymox 27 mars 2024 à 16:08:38

                • Partager sur Facebook
                • Partager sur Twitter
                  27 mars 2024 à 16:19:43

                  Salut

                  Malheureusement je n'ai pas accès au serveur du client :'(

                  Celui qui s'en occupait est parti, et mon client est sur le point de trouver un remplaçant, pour ça que je suis un peu bloqué pour savoir s'il y a un souci côté serveur ou pas.

                  Après je reprécise si en local je ne passe pas par getallheaders(), mais par la variable $_SERVER, là aussi je n'ai pas le content-type et l'authorization retournés.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Fonction getallheaders() non reconnue

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown