PDA

Visualizza la versione completa : [C] Server HTTP e composizione del corpo del Response


flattit82
12-08-2009, 21:34
Salve a tutti,
devo realizzare un semplice server http in linguaggio C in grado di trattare oltre a file html anche file jpg e png. Se il parsing della richiesta da parte del browser ha successo, nel senso che la richiesta può essere soddisfatta, devo comporre un messaggio di risposta di questo tipo:


HTTP/1.0 200 OK
Content-Type: ...
Content-Length: ...
Server: ...

<body>

Per comporre il corpo del messaggio devo leggere in modo binario il file da inviare in modo da ricopiare i byte letti nel body? Una volta composto il messaggio lo posso inviare tranquillamente con un'unica send? Non mi devo preoccupare della dimensione del corpo?
Qualore aveste suggerimenti o spezzoni di codice d'esempio sarò ben felice di prenderli in cosiderazione. Grazie a tutti e buona serata,

F.

mondobimbi
12-08-2009, 22:09
sì, il file lo leggi in modo binario e lo scrivi pari pari.
L'header lo puoi invece scrivere come testo, ricordandoti di lasciare una riga vuota prima del corpo.
Infine invii il tutto, tutto in una volta con una sola send.
ciao
sergio

flattit82
13-08-2009, 23:11
Ciao Sergio,
anzitutto grazie per la risposta. Il pezzo di codice che ho scritto ricopia (almeno dovrebbe) pari pari il file, qualsiasi esso sia, in un buffer allocato dinamamicamente di dimensione pari a dim_file. Poi in una stringa mi preparo la riga di stato e gli header Content-Type, Content-Length e Server.
Il valore di Content-Length è pari alla dimensione del file da inviare (dim_file), giusto?
Dopo gli header lascio una riga bianca.
Infine alloco dinamicamente un altro buffer di dimensione pari alla somma di strlen(stringa) più dim_file. In tale buffer ci ricopio la stringa e poi ci concateno il contenuto del buffer contenente il body.
Così, il gioco funziona solo se il server invia file text (txt, html) ma non quando invia le immagini (jpg, png). In quest'ultimo caso il browser non visualizza niente.
C'è qualche accortezza che devo prendere nella composizione del response?
In fondo al body devo per caso inserire un CR/LF oppure il response termina con l'ultimo byte del corpo (e quindi del file da inviare)?
Grazie in anticipo per l'attenzione e chiunque voglia darmi qualche consiglio è ben accetto :)
Ciao!

F.

mondobimbi
14-08-2009, 08:37
content-length deve contenere la dimensione del file, non è strettamente necessario ma così dai una informazione in più al browser.
Non devi obbligatoriamente mettere alcun ritorno carrello alla fine del contenuto, lo devi mettere solo alla fine dell'header (deve esserci una riga vuota, al limite per essere sicuro mettine due perchè con un \n solo vai solo a capo. Usa la sequenza \n\n).
Per i file jpg hai indicato il giusto content-type ? quel "<body>" che vedo nel primo post logicamente non ci deve stare.
Il browser cosa ti dice? hai provato a comunicare con telnet?

telnet nomeserver 80
GET /

e guarda cosa ti dice
ciao
sergio

flattit82
14-08-2009, 09:23
Ciao Sergio,
credo di aver risolto e il server funziona in due modi:
1) facendo prima la send della linea di stato e degli header e poi la send del body (buffer contenente il file);
2) facendo un'unica send della linea di stato, degli header e del buffer.
E' normale che funzioni anche il primo modo? Se così fosse significa che il body può essere mandato a parte.
Già che ci sono volevo chiederti anche un'altra cosa. Il server che devo realizzare nella versione finale dovrà essere concorrente tramite i thread e a tale scopo devo usare la libreria pthread. Se necessario dovrò utilizzare anche i meccanismi di protezione messi a disposizione da tale libreria (semafori, variabili condition). Ecco, mi chiedevo... quando in particolare devo utilizzare tali meccanismi di protezione? Ogni volta che i thread accedono a strutture dati condivise (variabili globali) e in generale per la lettura dei file richiesti dai browser? Potrei mettere la muta esclusione sul codice che legge un file per ricopiarlo nel buffer. Però in questo modo i thread dovrebbero attendere anche quando leggono file diversi, giusto? Attendo con ansia i tuoi preziosi consigli :)
Grazie ancora,

Federico

mondobimbi
14-08-2009, 15:43
E' normale che funzioni anche il primo modo?

è un po' di tempo che non scrivo server http, ma probabilmente è giusto perchè comunque lo fai nella stessa connessione.

Sei obbligato ad usare i thread o puoi fare anche dei fork, che mi sembrano più semplici da gestire, essendo processi differenti.

Comunque sì, devi usare i semafori, ma lo farei solo dove esegui operazioni di scrittura.

ciao
sergio

Loading