sindro.me

feeling bold
on the internet

info 🇬🇧🇮🇹

Mentre installavo allegramente i prerequisiti per compilare un’applicazione su Solaris 11, ho apprezzato il fatto di trovare Mercurial già installato nel sistema base… tranne per un GROSSO problema: la digest authentication era rotta. Ho fatto un tcpdump del traffico scambiato tra il client Mercurial e il server CGI e ho visto che non veniva inviato nessun header Authorization, e ovviamente il server si rifiutava di servire il repository hg.

Prima di reinstallare Python, magari da sorgente e sostituendo l’installazione di default oppure tenendo affiancate due versioni diverse, con le conseguenti seccature e sporcizia nel sistema, ho provato un patch davvero minuscolo a urllib2.py che… con mio divertimento, ha risolto il problema:

--- urllib2.py~ Fri Jan 25 02:35:59 2008
+++ urllib2.py  Fri Jan 25 03:27:52 2008
@@ -815,7 +815,7 @@
             auth_val = 'Digest %s' % auth
             if req.headers.get(self.auth_header, None) == auth_val:
                 return None
-            req.add_unredirected_header(self.auth_header, auth_val)
+            req.add_header(self.auth_header, auth_val)
             resp = self.parent.open(req)
             return resp

Non sono un ca**o di esperto Python (ma il linguaggio è interessante), quindi non chiedetemi PERCHÉ funziona: ho semplicemente seguito il commento di add_header che diceva “questo metodo è utile per aggiungere header di autenticazione” e ho sostituito il metodo unredirected_header con il primo. Non ho proprio idea del perché con urllib2 di Python2.5 “tutto funziona” anche con quel metodo; qualcosa deve essere rotto da qualche altra parte. Un diff tra le due urllib non mi ha dato niente, dovrei davvero imparare Python prima o poi.

Non ho trovato nessuna informazione googlando parole chiave come «solaris “http {authorization,authentication}” {urllib2,python} {broken,not working} mercurial» (shell interpolation intesa), quindi spero che questo post sia utile a qualcuno ;).

Solaris sembra una bella bestia, comunque. Dovrò imparare di più anche su quello. :).