PDA

Visualizza la versione completa : [PASCAL] Server HTTP con Free Pascal


mondobimbi
19-07-2007, 10:28
lo scopo generale al volo un file pdf secondo la richiesta del client.
Utilizza i componenti synapse.
sock come si pu dedurre il Socket
Sock:TTCPBlockSocket;

Non sono ancora riuscito a capire l'origine del problema :
su Mozilla funzione e visualizza il pdf su IE lo invia al browser come testo, incluso l'header. Il file pdf poi integro con %PDF etc...

La procedure che genera il pdf e lo invia qui sotto.
La chiamata di esempio
http://www.mondobimbi.com:9090/catalogo.pdf?fornitore=CHE



procedure TTCPHttpThrd.Catalogo (URI: string);
var
F : THandle;
size : longInt;
n, p : integer;
buf : pointer;
DIR_PROG, DIR_TETEX : string;
begin

DIR_PROG := iniFile.ReadString('Pdf', 'Directory programmi', '/home/sergio/latex');
if DIR_PROG <> '' then
if DIR_PROG[length(DIR_PROG)] <> '/' then DIR_PROG := DIR_PROG + '/';

DIR_TETEX := iniFile.ReadString('Pdf', 'Directory teTeX', '');
if DIR_TETEX <> '' then
if DIR_TETEX[length(DIR_TETEX)] <> '/' then DIR_TETEX := DIR_TETEX + '/';

// separa l'uri
p := Pos('?', uri);
uri := Copy(uri, p+1, Length(uri)-p);

SetCurrentDir(DIR_PROG);

// genera il file .tex
with TGeneraPdf.Create('pdf') do
begin
Catalogo('Catalogo', uri);
Free;
end;

// chiama il motore teTeX
shell(DIR_TETEX + 'pdflatex prova1.tex');
// sistema l'indice
shell(DIR_TETEX + 'makeindex prova1.tex');
// riavvia il motore in modo che inserisca l'indice
shell(DIR_TETEX + 'pdflatex prova1.tex');

// l'output il file pdf
F := FileOpen(DIR_PROG + 'prova1.pdf', fmOpenread);

// determino la dimensione
size := FileSeek(F, 0, fsfromEnd);

getmem(buf, size);

FileSeek(F, 0, fsfromBeginning);
FileRead(F, buf^, size);

FileClose(F);


// headers un TStringList
headers.Add('Content-type: application/pdf');
headers.Add('Content-length: ' + IntTostr(Size));
headers.Add('Content-Disposition: inline; filename=catalogo.pdf');
headers.Add('Connection: close');
headers.Add('Date: ' + Rfc822DateTime(now));
headers.Add('Server: ProSim');
headers.Add('');
// invia l'headear
for n := 0 to headers.count - 1 do
Sock.sendstring(headers[n] + CRLF);

// invia il buffer
Sock.SendBuffer(buf, size);

freemem(buf, size);

end;

spero che qualcuno capisca dove sia l'errore
grazie
sergio

mondobimbi
19-07-2007, 15:13
il concentrarsi sul problema aiuta a risolverlo,
mancava il codice di ritorno

sock.SendString('HTTP/1.0 ' + IntTostr(ResultCode) + CRLF);

prima di inviare l'header, stranamente mozillo lo accetta comunque.

ciao
sergio

Loading