Supporting the community

Ghid pentru a invata scrip-uri CGI in REXX si Perl

 

Ultima actualizare: Julie 24, 1998.


 
 

Contine


Introducere

Acest ghid este facut pentru oamenii ce vor sa-si scrie propriul cod  WWW scripturi exacutabile folosind WWW's Common Gateway Interface ( CGI). Desi accentul principal este pe REXX multe exemple sunt de asemenea oferite in Perl.

Exista unele librarii simple de script-uri CGI . cgi-lib.rxx sunt librarii de functii REXX (disponibile la SLAC folosind REXX
CALL PUTENV 'REXXPATH=/afs/slac/www/slac/www/tool/cgi-rexx'
declaratie de a include biblioteca la timpul de executie)si cgi-lib.pl este o librarie similara in Perl scrisa de Steve Brenner (exista o copie executabila a acestei biblioteci la SLAC in /afs/slac/g/www/cgi-lib/cgi-lib.pl). NCSA are un set foarte util de subroutines Perl CGI ce sunt disponibile pe FTP anonime. Alt set de script-uri Perl CGI Server Side scris de Brigitte Jellinek este disponibil sub licenta publica Gnu. De asemenea mai este Codul sursa pentru script-urilesi programele www.stanford.edu. De asemenea exista si un index pentru Perl WWW, programe stranse de Earl Hood. In final, vedeti Centrul pentru Dezvoltare Web.

 


Din moment ce exista riscuri de securitate si alte riscuri asociate cu executarea scripturilor de utilizator intr-un server WWW, cititorul ar putea dori sa vizualizeze mai intai un document care ofera informatii cu privire la SLAC Security Wrapper pentru utilizatori de script-uri' CGI. Pe langa ca s-ar imbunatatii securitatea, Acest invelis simplifica scrierea de script CGI pentru incepatori.

 

 

Inainte sa te apuci sa scrii un script, s-ar putea sa vrei sa verifici si notite despre SLAC Web Utilities Oferit de CGI Script-uri.

 

CGI este o interfata de scris programe externe, sau portaluri, sub un server de informatii. In prezent, serverele de informatii suportate sunt HTTP (Protocolul de Transport folosit de serverele WWW).

Programele de portaluri sunt programe executabile (e.g. script-uri UNIX) ce pot fi rulate de ele insele (dar nu ai vrea o exceptie ca sa identifici erorile). Au fost facute executabile pentru a le permite sa ruleze sub diferite (posibil foarte diferite) servere informationale interschimbabile. Programele portal daca urmezi specificatiile pot fi scrise in orice limbaj, incluzand REXX sau Perl, ce produce un fisier executabil.

 

Introducand Script

