Wspólny Interfe s Bramy Interfe s do serwera WWW Program serwer

Transkrypt

Wspólny Interfe s Bramy Interfe s do serwera WWW Program serwer
Komunikacja
Pobierz formularz.html
Przegldarka
WWW
Serwer
WWW
login=SUSZI haso=WSZiB
CGI
CGI (Common Gateway Interface)
Wspólny
Int erfejs Bram y
do serwera WWW
Program serw er WWW
Int erfejs
Dwie strategie
Program generuj cy
kod HTML
PERL,
Ruby,
C,
C+ +
...
Kod HTML
zawieraj cy
program
PHP,
JSP (Java),
ASP
(VBScript ,Jscript , .
.)
Program generujcy kod HTML
...
cout << ”<h1>” << login << ”</h1>” << endl; <h1>SUSZI</h1>
if(prawidowy(login) && prawidowe(haso)) {
cout << ”Witamy”<< endl;
Witamy
...
...
}
else
cout << ”Nieprawidowy login lub haso” << endl;
...
Kod HTML zawierajcy program
...
<h1>SUSZI</h1>
<h1><% cout<< login << endl; %></h1>
<%
if(prawidowy(login) && prawidowe(haso))
{
%>
Witamy
Witamy
...
...
<% } else {%>
Nieprawidowy login lub haso
<% } %>
...
Formularz HTML – przykad 1
<form action="/cgi-bin/skrypt.cgi" method="GET"
enctype="application/x-www-form-urlencoded">
<!--<form action="mailto:adres e-mail?subject=temat"
method="POST" enctype="text/plain"> -->
<label>Login
<input type="TEXT" name="login">
</label><br>
<label>Haso
<input type="PASSWORD" name="haslo">
</label><br>
<input type="SUBMIT">
<input type="RESET">
</form>
Formularz HTML – przykad 2
<form action="/cgi-bin/skrypt.cgi" method="POST"
enctype="multipart/form-data">
<fieldset>
<legend>Pola do wypenienia</legend>
<textarea name="wiadomosc">
Tre wiadomoci
</textarea>
<br>
Plik do wysania
<input type="FILE" name="plik" accept="image/jpeg,image/gif">
<input type="HIDDEN" name="id_nadawcy" value="1">
</fieldset>
<input type="SUBMIT">
<input type="RESET">
</form>
XForms - wprowadzenie
Aplik acja XML osadzana w inny ch dokum ent ach XML
Niezale no od sprz t u i opr ogram ow ania
Dane oddzielone od sposobu ich pr ezent acji
Kont r ola dany ch w pr ow adzony ch przez u y t k ow nik a
Mo liw o oper ow ania na z o ony ch dany ch zapisanych w XML
or az pr zechow y w anie ak t ualnego st anu t y ch danych po st ronie
klient a
Mo liw o realizacji z o ony ch for m ularzy (w ielost ronicow e,
m ast er -det ails, …)
Mo liw o dy nam icznego st er ow ania w y gl dem for m ularza,
akt yw no ci pól, it p.
Mo liw o w y kony w ania oblicze , w y w iet lania rezult at ów oraz
w st aw iania r ezult at ów do w y nik ow y ch dany ch
Obs uga zdarze XForms – przykad 1
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://www.w3.org/2002/xforms" lang="pl">
<head>
<f:model xmlns="">
<f:instance>
<dane><imie/><nazwisko/></dane>
</f:instance>
<f:submission id="1" method="post" action="skrypt.cgi"/>
</f:model>
</head>
<body>
<h1>Nasz pierwszy formularz XForms.</h1>
<p>Podaj dane osobowe:</p><br/>
<f:input ref="imie"><f:label>Imi: </f:label></f:input>
<f:input ref="nazwisko"><f:label>Nazwisko: </f:label></f:input>
<f:submit submission="1"><f:label>Wylij dane</f:label></f:submit>
</body>
</html>
<?xml version=”1.0” ?>
<dane>
<imie>Stanisaw</imie>
<nazwisko>Polak</nazwisko>
</dane>
XForms - przykad 2
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:xf = "http://www.w3.org/2002/xforms"
xmlns:xs = "http://www.w3.org/2001/XMLSchema">
<head><title>Prosty przykad</title>
<style>xf\:input xf\:label {width: 8ex}</style>
<xf:model id="model" xmlns="">
<xf:instance id="dane">
<dane>
<napis>tekst</napis>
<liczba>7</liczba>
</dane>
</xf:instance>
<xf:instance id="temp"><temp><dlugosc/></temp></xf:instance>
<xf:bind nodeset="liczba" type="xs:integer"/>
<xf:bind id="i_dl" nodeset="instance('temp')/dlugosc"
calculate="string-length(instance('dane')/napis)"/>
<xf:submission id="zapis" action="file:w.xml" method="put"
replace="none"/>
</xf:model>
</head>
<body>
<h3>Prosty przykad</h3>
<xf:input ref="napis"><xf:label>Napis:</xf:label></xf:input>
<xf:output bind="i_dl"><xf:label>dugo: </xf:label></xf:output> zn.
<br/>
<xf:input ref="liczba"><xf:label>Liczba:</xf:label></xf:input>
<br/><hr/>
<xf:submit submission="zapis"><xf:label>Submit</xf:label></xf:submit>
</body>
</html>
<?xml version=”1.0”?>
<dane>
<napis>tekst</napis>
<liczba>7</liczba>
</dane>
Wysyanie danych z formularza
danych serw er WWW
Zat w ierd zenie
kodow anie
<form enctype=”...” method=”...”>...</form>
GET
POST
application/x-www-form-urlencoded
multipart/form-data
Kodowanie „application/x-www-formurlencoded” - przykad
Kod
HTML
<form action=”http://www.serwer.com/skrypt.cgi”>
Podaj swoje imi <input name=imie type=TEXT><br>
Podaj swoje nazwisko <input name=nazwisko type=TEXT>
</form>
Podaj swoje imi
Jan
Strona
WWW
Podaj swoje nazwisko Kowalski (Nowak)
imie=Jan&nazwisko=Kowalski+%28Nowak%29
Zakodowane
dane
Kodowanie „application/x-www-formurlencoded” - wysyanie danych
action=http://www.server.com/skrypt.cgi
GET /skrypt.cgi?imie=Jan&nazwisko=Kowalski+%28Nowak%29
HTTP/1.0
POST /skrypt.cgi HTTP/1.0
Content-Length: 38
Content-Type: application/x-www-form-urlencoded
imie=Jan&nazwisko=Kowalski+%28Nowak%29
Kodowanie „multipart/form-data”
POST /skrypt.cgi HTTP/1.0
Content-Length: 775
Content-Type: multipart/form-data; boundary=---------------------------8152765018186645991017906692
-----------------------------8152765018186645991017906692
Content-Disposition: form-data; name="imie"
Jan
-----------------------------8152765018186645991017906692
Content-Disposition: form-data; name="nazwisko"
Kowalski (Nowak)
-----------------------------8152765018186645991017906692
Content-Disposition: form-data; name="plik"; filename="obraz.jpg"
Content-Type: image/jpeg
Zawarto pliku „obraz.jpg
-----------------------------8152765018186645991017906692
<form action=”...” method=”POST”
enctype=”multipart/form-data”>
<input name=imie type=TEXT>
<input name=nazwisko type=TEXT>
<input name=plik type=FILE>
</form>
Jan
Kowalski (Nowak)
obraz.jpg
Skrypt CGI - otrzymywane dane
Inform acje
(poprzez zm ienne
rodow iskow e)
O przegl darce
O serwerze
O program ie CGI
Zak odow an e
dane z form u larzy
GET zm ienna rodowiskow a
POST St din
Przykadowe zmienne rodowiskowe
REQUEST_METHOD
QUERY_STRING
CONTENT_LENGTH
CONTENT_TYPE
GET kontra POST
Met oda
„ GET”
QUERY_STRING
Lim it
Met oda
„ POST”
St din
CONTENT_LENGTH
Brak lim it u
Wysyka danych ze skryptu CGI
Wypisanie
nag ówk a
„ Cont ent -t ype”
„ Locat ion”
Wypisanie
dan ych na St dout
Przykadowe typy danych (MIME)
t ex t /plain
t ex t /ht m l
im age/g if
video/m peg
Przykadowy skrypt CGI w C
main()
{
}
Content-type: text/html
printf (”Content-type: text/html\n\n”);<html>
<head>
printf (”<html>\n<head>\n”);
<title>Witaj</title>
printf (”<title>Witaj</title>\n”);
</head>
printf (”</head>\n<body>\n”);
<body>
printf (”<h1>Witaj</h1>\n”);
<h1>Witaj</h1>
printf (”</body>\n</html>\n”);
</body>
return 0;
</html>
ledzenie skryptu CGI
dziennik b dów
linii kom en d
st derr
Z
export REQUEST_METHOD= ‘ GET’
export
QUERY_STRING= ‘pole1= wart o 1& pole2= wart o 2& ...’
/t m p/$USER/ht t pd/cgi-bin/skrypt .cgi
Bezpieczne skrypty CGI
Skryp t
pow inien rob i t y lko, do
czego zost a pr zeznaczony
Przegl dar ka nie pow inna
dost aw a wi cej inform acji ni pot rzebuje
Nie w olno ufa u yt kow nikowi w
kw est ii popraw no ci pod aw any ch
inform acji
Zalety i wady CGI
Zalet y
Wady
Prost ot a
Niezale no j zyk
archit ekt ura
Izolacja procesów
Mo liwo przekazywania
param et rów do
program ów
Nie t rzeba m odyfikowa przegl darek
Ma a wy dajno Generowanie ca o ci
dokum ent u WWW
Bezst anowo
Brak int egracji z
serwerem
FastCGI
Serwer 1
FastCGI
danie
danie
Serwer 2
Przegldarka
WWW
Przykad
#include "fcgi_stdio.h" /* biblioteka fcgi ; powinna by doczona jako pierwsza*/
#include <stdlib.h>
int count;
void initialize(void) {
count=0;
}
void main(void) {
/* Inicjalizacja */
initialize();
/* Ptla odpowiedzi. */
while (FCGI_Accept() >= 0) {
printf("Content-type: text/html\r\n" "\r\n"
"<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
"<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
"Request number %d running on host <i>%s</i>\n",
++count, getenv("SERVER_HOSTNAME"));
}
}
Zalety i wady FastCGI
Zalet y
Elast yczno CGI
Wy dajno
Trwa o procesów, obs uga wielu klient ów
Kom pat ybilno z CGI
Try b CGI
Niezale no Izolacja procesów
Mo liwo przet w arzania rozproszonego
Proces Fast CGI pracuj cy na innym w le
Prost a m igracja
Wady
Konieczno rekonfiguracji serw era
Ustawianie „ciasteczka”
Set -Cookie: NAME= VALUE;
[ EXPIRES= d at a; PATH= cie ka;
DOMAIN= dom ena;SECURE]
Form at dat y:
DD-MM-YY HH:MM:SS GMT
DOMAIN oraz PATH - przykad
DOMAIN=icsr.agh.edu.pl
PATH=/publications/
„ciasteczko” bdzie wysane
„ciasteczko” nie bdzie wysane
http://www.icsr.agh.edu.pl/publications/index.html
http://www.icsr.agh.edu.pl/ads/index.html
http://www.agh.edu.pl/publications/pub2001.html
Usuwanie/zmiana „ciasteczka”
Usu wanie
Odpowiednie param et ry
Dat a z przesz o ci
Zm iana
Odpowiednie param et ry
Inna w art o
Wysyka/odbieranie „ciasteczka
Nag ów ek
Cookie:
NAME1= VALUE1;NAME2= VALUE2 ...
HTTP_COOKIE
Odczyt danych z formularza - ogólny
algorytm
GET
REQUEST_METHOD
POST
Odczytaj dane zawarte w
QUERY_STRING
Odczytaj ze standardowego
wejcia CONTENT_LENGTH
bajtów danych
Rozkoduj dane zakodowane
metod ' application/x-wwwform-urlencoded'
Rozkoduj dane zakodowane
metod CONTENT_TYPE
Biblioteka CGIC
Darm owa
bibliot eka do ANSI-C
ród o
ht t p://w ww .bout ell.com /cgic/
Przykad
<form action="skrypt.cgi">
#include <cgic.h>
int cgiMain()
<input type="text" name="nazwa">
{
<input type="submit">
char *bufor;
</form>
int rozmiar;
cgiHeaderContentType("text/html");
if(cgiFormStringSpaceNeeded("nazwa",&rozmiar) == cgiFormSuccess){
bufor=(char *)calloc(rozmiar,sizeof(char));
if(bufor != NULL){
if(cgiFormString("nazwa",bufor,rozmiar) == cgiFormSuccess)
fprintf(cgiOut,"Pole \"nazwa\" zawiera napis <b>%s</b>",bufor);
free(bufor);
}
}
else
fprintf(cgiOut,"Formularz nie zawiera pola \"nazwa\"\n");
return 0;
}
Biblioteka CGICC
Darm owa
bibliot eka do C+ +
ród o
ht t p://w ww .gnu.org/soft w are/cgicc/
Przykad
#include <iostream>
#include <vector>
#include <string>
#include "cgicc/Cgicc.h"
#include "cgicc/HTTPHTMLHeader.h"
#include "cgicc/HTMLClasses.h"
using namespace std;
using namespace cgicc;
int main(int argc, char **argv) {
try {
Cgicc cgi;
cout << HTTPHTMLHeader() << endl;
cout << html() << head(title("Cgicc - przykad")) << endl;
cout << body() << endl;
form_iterator name = cgi.getElement("nazwa");
if(name != cgi.getElements().end()) {
cout << "Wartoci pola \"nazwa\" jest napis: " << **name << endl; }
cout << body() << html();
}catch(exception& e) { // handle any errors - omitted for brevity }
}
róda
T. Traczyk , „ Xform s”
D. Trajkow ska, „ Tworzenie form ularzy Xf orm s” , CHIP
03/2006
C. Sobaniec, „ Com m on Gat eway Int erf ace”
ht t p://www.fast cgi.com /