Разбор адреса FTP

Разбор адреса 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;

Пример использования:

...

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;

...

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...