JaXy, un proxy HTTP in Java

Rendo disponibile per il download un proxy HTTP che ho scritto in Java.

Il proxy effettua le operazioni base di un proxy, supportando il protocollo HTTP 1.1 e rispettando l’RFC 2616:

1. il client (browser) richiede una risorsa (URL);
2. il proxy intercetta la richiesta;
3. il proxy controlla la propria memoria cache per vedere se può rispondere al client direttamente oppure se deve richiedere la risorsa (URL) al server finale;
4. il server finale risponde al proxy;
5. il proxy aggiorna la propria memoria cache con la risposta del server;
6. il proxy crea un nuovo pacchetto ed invia la risposta al client. […]

Rendo disponibile per il download un proxy HTTP che ho scritto in Java.

Il proxy effettua le operazioni base di un proxy, supportando il protocollo HTTP 1.1 e rispettando l’RFC 2616:

  1. il client (browser) richiede una risorsa (URL);
  2. il proxy intercetta la richiesta;
  3. il proxy controlla la propria memoria cache per vedere se può rispondere al client direttamente oppure se deve richiedere la risorsa (URL) al server finale;
  4. il server finale risponde al proxy;
  5. il proxy aggiorna la propria memoria cache con la risposta del server;
  6. il proxy crea un nuovo pacchetto ed invia la risposta al client.

Nella figura seguente è mostrata la logica del funzionamento di un proxy HTTP.

HTTP_Proxy_architecture
Funzionamento di un proxy HTTP

Da Wikipedia: “In computer networks, a proxy server is a server (a computer system or an application) that acts as an intermediary for requests from clients seeking resources from other servers. A client connects to the proxy server, requesting some service, such as a file, connection, web page, or other resource available from a different server. The proxy server evaluates the request as a way to simplify and control their complexity.

L’applicazione non è una servlet ma è un server stand-alone, dunque non necessita di servlet engine o container (come Tomcat).

L’applicazione si chiama JaXy, abbreviazione di Java Proxy, ed è scaricabile e utilizzabile secondo la licenza GPLv3 al seguente link:

JaXy-v0.1.tar.gz – Initial release (2012-06-20):

  • supporto per HTTP 1.1, secondo le specifiche dell’RFC 2616
  • interfaccia semplice a linea di comando
  • supporto per IPv4

Matteo

Eccezioni in Java: come gestirle correttamente

Oggi vediamo le eccezioni in Java, ma non spiegherò cosa sono (ci sono miliardi di documenti sul web al riguardo), piuttosto farò un po’ di chiarezza su quali tipi di eccezioni esistono e su come gestirle correttamente.

Brevemente, in Java un’eccezione è un evento che si può presentare durante l’esecuzione di un programma, e che interrompe il normale flusso delle istruzioni. A livello pratico, un’eccezione è un oggetto che viene creato al presentarsi dell’errore, e la gerarchia delle classi è visibile nella seguente figura, e ha come padre Throwable. […]

Oggi vediamo le eccezioni in Java, ma non spiegherò cosa sono (ci sono miliardi di documenti sul web al riguardo), piuttosto farò un po’ di chiarezza su quali tipi di eccezioni esistono e su come gestirle correttamente.

Brevemente, in Java un’eccezione è un evento che si può presentare durante l’esecuzione di un programma, e che interrompe il normale flusso delle istruzioni. A livello pratico, un’eccezione è un oggetto che viene creato al presentarsi dell’errore, e la gerarchia delle classi è visibile nella seguente figura, e ha come padre Throwable.

eccezioni_java
Gerarchia delle eccezioni Java

Ci sono 2 classi distinte: Error e Exception. A sua volta, la classe Exception può essere suddivisa in questo modo:

  • eccezioni controllate (checked): possono verificarsi indipendentemente dalle scelte del programmatore, per esempio un errore durante la lettura di un file.
  • eccezioni non controllate (unchecked): classi RuntimeException e Error. Possono verificarsi indipendentemente dalle scelte del client/utente, e possono invece dipendere dalla realizzazione di codice poco robusto, come ad esempio eccezioni NullPointerException (colpa del programmatore).

