dynamisme du langage et patch
Développant un projet faisant un appel à un webservice pour un client, je dois passer des Arrays tel un formulaire html classique. J’ai donc naturellement utilisé les fonction réseau du langage Ruby, vu que le framework que j’utilise pour ce projet n’est autre que le Ruby on Rails. Je me retrouve donc avec une librairie maison pour gérer mes appels vers ce webservice, mais petite surprise dans l’encodage des fameux Arrays : les entrées du tableaux sont simplement concaténées les unes aux autres.
On est loin de ce que devrait faire un Array dans ce cas précis !
Pour rappel, un Array nommé test avec 3 valeurs passé dans une requête POST devrait ressembler à ceci :
test[]=one&test[]=two&test[]=three
En fouillant quelque peu sur le net, on trouve en effet mention de ce bug dans la fonction censée encoder les paramètres dans un format de formulaire web. Bug ouvert il y a environ un an et toujours pas fermé bien que le patch ait été posté. On trouve même un exemple du comportement normal avec … PHP.
Ne souhaitant pas modifier les sources du langage installé sur mon système pour éviter de devoir reproduire la même chose sur les serveurs en production, j’ai décidé de tirer partie du côté dynamique du Ruby en redéfinissant la fonction dans ma petite librairie.
module Net::HTTPHeader
def set_form_data(params, sep = '&')
params_array = params.map do |k,v|Â
v.inject([]){|c, val| c << "#{urlencode(k.to_s)}=#{urlencode(val.to_s)}"}.join(sep)
end
self.body = params_array.join(sep)
self.content_type = 'application/x-www-form-urlencoded'
end
end
Ca fait vraiment plaisir de travailler avec un langage certes imparfait mais qui permet des corrections dynamiques sans hack immonde ou patch totalement horrible à maintenir en production.
Posted in geek | no comments |