Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

HttpSock.pas

01.01.2007
unit HttpSock;
 
{
 
CrtSocket for Delphi 32
 
Copyright (C) 1999-2001  Paul Toth <tothpaul@free.fr>
  http
://tothpaul.free.fr
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU
General Public License
as published by the Free Software Foundation; either version 2
of the
License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY
; without even the implied warranty of
MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public License
along
with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
}
 
interface
 
function URLEncode(s:string):string;
function URLDecode(s:string):string;
 
function HttpGet(server,url:string; var header:string):string;
function HttpPost(server,url,data:string; var header:string):string;
 
implementation
 
uses
 crtsock
,sysutils;
 
function URLEncode(s:string):string; // http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc1738.html
 
var
  i
:integer;
  c
:char;
 
begin
  result
:='';
 
for i:=1 to length(s) do begin
   c
:=s[i];
   
case c of
   
// non-ASCII
   
#$00..#$1F,#$7F,#$80..#$FF,
   
// unsafe
   
{' ',}'<','>','"','#','%','}','|','\','^','~', '[', ']', '`',
   // reserved
    ';','/','?',':','@','=','&',
    '$','-','_','.','+','!','*','''','(',')':
     result:=result+'%'+IntToHex(ord(c),2);
    ' ' :result:=result+'+';
    else result:=result+c;
   end;
  end;
 end;
 
function URLDecode(s:string):string;
 var
  i:integer;
 begin
  result:='';
  i:=1;
  while i<=length(s) do begin
   case s[i] of
    '+':result:=result+' ';
    '%':begin
         s[i]:='$';
         result:=result+chr(StrToInt(copy(s,i,3)));
         inc(i,2);
        end;
    else result:=result+s[i];
   end;
   inc(i);
  end;
 end;
 
 
function HttpGet(server,url:string; var header:string):string;
 var
  handle:integer;
  sin,sout:textfile;
  s:string;
 begin
  handle:=callserver(server,80);
  if handle<=0 then begin
   result:='';
   exit;
  end;
  assigncrtsock(handle,sin,sout);
  writeln(sout,'GET ',url,' HTTP/1.0');
  writeln(sout,'Accept: */*');
  writeln(sout,'Accept-Language: fr');
  writeln(sout,'User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; FREE)');
//  writeln(sout,'User-Agent: MySoft/1.0 (Delphi)');
  writeln(sout,'Connection: Keep-Alive');
  if header<>'' then writeln(sout,header);
  writeln(sout);
 
  header:='';
  result:='';
 
  readln(sin,s);
  while s<>'' do begin
   header:=header+s;
   readln(sin,s);
  end;
 
  while not eof(sin) do begin
   readln(sin,s);
   result:=result+s;
  end;
 
  disconnect(handle);
 end;
 
function HttpPost(server,url,data:string; var header:string):string;
 var
  handle:integer;
  sin,sout:textfile;
  s:string;
 begin
  handle:=callserver(server,80);
  if handle<=0 then begin
   result:='';
   exit;
  end;
  assigncrtsock(handle,sin,sout);
  writeln(sout,'POST ',url,' HTTP/1.0');
  writeln(sout,'Accept: */*');
  writeln(sout,'Accept-Language: fr');
  writeln(sout,'User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; FREE)');
//  writeln(sout,'User-Agent: MySoft/1.0 (Delphi)');
  writeln(sout,'Content-length: ',Length(data));
  writeln(sout,'Connection: Keep-Alive');
  if header<>'' then writeln(sout,header);
  writeln(sout);
  write(sout,data);
 
  header:='';
  result:='';
 
  readln(sin,s);
  while s<>'' do begin
   header:=header+s;
   readln(sin,s);
  end;
 
  while not eof(sin) do begin
   readln(sin,s);
   result:=result+s;
  end;
 
  disconnect(handle);
 end;
 
end.