Oggi mi sono imbattuto per caso in un podcast del 2023, in cui lo Youtuber Italiano Lorenzo Danese intervistava un modestissimo sviluppatore di Agrigento: Salvatore Sanfilippo. Ebbene, dopo un attento ascolto ho deciso, dall’alto della mia inconfutabile opinione, che antirez, nome d’arte di Salvatore Sanfilippo, è ufficialmente il pioniere Italiano dell’Open Source Software.

Contesto

Verso non ricordo che mese di metà 2024, stavo indagando la causa di un bug su APISIX, quando mi sono imbattuto in un account GitHub che ha suscitato il mio interesse.

Apache APISIX è un API gateway completamente open source, sviluppato da API7 e donato successivamente ad Apache Software Foundation, la più grande community open source al mondo, che lo ha reso pubblico e accessibile sotto licenza Apache 2.0.

APISIX si occupa principalmente di fare il routing delle richieste agli upstream, indirizzandole in base a una serie di regole. Configurandolo adeguatamente e impostando radixtree_uri_with_parameter come router, è possibile utilizzare, nel pattern matching delle rotte, anche i path parameters. Con questo tipo di router, è possibile definire delle API come le seguenti:

  • /users/:user_id
  • /users/:user_id/orders
  • /users/:user_id/orders/:order_id

In queste API, :user_id e :order_id sono dei path parameters, tramite cui è possibile passare dei valori dinamici.

Caratteri Speciali nei Path Parameters

Gli URI seguono lo standard RFC 3986, che definisce una serie di caratteri con significato riservato (ad esempio /, ?, #, %, &). Poiché questi caratteri svolgono una funzione specifica nella struttura dell’URI, per rappresentarli come “semplici caratteri” è necessario utilizzare una codifica sicura, chiamata percent-encoding (sezione 2.1 dello standard). Il nome è dovuto al fatto che i caratteri codificati sono preceduti dal simbolo %.

In un API gateway (o un web server generico), quando si utilizzano delle rotte con path parameters, è necessario codificare adeguatamente i valori assegnati ad essi, altrimenti si generano ambiguità. Ad esempio, definendo un’API /users/:user_id, un parametro come user_id=abc/def, romperebbe l’interpretazione dell’API, poiché / è un carattere speciale, e nell’URI assume il significato di separatore. Per questo motivo, il carattere riservato / dev’essere codificato con la corrispondente sequenza %2F, ottenendo il parametro user_id=abc%2Fdef.

Il Bug

Spataccando con APISIX, mi sono accorto che assegnando a un path parameter alcuni caratteri riservati codificati, APISIX non riusciva a fare il match della richiesta, e restituiva {"error_msg": "404 Route Not Found"}. Ad esempio, definendo un’API /users/:user_id, all’epoca si ottenevano i seguenti casi:

  • path parameter senza caratteri speciali:

    curl -s "http://localhost:9080/users/abc123"
    {"result": "ok", "user_id": "abc123"} 
    
  • path parameter contenente %2F (carattere slash / percent-encodato):

    curl -s "http://localhost:9080/users/abc%2Fdef"
    {"error_msg": "404 Route Not Found"}
    
  • path parameter contenente %20 (carattere spazio percent-encodato):

    curl -s "http://localhost:9080/users/abc%20def"
    {"error_msg": "404 Route Not Found"}
    

Questo si verifica perché i valori codificati vengono decodificati prima del match della rotta, generando un comportamento anomalo. All’epoca davo la colpa al router radixtree_uri_with_parameter di APISIX; come si è scoperto in seguito, per %2F la decodifica avviene ancora prima, in Nginx.

Si noti che altri web server, proxy e API gateway, ammettono e gestiscono correttamente questo caso d’uso.

Il caso %20 si è rivelato già noto, ed è stato risolto da una patch merged a novembre 2024. Il caso %2F, invece, continuava a restituire 404, quindi l’abbiamo segnalato agli sviluppatori di APISIX.

La soluzione completa è arrivata parecchio dopo: a luglio 2026 APISIX ha integrato match_uri_encoded_slash, un’opzione opt-in che preserva %2F durante il match delle rotte, chiudendo la issue a un anno e mezzo dall’apertura.

Modulo Radix Tree

Torniamo però a metà 2024. Prima che il problema venisse preso in carico, avevamo cercato di capire quale poteva esserne la causa. E qui entra in gioco il bello di avere a disposizione software open source: sia il codice di APISIX che tutta la catena di dipendenze su cui si basa, sono completamente pubblici, accessibili, e scaricabili da tutti. Inoltre, chiunque può contribuire al progetto (seguendo i giusti criteri e controlli da parte dei maintainer). Per questo motivo, è stato possibile risalire al componente su cui ci siamo concentrati: api7/lua-resty-radixtree.

A questo punto, il malcapitato che sta leggendo questo post probabilmente si starà chiedendo “Ora che so tutto di APISIX e radix tree, cosa me ne faccio? E cosa c’entra con antirez?”. Mio caro e pazientissimo lettore, indovina un po’ gli sviluppatori di APISIX da dove hanno preso l’implementazione di radix tree? :)