Aportul poate fi trimis script-ului in mai multe moduri, in functie de Uniform Resource Locator (URL) sau un Formular HyperText Markup Language (HTML):

  • QUERY_STRING Variabila de mediu

    QUERY_STRING este definit ca orice urmeaza primul ? In Adresa folosita la accesarea portalului. Aceasta informatie poate fi adaugata de un document HTML ISINDEX , sau de un Formular HTML (cu actiunea GET ). Ar putea fi integrat manual ca HTML hypertext link, sau anchor, ce face trimitere spre portal. Acest sir, o sa fie o interogare de informatii, e.g. ce vrea sa caute utilizatorul in baza de date, sau poate rezultatele codate ale formularului de raport. Poate fi accesat in REXX folosind String=GETENV('QUERY_STRING')
    sau in Perl folosind $string=$ENV('QUERY_STRING');

     

  • Acest sir este codat in formatul stardard URL care schimba spatiul cu + si codificarea caracterelor speciale %xx cu codare hexazecimala . O sa trebuiasca sa-l decodezi ca sa-l folosesti. Poti sa revizuiesti cgi-lib.rxx REXX PROCEDURE DeWeb sau in Perl fragment de cod ce arata cum sa decodezi caracterele speciale.

  • Daca serverul nu decodeaza rezultatele dintr-un Formular, vei primi de asemenea sirul de interogare decodificat pe linia de comanda. Asta inseqamna ca sirul de interogare o sa fie disponibil in REXX prin comanda PARSE ARG, sau in Perl $ARGV[n] array.

    De exemplu, daca aveti un URL http://www.slac.stanford.edu/cgi-bin/foo?hello+world si vedeti REXX command PARSE ARG Arg1 Arg2 then Arg1 o sa contina "hello" si Arg2 o sa contina "lume" (i.e. semnul + este inlocuit cu un spatiu).
    In Perl $ARGV[1] contine "hello" and $ARGV[2] contine "world". Daca doresti sa accesezi folosind linia de comanda, datele trebuiesc procesate mai putin inainte de folosire.

     

  • PATH_INFO Variabila de Mediu

    Majoritatea timpului, vei vrea sa trimiti date spre portalurile tale de care clientul nu ar trebui sa-si bata joc . Asemenea informatie ar putea fi numele Formularului ce genereaza rezultatele trimise.

    CGI permita ca extra informatii sa fie cuprinse in  URL si asa poate fi folosit ca sa furnizeze informatii suplimentare specifice unui anumit context pentru script-uri. Aceasta informatie este disponibila ca "extra" informatie, dupa ce pui calea in URL. Aceasta informatie nu este encodata de server in vreun fel. Poate fi accesat in  REXX folosind String=GETENV('PATH_INFO'), sau in Perl folosind $string=$ENV('PATH_INFO');

    Ca sa ilustram asta, sa zicem ca un script CGI este accesibil serverului meu si are numele foo. Cand il accesez pe foo dintr-un document, vreau sa-i zic lui foo ca ma aflu in directorul de limba Engleza, nu directorul porc Latin. In acest caz, as putea sa-mi accesez scropt-ul intr-un document HTML precum:

    <A HREF="http://www/cgi-bin/foo/language=english">foo</A>

    Cad serverul executa foo, o sa rezulte PATH_INFO of /language=english, iar programul poate decoda asta si sa se comporte cum trebuie.

    PATH_INFO si QUERY_STRING pot fi combinate. De exemplu, URL-ul:
    http://www/cgi-bin/htimage/usr/www/img/map?404,451
    o sa faca ca serverul sa ruleze script-ul htimage. Ramane informatia unde e calea " /usr/www/img/map" to htimage in PATH_INFO variabila de mediu, and pass " 405,451" in variabila QUERY_STRING . In acest caz, htimage este un script pentru implementarea hartilor active suportate de CERN HTTPD.

     

  •  
  • Input Standard

    Daca formularul tau are METHOD="POST" in eticheta formularului, programul tau CGI o sa primeasca formularul encodat pe calea corecta ( stdin in Unix). Serverul nu o sa-ti trimita un EOF la sfarsitul datelor, in schimb, ar trebui sa folosesti CONTENT_LENGTH pentru a determina cat de multe date sa citeasca din stdin. Poti face asta in REXX folosind In=CHARIN(,1,GETENV('CONTENT_LENGTH')), sau in Perl folosind read(STDIN,$in,$ENV{'CONTENT_LENGTH'});

     

    Daca doresti sa treci intrarea standard in alt script pe care il vei apela mai tarziu, atunci vei vrea sa cgi-lib.rxx REXX PROCEDURE ReadPost.

 

 

 

 

 

 

 

 

 

 

 

Poti sa revizuiesti REXX Code Fragment dand un exemplu cum sa citeasca diferitele forme de introducere in script.

Procedura REXX ReadForm impreuna cu MethGet and MethPost, toate disponibile in cgi-lib.rxx, pot fi folosite sa simplifice operatiunea de introducere a datelor.

 

Decodand introducerea formularelor

Cand scrii un formular, fiecare introducere are un name eticheta. Cand utilizatorul introduce date in aceste formulare, informatia respectiva este codata in datele formularului.Valoarea fiecarui obiect ce este data de utilizator se numeste value.

