|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Un semplice tunnel http
Devo far transitare il protocollo di due applicazioni tramite protocollo http, in modo da poter passare attraverso proxy. La mia idea è far aprire al client un canale con GET, dove il server imposta nella risposta un Content-Type: application/octet-stream e Transfer-Encoding: chunked, quindi procede ad inviare i dati nel formato previsto da questo transfer; il client apre un canale con POST e invia i dati nella stessa maniera.
Essendo alquanto ignorante della materia, chiedo: - si può usare Transfer-Encoding: chunked con POST? - sarebbe bello poter utilizzare la stessa connessione per inviare i dati sia in un verso che nell'altro. E' possibile? (da alcune prove che ho fatto, sembrerebbe di no)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Fammi capire devi ottenere un canale di comunicazione bidirezionale e, soprattutto, sempre aperto tramite HTTP ?
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Ho appena visto, ad esempio, che non posso fare una trasmissione "chunked" con POST o PUT. O, almeno, squid non la supporta. Riguardo il canale bidirezionale, mi sono messo l'anima in pace. Se ne sai qualcosa sulle tecniche a disposizione, ogni consiglio è bene accetto.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
ma devi farlo tu applicativamente?
usare un supporto esterno (tipo http://www.nocrew.org/software/httptunnel.html ) non è un'opzione? |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Vediamo, me ne vengono in mente due:
- Sfrutti Java RMI ed il supporto tunnel HTTP (è realizzato tramite CGI) in modo da pacchettizzare i dati in chunk da inviare tramite oggetti RMI. - Se entrambi gli endpoint sono dietro ad un proxy HTTP: ti crei una servlet che permetta riceve i dati a pacchetti (tramite POST) e specularmente invia i dati da trasmettere all'altra servlet. Ovviamente di fatto sono due connessioni HTTP separate. |
![]() |
![]() |
![]() |
#7 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Più che utilizzare cose esistenti, volevo qualche dritta sul protocollo in se per implementare una soluzione semplice tagliata per il mio caso specifico. Il protocollo http in se non è complesso.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 20-03-2007 alle 16:54. |
||
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sul lato pratico...l'architettura esistente qual è ?
Server | Proxy <<<-->>> Client Client | Proxy <<<-->>> Server Suppongo la seconda, giusto ? Il proxy è trasparente o non trasparente ? |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Da quello che ho visto fin'ora, la trasmissione s->c è facilmente realizzabile tramite un GET e una risposta chunked. Questo mi offre la massima flessibilità sui dati trasmessi. La parte c->s è un pò più complicata, visto che non posso usare il trucco della trasmissione "chunked" devo usare un classico POST esplicitando il content length ed attendendo l'http ok di risposta. L'identificazione dei due canali come un unico strato di trasporto posso farla impostando un "fake cookie" nel GET, e rimandandolo indietro nel POST. Il cookie passa tranquillamente il proxy. Dovrebbe andare, credo...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Sì la seconda. Dovrebbe funzionare sia in modalità proxy trasparente che esplicito (posso configurare il client per uno dei due casi).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Fai per favore qualche prova di questo tipo, a seconda del proxy dovrebbe funzionare.
Inizia la connessione in HTTP 1.1 in questo modo il proxy dovrebbe capire che deve lasciare aperta una connessione fino a quando uno degli endpoint non la chiude. Così puoi scambiarti dati continuamente con una sequenza POST dal client/risposta del server. Dal Client invia una richiesta POST avente come destinazione il tuo server e nel body mettici i dati RAW (fregatene dell'encoding visto che è una cosa che dovrebbe riguardare solo il server di destinazione e il proxy possibilmente non dovrebbe metterci le mani). L'unica cosa consistente dovrebbe essere la dimensione dei dati da specificare nell'header. Dal server rispondi con un header HTTP/1.1 200 (importante anche qui la dimensione dei dati) e gli ci butti dietro i dati di risposta in RAW. Ovviamente il client non potrà inviare un POST di dimensione incgnita quindi stabilisci la dimensione massima da bufferizzare e quando il buffer è pieno trasmetti. Il server dovrà sempre rispondere ad una richiesta POST anche se non ha dati da trasmettere. La connessione *dovrebbe* rimanere aperta quindi di fatto hai una connessione bidirezionale anche se devi pacchettizzare i dati. |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Sto facendo proprio prove di questo tipo, dovrebbe funzionare. L'unica incognita è se il proxy decide di buttare giu spontaneamente una connessione keep alive. Sul secondo canale potrei anche tollerarlo tutto sommato, il canale iniziato con GET invece non dovrebbe cadere.
Sto facendo le prove con squid, che implementa solo l'http 1.0 (ma l'encoding chunked lo fa passare, questo è importante).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:34.