Réception par http/1.0 et http/1.1 avec tclientsocket en quelques lignes

Description

Ce code très simple permet de réceptionner un fichier par http
simplement avec TClientSocket.

Tclientsocket est dans la palette de composant section: "fastnet" sous Delphi5.
Pour delphi7, il se trouve dans l'unité: 'ScktComp'.

Vin-s

Source / Exemple :


// les paramêtres:
const
      PAGE = '';
      SERVER_HOST = 'www.yahoo.com';

// On créez un composant dérivé de Tclientsocket avec les méthodes et
// propriétées suivantes:
type
TClientSocket_HTTP = class(TClientSocket)
  public
    // buffer est utilisé pour stoker les données qui arrive par morceau.
    buffer    :Array of byte;
    procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
      procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
      procedure ClientError(Sender: TObject; Socket: TCustomWinSocket;
                            ErrorEvent: TErrorEvent; var ErrorCode: Integer);
      procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);

      Constructor Create(AOwner: TComponent); override;

    end;

implementation

{$R *.dfm}

Constructor TClientSocket_HTTP.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

// on assigne les méthodes
ClientType := ctNonBlocking;
OnConnect := ClientConnect;
OnDisconnect := ClientDisconnect;
OnError := ClientError;
OnRead := ClientRead;

Host := SERVER_HOST;
// tout les serveurs utilisent le port 80:
Port := 80;
end;

// En cas d'erreur un petit showmessage:
Procedure TClientSocket_HTTP.ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
Showmessage( 'OnClientHTTPError:'+
                      Socket.RemoteAddress+
                      #13#10+'Erreurcode: '+IntToStr(ErrorCode) );
end;

// Quand le serveur envoie des données on les copie dans buffer:
Procedure TClientSocket_HTTP.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  i1, i2 :integer;
begin
i1 := Length(buffer);
i2 := socket.ReceiveLength;
Setlength(buffer, i1+i2);
socket.ReceiveBuf(Buffer[i1], i2);
end;

// A la connection on vide buffer et en envoie la ligne de commande:
Procedure TClientSocket_HTTP.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Setlength(buffer, 0);

// PAGE peux-être vide ou contenir 'page4.htm' par exemple.

// Commande pour HTTP/1.0: (attention: 2 retours à la ligne !)
// Socket.SendText('GET /'+PAGE+' HTTP/1.0'+#13#10#13#10);

// Commande pour HTTP/1.1:
Socket.SendText( 'GET /'+PAGE+' HTTP/1.1 '+
                            #13#10+'Host: '+host+#13#10#13#10);
end;

// Le serveur nous déconnectera lui même quand il nous aura envoyé la page.
procedure TClientSocket_HTTP.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
// débrouillez vous avec un Tmemo:
Form1.log.lines.add('Déconnecté');
Form1.log.lines.add(string(buffer));

// Y'a pu qu'à traiter buffer !
end;

end.

Conclusion :


Si Ondisconnect ne sexecute pas, c'est que le serveur n'a pas bien recu
la commande, passez alors du http/1.1 au http/1.0 ou inversement.
Free n'accepte pas le http1.0 et renvoie des messages d'erreurs par exemple.

Cette méthode "manuel" peut vous éviter d'utiliser des composants lourd
indy, borland ou f-piette...

merci à nono40 pour ses sources, les pages de manual php.net pour le
http/1.0 et le RFC http1.1

-> Vin-s

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (Vin-s)