Questa distinzione è molto importante, perché ci dice quali sono le eccezioni da prendere in considerazione durante la scrittura di un programma e dunque quali sono le eccezioni da gestire. Come suggerisce giustamente il nome :-), le eccezioni controllate devono necessariamente essere gestite all’interno di un programma, con i canonici comandi try/catch, altrimenti il compilatore non sarà in grado di compilare con successo il codice. Le eccezioni controllate possono ad esempio essere generate con l’apertura di un file o di una risorsa (IOException), oppure con l’acceso o manipolazione di un database (SQLException), e le cause sono esterne al programma stesso. Per questo motivo il programmatore deve gestire adeguatamente le eccezioni di questo tipo, non sapendo se saranno sollevate (la risorsa può non essere disponibile, la connessione al database può essere stata interrotta, …). Un semplice codice di esempio può essere il seguente:

try {
//apertura file
}catch (FileNotFoundException fnfe)
{
System.err.println("FileNotFoundException: " + fnfe.getMessage());
}

Le eccezioni non controllate invece non devono obbligatoriamente essere gestite, in quanto non dovrebbero sollevarsi in presenza di codice ben scritto (tutti noi scriviamo codice robusto no?! ;-)). In ogni caso è bene controllare attentamente il codice scritto al fine di evitare brutte sorprese ed evitare assolutamente eccezioni del tipo: un puntatore è nullo (NullPointerException), è state effettuata una divisione di un numero per zero (ArithmeticException), … Ad esempio un codice come il seguente:

try
{
int x;//input fornito dall'utente
System.out.println(5/x);
}catch(ArithmeticException ae)
{
System.err.println(ae.getMessage());
}

dovrebbe essere sostituito con il seguente codice:

int x;//input fornito dall'utente
if(x == 0)
{
System.out.println("Errore: l'input fornito è errato. Non è accettato il valore 0.");
System.exit(1);
}else
{
System.out.println(5/x);
}

Per ulteriori approfondimenti sulle eccezioni in generale leggere:

roghan

Utility Java per convertire numeri esadecimali

Ho realizzato in Java una piccola utility da linea di comando che effettua la conversione di un numero decimale in uno esadecimale e viceversa. Prima di vedere come utilizzarla, vediamo brevemente cos’è un numero esadecimale, per chi non lo ricordasse ;-).

Da wikipedia: “Il sistema numerico esadecimale (spesso abbreviato come esa o hex) è un sistema numerico posizionale in base 16, cioè che utilizza 16 simboli invece dei 10 del sistema numerico decimale tradizionale. Per l’esadecimale si usano in genere simboli da 0 a 9 per le prime dieci cifre, e poi le lettere da A a F per le successive sei cifre, per un totale di 16 simboli.”
[…]

Ho realizzato in Java una piccola utility a linea di comando che effettua la conversione di un numero decimale in uno esadecimale e viceversa. Prima di vedere come utilizzarla, vediamo brevemente cos’è un numero esadecimale, per chi non lo ricordasse ;-).

Da wikipedia: “Il sistema numerico esadecimale (spesso abbreviato come esa o hex) è un sistema numerico posizionale in base 16, cioè che utilizza 16 simboli invece dei 10 del sistema numerico decimale tradizionale. Per l’esadecimale si usano in genere simboli da 0 a 9 per le prime dieci cifre, e poi le lettere da A a F per le successive sei cifre, per un totale di 16 simboli.

Nella seguente tabella è visibile la conversione da decimale a esadecimale a binario.

Ad esempio, se abbiamo il numero esadecimale 1F5A, possiamo effettuare la conversione in decimale nel seguente modo: (1 x 16^3) + (15 x 16^2) + (5 x 16^1) + (10 x 16^0) = 8026. Inoltre, spesso un numero esadecimale viene indicato anteponendo al numero 0x, specialmente nei sistemi Unix-like, diventando ad esempio 0x1F5A.

Nel momento in cui l’utility viene avviata con il comando HCT (acronimo di Hex Conversion Tool, la classe che contiene il main), viene fornito il seguente menu:

$ java HCT
                       _____________________________
                      /                             \
                     |      Hex Conversion Tool      |
                     |             v1.0              |
                      \_____________________________/

            [ Matteo Cappelli aka roghan | matcap83@libero.it ]

[ Options ]
 1 - convert decimal to hex
 2 - convert hex to decimal
 3 - exit

Choose an option:
|

L’utility, con la relativa documentazione javadoc, è scaricabile dal seguente link:

roghan