Un cadru Python 3 pentru scrierea serverelor ICAP

Instalare

Puteti utiliza pachetul imediat, daca copiati fisierul pyicap.py pe PYTHONPATH sau in directorul modulului dvs. python.

Un pachet setup.py este furnizat impreuna cu pachetul, rulati-l pentru a instala pachetul:

pip3 / easy_install nu stie inca despre acest lucru

De asemenea, puteti instala cu pip sau usor de instalat:

Ce este ICAP?

Pentru o descriere tehnica uscata si precisa, consultati RFC 3507.

ICAP este un protocol care este utilizat de proxy-uri HTTP pentru a solicita unui serviciu separat (un server ICAP) sa faca modificari la cererile si raspunsurile HTTP pe care le transmite proxy. Un astfel de proxy este un client ICAP.

ICAP poate fi utilizat pentru a verifica permisiunile, a scana virusi, pentru a plasa anunturi sau pentru a modifica anteturile, continutul sau solicitarea adreselor URL sau a cererilor si / sau a raspunsurilor HTTP. Acestea se pot face fara a modifica codul serverului proxy.

Popularul software proxy Squid 3.x accepta protocolul ICAP, iar acest cadru a fost testat cu Squid3.

Proiecta

Protocolul ICAP seamana foarte mult cu HTTP / 1.1, asa ca am ales sa modific clasa stocului Python BaseHTTPServer in acest scop.

Este important sa retineti ca ICAP NU ESTE o aplicatie HTTP, nici un protocol incorporat in ea. Daca trebuie mentionata o relatie, as spune ca ICAP este un frate al HTTP, mai degraba este un copil.

Datorita acestei relatii, un server sau client HTTP nu poate fi extins in mod banal (sau chiar corectie de maimuta) pentru a gestiona ICAP. Acesta este motivul pentru care aleg sa copiez, apoi rescriu complet clasa BaseHTTPServer

Cum functioneaza?

Puteti utiliza un cadru prin importarea de lucruri din pachetul pyicap, extinderea clasei de gestionare a protocolului si pornirea serverului, trecand handlerul catre acesta:

#! / bin / env python # – * – coding: utf8 – * – import aleatoriu SocketServer din pyicap import * class ThreadingSimpleServer (SocketServer.ThreadingMixIn, ICAPServer): pass class ICAPHandler (BaseICAPRequestHandler): def echo_OPTIONS (self): self. set_icap_response (200) self.set_icap_header (‘Metode’, ‘RESPMOD’) self.set_icap_header (‘Preview’, ‘0’) self.send_headers (Fals) def echo_RESPMOD (self): self.no_adaptation_required () port = 13440 server = ThreadingSimpleServer ((”, port), ICAPHandler) incercati: in timp ce 1: server.handle_request () cu exceptia KeyboardInterrupt: print “Finalizat”

Exemplul de mai sus este un exemplu resemnat SimpleHTTPServer cu threading. SocketServer.ThreadingMixin poate fi utilizat cu ICAPServer la fel cum l-ati folosi cu SimpleHTTPServer.

Pentru fiecare punct final al serviciului exista o pereche de metode.

videos pornos de abuelas videos putas maduras
sex porne coños de viejas
porno casero en españa porno madres peludas
sexo casero españa porno traducido español
pornotrans como folla mi mujer
incesto ruso hentaihd
maduras españolas camara oculta madura cabalgando
españolas amater paja en el coche
incesto lesbianas videosgays
videos porno gay de españoles caras llenas de semen
videos chicas gratis folladas extremas
cerdas com gratis porno casero real español
mamada de rodillas orgia bisexual
video sexo gratis tetudas españolas
porno andaluz porno torrent magnet
mi primera follada videos de chicas gratis
abuelas españolas xxx parejas pilladas en la calle
miakalifa maduras por dinero
cartoon xxx www rubias
como folla mi mujer tetudas jovenes

Exemplul actual pur si simplu nu face nimic spunand clientului ICAP ca solicitarea nu necesita nicio modificare.

ICAP defineste trei metode asemanatoare HTTP: OPTIONS, REQMOD si RESPMOD.

OPTIUNILE trebuie tratate in fiecare caz. Un punct final trebuie sa accepte fie REQMOD, fie RESPMOD, dar nu si ambele. Cu toate acestea, acest lucru nu este pus in aplicare si, conform documentatiei Squid 3, o astfel de supraincarcare va functiona chiar si cu Squid.

REQMOD este apelat, atunci cand o cerere HTTP trebuie modificata – cum ar fi verificarea accesului la o adresa URL, eliminarea sau adaugarea parametrilor sirului de interogare sau a datelor POST, modificarea anteturilor sau modificarea cererii in alt mod.