Un Passo Indietro

Mentre vagavo tra un repository e l’altro nella catena di dipendenze, cercando di risalire alla radice (eheh radix) del problema…

Che oltretutto, è possibile solo perché il codice è completamente open source (grazie Apache e team di APISIX/API7 🤍)

…sono finito dentro il codice di api7/lua-resty-radixtree: un modulo OpenResty che wrappa una libreria scritta in C che implementa, appunto, l’algoritmo radix tree, esponendo delle API Lua che permettono di sfruttarlo per i casi d’uso dell’API gateway. Ma chi ha scritto la libreria C che implementa l’algoritmo? Proprio lui, antirez!

Probabilmente, gli sviluppatori di APISIX/API7, in un certo momento storico, hanno deciso di integrare nel proprio API gateway un router che sfruttasse l’algoritmo radix tree. Nel farlo, piuttosto che reinventare l’acqua calda, hanno cercato dei progetti open source, e si sono imbattuti nella libreria di antirez. Questa libreria è stata resa disponibile sotto licenza BSD 2-Clause “Simplified” (per chi non la conoscesse, è una delle licenze più permissive), e i ragazzi di APISIX/API7 hanno potuto integrarla nel loro API gateway senza problemi. Inoltre, poiché nel codice hanno mantenuto la copyright notice, sono stato in grado di risalire al suo profilo GitHub: github.com/antirez.

Stalking su GitHub

Per qualche strano difetto di fabbrica, quando scopro dei progetti interessanti mi piace spulciare i profili degli autori, per vedere se hanno contribuito anche a qualcos’altro o scoprire di più sulla loro persona. Quando sono finito sul suo profilo GitHub, sono rimasto incredibilmente sorpreso nello scoprire che:

  1. è Italiano (anche se il nome era un indizio abbastanza evidente), e soprattutto Siciliano;
  2. scrive la maggior parte dei progetti in C, un linguaggio che amo;
  3. ha tipo 22.000 follower!

Dopodiché, mi è subito caduto l’occhio sui repository in evidenza:

  • rax – A radix tree implementation in ANSI C;
  • dump1090 – Dump1090 is a simple Mode S decoder for RTLSDR devices;
  • linenoise – A small self-contained alternative to readline and libedit;
  • kilo – A text editor in less than 1000 LOC with syntax highlight and search;
  • sds – Simple Dynamic Strings library for C;
  • disque – Disque is a distributed message broker.

Se tu che stai leggendo questo post conosci antirez, sono sicuro che avrai notato qualcosa di strano: tra queste manca qualcosa di decisamente importante. Non c’è Redis!

Fast Forward ad Aprile 2025

Mi capita su YouTube una puntata del Podcast di Lorenzo Danese, in cui aveva intervistato Salvatore: “Salvatore Sanfilippo @antirez: Open Source, AI” (link al video).

Inizio ad ascoltarlo e, mentre torno a casa da lavoro in macchina, scopro che antirez, che seguo da un annetto su GitHub, è anche il creatore di Redis.

Nel video, pubblicato il 17 Ottobre 2023, Lorenzo e Salvatore affrontano e toccano diversi argomenti:

  • parallelismo tra software e architettura, durante cui Salvatore racconta un po’ come si è avvicinato all’ambiente dell’informatica e quali perplessità ha incontrato nel suo percorso scolastico;
  • la bellezza e l’importanza del software e dell’open source;
  • la storia di Redis, che è il suo progetto più popolare;
  • l’importanza di mantenere la creatività, almeno per quanto riguarda la soddisfazione personale, nonostante spesso non sia necessaria, e anzi sia controproducente, per creare valore in un sistema produttivo;
  • le sue opinioni sull’Intelligenza Artificiale e il “capitalismo informatico”.

Un episodio estremamente illuminante e piacevole da ascoltare, che consiglio di recuperare a chiunque, anche chi non ne sa nulla di informatica.

Conclusioni

Scoprire la storia di antirez è stata una piacevole sorpresa. La sua filosofia e dedizione all’open source sono ammirevoli, e mi è rimasta impressa in particolare l’introduzione del video, che riporto parafrasata:

“Guardarsi allo specchio dopo vent’anni passati in un’azienda, e rendersi conto di aver lavorato solo a progetti abbandonati, a cose di cui non me ne fregava niente, o richieste di clienti che mi sembravano inutili… Questo mi avrebbe fatto sprofondare in una crisi emotiva. Quindi ho scelto di dedicarmi a ciò che mi appassionava, e di offrirlo gratuitamente.”

Verso la fine del podcast, Salvatore menziona il libro di fantascienza che aveva pubblicato da poco, nel 2022: Wohpe, un romanzo che esplora il rapporto tra umanità e tecnologia, immergendo i lettori in un futuro dove l’IA sfida i confini tra consapevolezza e controllo.