Разбор адреса FTP
Falk0ner, вс, 06/07/2008 - 15:34.
Разбор адреса FTP
{ **** UBPFD *********** by kladovka.net.ru ****
>>
Функция анализирует строку aSrc и если в стоке дан корректный адрес FTP, возвращает имя пользователя, пароль, хост, порт и каталог. Если дан некорректный адрес, функция возвращает false, иначе - true.
Учтена возможность, когда в адресе не указываются некоторые параметры. В этом случае, если нотация соблюдена, опущенные параметры возвращаются пустыми строками.
Минимально подробный адрес: <a href="ftp://myftp.ru" title="ftp://myftp.ru">ftp://myftp.ru</a> - В этом случае будет возвращён адрес, порт по умолчанию (21) и true.
Максимально подробный адрес: <a href="ftp://MyLogin:MyPassword@MyFtp.ru:6000/MyDirectory/" title="ftp://MyLogin:MyPassword@MyFtp.ru:6000/MyDirectory/">ftp://MyLogin:MyPassword@MyFtp.ru:6000/MyDirectory/</a> - Будут возвращены все параметры и true.
Зависимости: Classes, SysUtils
Автор: Роман Василенко, <a href="mailto:romix@nm.ru">romix@nm.ru</a>, ICQ:826361, Пятигорск
Copyright: Роман Василенко
Дата: 13 июня 2004 г.
********************************************** }
function ParseFTP(aSrc: string; out oUserName, oPassword, oHost: string;
out oPort: word; out oDir: string): boolean;
const
ssPrefix = 0;
ssUserName = 1;
ssPassword = 2;
ssHost = 3;
ssPort = 4;
ssDir = 5;
var
f, StrState: integer;
sPort, pfx: string;
begin
oUserName:='';
oPassword:='';
oHost:='';
sPort:='';
oPort:=21;
oDir:='';
StrState:=ssPrefix;
result:=false;
f:=1;
repeat
case StrState of
ssPrefix: //Разбор префикса ftp:// и определение анонимности адреса
if aSrc[f]<>':' then
pfx:=pfx+aSrc[f]
else begin
if (ansisametext(trim(pfx),'ftp')) and
(aSrc[f]+aSrc[f+1]+aSrc[f+2]='://') then begin
if pos('@',aSrc)<1 then
StrState:=ssHost //Anonymous
else
StrState:=ssUserName; //UserName[:Password]
inc(f,2);
end else break;
end;
ssUserName: //Извлечение имени пользователя
if aSrc[f]='@' then //Пароль не указан
StrState:=ssHost
else
if aSrc[f]=':' then //Пароль указан
StrState:=ssPassword
else
oUserName:=oUserName+aSrc[f];
ssPassword: //Извлечение пароля
if aSrc[f]='@' then
StrState:=ssHost
else
oPassword:=oPassword+aSrc[f];
ssHost: //Извлечение хоста
if aSrc[f]=':' then //Порт указан
StrState:=ssPort
else
if aSrc[f]='/' then //Порт не указан, возможно указан каталог
StrState:=ssDir
else
oHost:=oHost+aSrc[f];
ssPort: //Извлечение порта
if aSrc[f]='/' then
StrState:=ssDir
else
sPort:=sPort+aSrc[f];
ssDir: oDir:=oDir+aSrc[f];
end;
inc(f);
until f>length(aSrc);
if (StrState>ssPassword) and (trim(oHost)<>'') then
result:=true;
try
if trim(sPort)<>'' then oPort:=strtoint(sPort);
except
result:=false;
end;
end;
>>
Функция анализирует строку aSrc и если в стоке дан корректный адрес FTP, возвращает имя пользователя, пароль, хост, порт и каталог. Если дан некорректный адрес, функция возвращает false, иначе - true.
Учтена возможность, когда в адресе не указываются некоторые параметры. В этом случае, если нотация соблюдена, опущенные параметры возвращаются пустыми строками.
Минимально подробный адрес: <a href="ftp://myftp.ru" title="ftp://myftp.ru">ftp://myftp.ru</a> - В этом случае будет возвращён адрес, порт по умолчанию (21) и true.
Максимально подробный адрес: <a href="ftp://MyLogin:MyPassword@MyFtp.ru:6000/MyDirectory/" title="ftp://MyLogin:MyPassword@MyFtp.ru:6000/MyDirectory/">ftp://MyLogin:MyPassword@MyFtp.ru:6000/MyDirectory/</a> - Будут возвращены все параметры и true.
Зависимости: Classes, SysUtils
Автор: Роман Василенко, <a href="mailto:romix@nm.ru">romix@nm.ru</a>, ICQ:826361, Пятигорск
Copyright: Роман Василенко
Дата: 13 июня 2004 г.
********************************************** }
function ParseFTP(aSrc: string; out oUserName, oPassword, oHost: string;
out oPort: word; out oDir: string): boolean;
const
ssPrefix = 0;
ssUserName = 1;
ssPassword = 2;
ssHost = 3;
ssPort = 4;
ssDir = 5;
var
f, StrState: integer;
sPort, pfx: string;
begin
oUserName:='';
oPassword:='';
oHost:='';
sPort:='';
oPort:=21;
oDir:='';
StrState:=ssPrefix;
result:=false;
f:=1;
repeat
case StrState of
ssPrefix: //Разбор префикса ftp:// и определение анонимности адреса
if aSrc[f]<>':' then
pfx:=pfx+aSrc[f]
else begin
if (ansisametext(trim(pfx),'ftp')) and
(aSrc[f]+aSrc[f+1]+aSrc[f+2]='://') then begin
if pos('@',aSrc)<1 then
StrState:=ssHost //Anonymous
else
StrState:=ssUserName; //UserName[:Password]
inc(f,2);
end else break;
end;
ssUserName: //Извлечение имени пользователя
if aSrc[f]='@' then //Пароль не указан
StrState:=ssHost
else
if aSrc[f]=':' then //Пароль указан
StrState:=ssPassword
else
oUserName:=oUserName+aSrc[f];
ssPassword: //Извлечение пароля
if aSrc[f]='@' then
StrState:=ssHost
else
oPassword:=oPassword+aSrc[f];
ssHost: //Извлечение хоста
if aSrc[f]=':' then //Порт указан
StrState:=ssPort
else
if aSrc[f]='/' then //Порт не указан, возможно указан каталог
StrState:=ssDir
else
oHost:=oHost+aSrc[f];
ssPort: //Извлечение порта
if aSrc[f]='/' then
StrState:=ssDir
else
sPort:=sPort+aSrc[f];
ssDir: oDir:=oDir+aSrc[f];
end;
inc(f);
until f>length(aSrc);
if (StrState>ssPassword) and (trim(oHost)<>'') then
result:=true;
try
if trim(sPort)<>'' then oPort:=strtoint(sPort);
except
result:=false;
end;
end;
Пример использования:
...
procedure TForm1.Button1Click(Sender: TObject);
const
yn: array[false..true] of string=('INVALID', 'VALID');
var
xValid: boolean;
xUser, xPassword, xHost, xDir: string;
xPort: word;
begin
xValid:=ParseFTP(Edit1.Text, xUser, xPassword, xHost, xPort, xDir);
ShowMessage(format('Address is %s'#13#13'Host: %s'#13'Port: %d'#13+
'Dir: %s'#13'User: %s'#13'Password: %s',
[yn[xValid], xHost, xPort, xDir, xUser, xPassword]));
end;
...
procedure TForm1.Button1Click(Sender: TObject);
const
yn: array[false..true] of string=('INVALID', 'VALID');
var
xValid: boolean;
xUser, xPassword, xHost, xDir: string;
xPort: word;
begin
xValid:=ParseFTP(Edit1.Text, xUser, xPassword, xHost, xPort, xDir);
ShowMessage(format('Address is %s'#13#13'Host: %s'#13'Port: %d'#13+
'Dir: %s'#13'User: %s'#13'Password: %s',
[yn[xValid], xHost, xPort, xDir, xUser, xPassword]));
end;
...
Отправить комментарий