RESPMOD este apelat atunci cand un raspuns HTTP trebuie modificat – cum ar fi verificarea fisierelor care trebuie descarcate pentru virusi, filigranarea imaginilor sau fisierelor audio, plasarea de bannere publicitare sau modificarea in alt mod a continutului si / sau a anteturilor cererii.

ICAP functioneaza cu adrese URL la fel ca HTTP. Fiecare serviciu ICAP are o adresa URL ca:

icap: //icap.myorganization.com/place_banners

Cadrul PyICAP va analiza aceasta adresa URL, determina metoda ICAP de apelat (OPTIUNI, REQMOD sau RESPMOD) si apeleaza una dintre metodele de gestionare furnizate de utilizator (probabil). Daca serverul ICAP nu poate gasi o metoda de gestionare, returneaza o eroare 404.

In acest exemplu particular, se numeste metoda place_banners_ () ( poate fi reqmod sau respmod).

O cerere OPTIONS declanseaza metoda corespunzatoare _options (), in acest caz place_banners_options ().

Diverse informatii pot fi extrase din cererea ICAP examinand anumite campuri ale obiectului handler:

  • enc_req: linie de cerere incapsulata, lista cu 3 elemente
  • enc_req_headers: anteturi de solicitare incapsulate, dictionar de liste
  • enc_res_status: starea raspunsului incapsulat
  • enc_res_headers: anteturi de raspuns incapsulate
  • has_body: Adevarat, daca cererea ICAP are un corp
  • servicename: numele punctului final al serviciului
  • incapsulat: contine continutul antetului „Encapsulat:” ca dict
  • ieof: Adevarat, daca read_chunk () intalneste o extensie ieof chunk
  • comanda: comanda curenta ICAP
  • request_uri: contine URI-ul complet al cererii ICAP
  • versiune: versiunea daca cererea ICAP curenta
  • previzualizare: Niciuna sau un numar intreg care a ajuns in antetul Previzualizare
  • allow: Contine un set () de Allow: -ed stuff
  • icap_response_code: contine codul de raspuns daca set_icap_reponse a fost apelat.

Exista mai multe metode de asistenta care pot fi apelate in timp ce serviti un requets:

  • send_error (error_code): Trimite si intregul raspuns de eroare ICAP
  • no_adaptation_required (): Trimite un raspuns care inseamna ca lasa nealterat mesajul incapsulat. Onoreaza antetul Allow si trimite 204 Nu este necesara nicio adaptare daca clientul a permis un astfel de raspuns.
  • cont (): Trimite un raspuns ICAP 100 Continuare catre client. Poate fi folosit pentru a solicita clientului sa continue sa trimita date dupa o previzualizare.
  • read_chunk (): Citeste o bucata de la client. Retineti ca acest apel se blocheaza. Daca nu exista date disponibile pe linie si se foloseste Conexiune: pastrare in viata, serverul se blocheaza. Aceasta metoda trebuie apelata numai daca este sigur ca vor exista date disponibile in cele din urma. Daca returneaza un sir gol, inseamna ca este ultima bucata si nu ar trebui executata nicio alta citire. De asemenea, seteaza variabila ieof la True, daca se intalneste extensia ieof. Aceasta extensie este trimisa in timpul unei previzualizari daca mesajul incapsulat se potriveste integral in previzualizare. Daca ieof este Adevarat, continuarea () nu trebuie apelata.
  • set_icap_response (cod): seteaza raspunsul ICAP
  • set_enc_status (stats): Seteaza linia de stare incapsulata
  • set_enc_request (request): Seteaza linia de solicitare incapsulata
  • set_enc_header (antet, valoare): setati un antet incapsulat. Apelurile multiple vor face ca antetul sa fie trimis de mai multe ori. Acest lucru este util, de exemplu, pentru cookie-uri: anteturi.
  • set_icap_header (antet, valoare): setati un antet ICAP. Retineti ca acest lucru nu trebuie utilizat in mod normal, deoarece toate anteturile ICAP necesare sunt setate automat de cadrul (cum ar fi ISTag, Encapsulated, Date, Server etc.)
  • send_headers (has_body = False): poate fi utilizat dupa setarea antetelor ICAP si incapsulate. Parametrul has_body semnaleaza existenta unui corp de mesaj incapsulat.
  • send_chunk (date): scrie o bucata catre client. O bucata goala trebuie scrisa ca ultima bucata. Datele trebuie trimise dupa trimiterea antetelor corespunzatoare fie cu send_header () sau enc_header () / icap_header () + send_headers (). Cele doua metode de trimitere a antetului nu trebuie amestecate. Daca trimiteti date cu send_headers, parametrul has_body trebuie setat pentru a indica in mod corespunzator existenta sau absenta unui corp de mesaj incapsulat.