Data formularului este un sir de name=value perechi separate de caracterul (&). Fiecare name=value perechea este encodata URL, i.e. spatile se schimba in semnul plus si cateva caractere sunt codate in hexadecimal.
Pentru a decodifica datele din formular trebuie sa analizezi mai intai blocul de date formate separat in name=value perechi fara semn. Dupa trebuie parcurs name=value sa devina perechi separatein name si value. Folositi primul semn egal ca sa impartit datele. Daca exista mai mult de unu, atunci ceva este in neregula cu data. Din nou, scapati de semnele egale. La final, refacem URL-ul encodand name si value.

 

Poti recapitula script-ul REXX sau Perl dand exemple de decodare a formei de introducere.

Cand folosim name si value ca informatie in script, trebuie sa avem grija la:

  • nimic nu dicteaza ordine in care name=value o sa fie concatanat;
  • nu orice name si value definita in forma este trimisa de client, de exemplu daca nimic nu este selectat intr-o lista de derulare ca name sau value o sa fie trimis;
  • mai mult de o valoare poate fi trimisa pentru un anumit nume, de exemplu, in cazul in care o lista de derulare permite selectarea mai multor optiuni.

Trimitand documentul inapoi catre client

Programele CGI pot returna foarte multe tipuri de fisiere. Pot trimite inapoi o imagine clientului, un document HTML, un document text, un Post-script sau poate chiar u fisier audio cu functiile. Pot sa returneze si referinte altor documente (ca sa economisim spatiu nu vom da exemple, mai multe informatii se pot gasi in NCSA's CGI Primer). Clientul trebuie sa stie ca documentul trimis, poate fi afisat in mod corespunzator. Ca, clinetul sa stie asta, programul CGI trebuie sa zica serverului ce tip de fisier returneaza.

Ca sa spui serverului ce tip de fisier sa trimita inapoi, CGI are nevoie de un head-er unde sa fie trecuta informatia. Acest head-er este in format  ASCII, compus din linii separate fie prin linii sau se intorc urmate tot de de linii. Scrip-ul tau trebuie sa contina doua astfel de linii inainte sa ajunga la client. Aceste linii sunt folosite pentru a indica tipul de MIME al documentului urmator.

Tipuri MIME uzuale relevante pentru WWW sunt:

  • A "text" Content-Type ce este utilizat pentru a reprezenta informatii textuale intr-un numar de seturi de caractere si descrierea textului limbii intr-un mod standardizat.Cele mai folosite subtipuri sunt:
    • text/plain: text fara cerinte speciale de formatare.
    • text/html: text cu comenzi HTML incorporate
  •  
  • An "application" Content-Type, ce e folosit pentru a transmite date de aplicatie sau binare. Doua subtipuri frecvent folosite sunt:
    • application/postscript: Data se afla in PostScript, si trebuie sa ajunga in PostScript .
    • application/binary: data este intr-un format binar necunoscut, cum ar fi rezultatele unui transfer.
  •  
  • An "image" Content-Type pentru transmiterea de imagine statica (poza). SUnt multe subtipuri posibile, dar cele mai des folosite sunt WWW :
    • image/gif: o imagine in format GIF.
    • image/xbm: o imagine in format X Bitmap.
    • image/jpeg: o imagine in format JPEG.

     

 

 

Ca sa zici serverului ce capacitate ai, prima linia ar trebuie sa fie asa:
Content-type: type/subtype
unde type/subtype in MIME tip si subtip pentru capacitatea ta.

Trebuie sa trimiteti urmatoarea linie. Cu specificatiile curente, A DOUA LINIE TREBUIE SA FIE GOALA. Asta inseamna ca nu trebuie sa aiba ceva in ea. Odata ce serverul primeste linia, stie ca ai terminat de zis serverului ce linii sa introduca si le serveste singur. Daca sari aceasta linie, serverul o sa incerce sa analizez randamentul incercand sa afle informatii despre cererea ta si o sa devi foarte nefericit.

Putetei revedea REXX Code Fragment dand un exemplu ca Content-type information.

Dupa ce aceste linii au fost setate spre stdout (e.g. o commanda REXX SAY ) o sa fie introdusa in documentul trimis spre client. Capacitatea trebuie sa fie consistenta cu Content-type header. De exemplu, daca in cap de tabel este specificat Content-type text/html atunci rezultatul trebuie sa includa formatarea HTML asa 
or

pentru a incepe linie noua 

 pentru inlaturarea formatarii automate HTML's .

 

Diagnosticarea si raportarea erorilor

Din moment ce stdout este inclus in document, trimite spre diagnosticare cu comanda SAY, o sa apara in document. Puteti sa revedeti un cod REXX cum arata un exemplu de raport de diagnoza.

Daca apar erori (e.g. nu sunt introduse date, s-au gasit caracatere invalide, prea multe argumente specificate, cererea unei comenzi invalide sa fie executata, sintaxa invalida sau variabila nedefinita intalnita in script-uri REXX ) scrip-ul ar trebui sa dea informatii detaliate ce e ok si ce nu este. Poate fi foarte folositor pentru a furniza informatii cu privire la setarea diverselor variabile de mediu WWW ce sunt setate.

CGIerror, CGIdie si MyURL REXX PROCEDUREs in cgi-lib.rxx furnizeaza asistenta in furnizarea erorilor. Pe langa REXX fragmente de cod ce folosesc CGIerror si CGIdie si de asemenea tipic CGIerror output and CGIdie output.

 

Doua script-uri usoare de tip WWW REXX CGI 

Ca serverul tau sa ruleze script-uri CGI trebuie:

  • Scrie script-ul. Ca sa simplifici, s-ar putea sa vrei sa profiti de libraria de functii cgi-lib.rxx , incluzand unele introduse mai devreme pe aceasta pagina. Niste exemple simple dar complete ce ar ajuta:
    1. source of a script to enable a UNIX finger function.
    2. source of a minimal HTTP Form and Script.
  •  
  • Fa script-ul sa fie executabil de catre server-ul tau web. La SLAC pe Unix se face cu comanda chmod , e.g.
    • chmod o+x /u/sf/cottrell/bin/cgi1.rxx
      chmod u+x /u/sf/cottrell/bin/cgi1.rxx
  •  
  • Vorbeste cu Web Masterul sa adauge o regula sa setul de reguli ca sa permita serverul-ui sa-ti execute script-ul. Mai multe informatii despre regulile serverul-ului W3C  si fisiere, se poate gasi aici: Configuration File of W3C httpd, precum si un exemplu simplu al acesteia..

 

 

 

Web Masterii vor vrea sa se asigure de aspectele de siguranta ale script-urilor tale inaitne sa-l adauge in fisierul cu reguli.

 

Alte surse de informatie

  • Carte:
    • Cartea HTML & CGI Unleashed are multe informatii folositoare despre script-uri CGI, C, Perl si REXX.
    • Cartea Introduction to CGI/PERL by Steve Brenner & Edwin Aoki este o introducere folositaore pentru script-uri CGI in Perl.
  •  
  • Writing World-Wide Web CGI Scripts in REXX prezentata primavara 1996 SHARE Technical Conference, Martie 7, 1996, Anaheim California.
  • The NetRexx Language Page furnizeaza informatii despre un proiect experimental de Mike Cowlishaw (autorul lui REXX) pentru a crea Rexx si Java.
  • Deasemenea nu uitati de comp.infosystems.www.authoring.cgi care discuta despre script-uri (CGI) si legatura lor cu Web page authoring. 
  • World Wide Web (Intrebari frecvente, cu raspunsuri) multe raspunsuri, multe intrebari despre World Wide Web in general.
  • Daca folositi Perl si aveti o itnrebare despre Perl ce nu este o intrebare specifica CGI, verificati Perl FAQ.
  • Daca vei scrie cod Windows NT atunci vezi Somarsoft - Windows NT probleme de securitate

 

 

Recunostiinte

Marea parte a textului provine din documente NCSA. Informatii folositoare au fost obtineute de la The World-Wide Web: How Servers Work, de Mark Handley si John Crowcroft, publicata in ConneXions, Februarie 1995.

50 Pageviews
Mar. 01st - Mar. 31st
 
 
 

Translated by: Irina Vasilescu

Link to the original page: Click Here

We love giving back to the community

We believe in helping people and that matter to us more than anything else. Since the very beginning of our company, our team have been willing and wishing to help.