(*@\\\0000000501*) (*@/// destructor t_fingerd.Destroy; *) destructor t_fingerd.Destroy; begin f_answer.Free; inherited destroy; end; (*@\\\0000000301*) (*@/// procedure t_fingerd.do_action; *) procedure t_fingerd.do_action; var i: integer; temp_socket: TSocket; finger_info:TFingerInfo; sockinfo: TSockAddr; s: string; begin temp_socket:=f_socket; self.f_socket:=accept_socket_in(f_socket,sockinfo); f_eof:=false; finger_info.address:=longint(sockinfo.Sin_addr); s:=self.read_line(f_socket); finger_info.request:=s; finger_info.hostname:=''; (* NYI !!! *) if assigned(f_fingerrequest) then f_fingerrequest(self,finger_info); for i:=0 to f_answer.count-1 do begin self.write_s(f_socket,f_answer.strings[i]+#13#10); end; close_socket_linger(f_socket); f_socket:=temp_socket; end; (*@\\\000000131B*) (*@/// procedure t_fingerd.SetAnswer(Value: TStringList); *) procedure t_fingerd.SetAnswer(Value: TStringList); begin if value=NIL then f_answer.clear else f_answer.assign(value); end; (*@\\\0000000603*) (*@/// procedure t_fingerd.WndProc(var Msg : TMessage); *) procedure t_fingerd.WndProc(var Msg : TMessage); begin if msg.msg<>uwm_socketevent then inherited wndproc(msg) else begin if msg.lparamhi=socket_error then else begin case msg.lparamlo of fd_accept: begin do_action; end; end; end; end; end; (*@\\\0000000E09*) (*@/// procedure t_fingerd.action; *) procedure t_fingerd.action; begin open_socket_in(f_socket,f_Socket_number,my_ip_address); if f_socket=INVALID_SOCKET then raise ESocketError.Create(WSAGetLastError); winsock.WSAAsyncSelect(f_socket,f_handle,uwm_socketevent,fd_accept); end; (*@\\\000000010B*) (*@\\\000000051C*)
{ HTTP and FTP - the file transfer protocols } (*@/// class t_http(t_tcpip) *) (*@/// constructor t_http.Create(Aowner:TComponent); *) constructor t_http.Create(Aowner:TComponent); begin inherited create(AOwner); f_content_post:='application/x-www-form-urlencoded'; f_do_author:=TStringlist.Create; end; (*@\\\0000000503*) (*@/// destructor t_http.Destroy; *) destructor t_http.Destroy; begin f_do_author.free; inherited destroy; end; (*@\\\*)
(*@/// procedure t_http.sendrequest(const method,version: string); *) procedure t_http.sendrequest(const method,version: string); begin SendCommand(method+' '+f_path+' HTTP/'+version); if f_sender<>'' then SendCommand('From: '+f_sender); if f_reference<>'' then SendCommand('Referer: '+f_reference); if f_agent<>'' then SendCommand('User-Agent: '+f_agent); if f_nocache then SendCommand('Pragma: no-cache'); if method='POST' then begin SendCommand('Content-Length: '+inttostr(stream.size)); if f_content_post<>'' then SendCommand('Content-Type: '+f_content_post); end; if f_author<>'' then begin self.write_s(f_socket,'Authorization: '+f_author+#13#10); if assigned(f_tracer) then f_tracer('Authorization: *****',tt_proto_sent); end; self.write_s(f_socket,#13#10); (* finalize the request *) end; (*@\\\0000000301*) (*@/// procedure t_http.getanswer; *) procedure t_http.getanswer; var s: string; proto,user,pass,port: string; field,data: string; begin f_do_author.clear; f_type:=''; f_size:=0; repeat s:=self.read_line(f_socket); if s<>'' then if assigned(f_tracer) then f_tracer(s,tt_proto_get); if false then (*@/// else if left(s,8)='HTTP/1.0' then http-status-reply *) else if copy(s,1,8)='HTTP/1.0' then begin f_status_nr:=strtoint(copy(s,10,3)); f_status_txt:=copy(s,14,length(s)); if f_status_nr>=400 then EXIT; (* HTTP error returned *) end (*@\\\*) (*@/// else if pos(':',s)>0 then parse the response string *) else if pos(':',s)>0 then begin field:=lowercase(copy(s,1,pos(':',s)-1)); data:=copy(s,pos(':',s)+2,length(s)); if false then { else if field='date' then } { else if field='mime-version' then } { else if field='pragma' then } { else if field='allow' then } (*@/// else if field='location' then change the uri !!! *) else if field='location' then begin if proxy<>'' then f_path:=data (* it goes via a proxy, so just change the uri *) else begin parse_url(data,proto,user,pass,f_hostname,port,f_path); if port<>'' then f_Socket_number:=strtoint(port); end; end (*@\\\0000000601*) { else if field='server' then } { else if field='content-encoding' then } (*@/// else if field='content-length' then *) else if field='content-length' then f_size:=strtoint(data) (*@\\\*) (*@/// else if field='content-type' then *) else if field='content-type' then f_type:=data (*@\\\*) (*@/// else if field='www-authenticate' then *) else if field='www-authenticate' then f_do_author.add(data) (*@\\\000000020E*) { else if field='expires' then } { else if field='last-modified' then } end (*@\\\0000000901*) (*@/// else some very strange response, ignore it *) else; (*@\\\*) until s=''; if f_status_nr>=400 then raise EProtocolError.Create('HTTP',f_status_txt,f_status_nr); end; (*@\\\0000001101*)
(*@/// procedure t_http.action; *) procedure t_http.action; var proto,user,pass,host,port,path: string; begin (*@/// parse url and proxy to f_hostname, f_path and f_socket_number *) if f_proxy<>'' then begin parse_url(f_url,proto,user,pass,host,port,path); f_path:=f_url; if proto='' then f_path:='http://'+f_path; parse_url(f_proxy,proto,user,pass,host,port,path); if port='' then port:='8080'; end else begin parse_url(f_url,proto,user,pass,host,port,f_path); if port='' then port:='80'; end; if proto='' then proto:='http'; if f_path='' then f_path:='/';
f_hostname:=host; f_Socket_number:=strtoint(port); (*@\\\0000000601*) gethead; (* to process an eventually Location: answer *) getbody; end; (*@\\\0000000501*) (*@/// procedure t_http.GetHead; *) procedure t_http.GetHead; begin login; sendrequest('HEAD','1.0'); getanswer; logout; end; (*@\\\0000000701*) (*@/// procedure t_http.GetBody; *) procedure t_http.GetBody; var p: pointer; ok,ok2:integer; begin login; sendrequest('GET','1.0'); getanswer; (*@/// read the data *) TMemorystream(f_stream).clear; while not eof(f_socket) do begin read_var(f_socket,f_buffer^,buf_size,ok); p:=f_buffer; while ok>0 do begin (* just to be sure everything goes into the stream *) ok2:=f_stream.write(p^,ok); dec(ok,ok2); p:=pointer(longint(p)+ok2); end; end; f_stream.seek(0,0); (* set the stream back to start *) (*@\\\*) logout; end; (*@\\\0000000901*) (*@/// procedure t_http.Post; *) procedure t_http.Post; var p: pointer; ok,ok2:integer; proto,user,pass,host,port,path: string; begin (*@/// parse url and proxy to f_hostname, f_path and f_socket_number *) if f_proxy<>'' then begin parse_url(f_proxy,proto,user,pass,host,port,path); f_path:=f_url; if port='' then port:='8080'; end else begin parse_url(f_url,proto,user,pass,host,port,f_path); if port='' then port:='80'; end; if proto='' then proto:='http'; if path='' then path:='/';
f_hostname:=host; f_Socket_number:=strtoint(port); (*@\\\*) login; sendrequest('POST','1.0'); (*@/// Send the data *) TMemorystream(f_stream).seek(0,0); ok:=1; while ok>0 do begin ok:=f_stream.read(f_buffer^,buf_size); write_buf(f_socket,f_buffer^,ok); end; (*@\\\0000000607*) getanswer; (*@/// read in the response body *) TMemorystream(f_stream).clear; while not eof(f_socket) do begin read_var(f_socket,f_buffer^,buf_size,ok); p:=f_buffer; while ok>0 do begin (* just to be sure everything goes into the stream *) ok2:=f_stream.write(p^,ok); dec(ok,ok2); p:=pointer(longint(p)+ok2); end; end; f_stream.seek(0,0); (* set the stream back to start *) (*@\\\0000000201*) logout; end; 
|