APIs e Microsserviços

6 jan, 2014

CurlFile e o SDK do Facebook no PHP 5.5

Publicidade

Um dos recursos implementados no PHP 5.5 foi o CurlFile, uma ótima adição para permitir que você especifique argumentos como um arquivo para upload.

Nas versões anteriores (antes do PHP 5.5) a sintaxe se parecia com isto:

$facebook->api("/me/photos", 'POST', [
    'source' => '@/foo/bar.jpg',
    'message' => $message,
]);

Se tiver a sorte de estar trabalhando com o PHP 5.5, esse código vai te emitir uma mensagem de sintaxe obsoleta (deprecated).

curl_setopt_array(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead

Eu tenho um manipulador de erro que exibe advertências/informações/etc. como ErrorException para me auxiliar a debugar coisas localmente e em meus servidores de teste, e isso foi algo que começou a acontecer. Um pouco de pesquisa me levou a tentar esta sintaxe:

$facebook->api("/me/photos", 'POST', [
    'source' => new CURLFile('/foo/bar.jpg', 'image/jpeg'),
    'message' => $message,
]);

Infelizmente, apesar de o Curl estar feliz com isso, o Facebook PHP SDK (v3.2.2) não está. Acontece que o SDK irá transformar QUALQUER valor que você enviar com esse array de parâmetros em uma string. Dessa forma, isto estava sendo enviado:

array(4) { 'source' => string(70) "{"name":"\/foo\/bar.jpg","mime":"image\/jpeg","postname":""}" 'message' => string(20) "This is another test" 'method' => string(4) "POST" 'access_token' => string(214) "sneakysneaky" }

Então a instância CurlFile estava sendo convertida em JSON. Não ajuda.

Eu corrigi isso com um pull request muito simples, que espero que seja incorporado em breve, já na versão v3.2.3, uma vez que o SDK do Facebook pode simplesmente não funcionar com o PHP 5.5.

Se quiser utilizar o meu fork até lá, coloque este código em seu composer.json e execute um composer update:

"repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/philsturgeon/facebook-php-sdk"
        }
    ],

Isso não é um problema no SDK do Facebook diretamente, e vou fazer um patch em outras bibliotecas nas quais esse problema ocorrer. Se você estiver utilizando o PHP 5.5, por favor, faça o mesmo com qualquer coisa que vocês encontrem, e outras pessoas não terão que se preocupar com isso.

Obs: Se alguém está pensando sobre a utilidade do CurlFile, você se lembrou de proteger os inputs feitos pelo usuário ao não iniciá-los com @? Se não fizer isso, alguém criando um “@Phil E aí cara!” tentará fazer o upload de um arquivo do seu servidor chamado “Phil E aí cara!”. Há mais do que implicações de segurança aí, então forçar pessoas a embrulhar seus uploads vai te economizar muitos problemas. Se ainda estiver no PHP 5.4, faça algo assim:

(substr($message, 0, 1) === '@') and $message = '.'.$message;

 

***

Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://philsturgeon.co.uk/blog/2013/08/curlfile-and-the-facebook-sdk-in-php-55