URLParse.pas
上传用户:szzdds
上传日期:2013-09-18
资源大小:293k
文件大小:5k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit URLParse;
  2. interface
  3. const
  4.   PortDefault = '80'; {HTTP}
  5.   SchemeDefault = 'http:'; {HTTP}
  6.   NumberOfSchemes = 16;
  7. var
  8.   PORTS: array[1..NumberOfSchemes, 1..2] of string = (
  9.     ('ftp:', '21'),
  10.     ('telnet:', '23'),
  11.     ('smtp:', '25'),
  12.     ('whois:', '43'),
  13.     ('whois++:', '63'),
  14.     ('gopher:', '70'),
  15.     ('http:', '80'),
  16.     ('pop3:', '110'),
  17.     ('nntp:', '119'),
  18.     ('news:', '119'),
  19.     ('imap2:', '143'),
  20.     ('irc:', '194'),
  21.     ('wais:', '210'),
  22.     ('imap3:', '220'),
  23.     ('ldap:', '389'),
  24.     ('https:', '443'));
  25. procedure ParseURL(URL: string; var FScheme, FUser, FPassword, FNetworkLocation, FPort, FPath, FResource, FParameters, FQuery, FFragment: string);
  26. function DefaultPort(const FScheme: string): string;
  27. implementation
  28. uses
  29.   SysUtils;
  30. function DefaultPort(const FScheme: string): string;
  31. var
  32.   i: Integer;
  33. begin
  34.   Result := PortDefault;
  35.   if FScheme <> '' then
  36.     for i := 1 to NumberOfSchemes do
  37.       if AnsiCompareText(FScheme, PORTS[i, 1]) = 0 then
  38.       begin
  39.         Result := PORTS[i, 2];
  40.         Break;
  41.       end;
  42. end;
  43. function GetToEnd(const FindChar: Char; var ParseString: string; const KeepFirst: Boolean): string;
  44. var
  45.   i, II: Integer;
  46. begin
  47.   Result := '';
  48.   if ParseString <> '' then
  49.   begin
  50.     i := Pos(FindChar, ParseString);
  51.     if i > 0 then
  52.     begin
  53.       II := Length(ParseString) - i + 1;
  54.       Result := Copy(ParseString, i, II);
  55.       Delete(ParseString, i, II);
  56.     end;
  57.     if not KeepFirst then
  58.       Delete(Result, 1, 1);
  59.   end;
  60. end;
  61. function ParseFragment(var ParseString: string): string;
  62. begin
  63.   Result := GetToEnd('#', ParseString, TRUE);
  64. end;
  65. function ParseScheme(var ParseString: string): string;
  66. var
  67.   Temp: string;
  68.   SPtr, EPtr: PChar;
  69. begin
  70.   Result := SchemeDefault;
  71.   if ParseString <> '' then
  72.   begin
  73.       //  Temp := ParseString;
  74.     SetString(Temp, PChar(ParseString), Length(ParseString));
  75.     SPtr := PChar(Temp);
  76.     EPtr := SPtr;
  77.     while EPtr^ in ['1'..'0', 'A'..'Z', 'a'..'z', '+', '.', '-'] do
  78.       Inc(EPtr);
  79.     if (EPtr^ = ':') and ((EPtr + 1)^ = '/') then
  80.     begin
  81.       Inc(EPtr);
  82.       EPtr^ := #0;
  83.       Result := string(SPtr);
  84.       Delete(ParseString, 1, EPtr - SPtr);
  85.     end;
  86.   end;
  87. end;
  88. function ParseNetworkLocation(var ParseString: string): string;
  89. var
  90.   Temp: string;
  91.   SPtr, EPtr: PChar;
  92.   i: Integer;
  93. begin
  94.   Result := '';
  95.   if ParseString <> '' then
  96.   begin
  97.     SetString(Temp, PChar(ParseString), Length(ParseString));
  98.     SPtr := PChar(Temp);
  99.     EPtr := SPtr;
  100.     if (EPtr^ = '/') and ((EPtr + 1)^ = '/') then
  101.     begin
  102.       Inc(EPtr, 2);
  103.       while not (EPtr^ in [#0, '/']) do
  104.         Inc(EPtr);
  105.       EPtr^ := #0;
  106.       Result := string(SPtr + 2);
  107.       Delete(ParseString, 1, EPtr - SPtr);
  108.     end
  109.     else
  110.     begin
  111.       i := Pos('/', ParseString);
  112.       if i > 1 then
  113.       begin
  114.         Result := Copy(ParseString, 1, i - 1);
  115.         Delete(ParseString, 1, i - 1);
  116.       end
  117.       else if i = 0 then
  118.       begin
  119.         Result := ParseString;
  120.         ParseString := '';
  121.       end
  122.     end;
  123.   end;
  124. end;
  125. function ParseQuery(var ParseString: string): string;
  126. begin
  127.   Result := GetToEnd('?', ParseString, TRUE);
  128. end;
  129. function ParseParameters(var ParseString: string): string;
  130. begin
  131.   Result := GetToEnd(';', ParseString, TRUE);
  132. end;
  133. function ParseResource(var ParseString: string): string;
  134. var
  135.   SPtr: PChar;
  136.   rPtr: PChar;
  137. begin
  138.   if ParseString <> '' then
  139.   begin
  140.     SPtr := PChar(ParseString);
  141.     if StrPos(SPtr, '.') <> nil then // If there is no dot, no resource
  142.     begin
  143.       rPtr := StrRScan(SPtr, '/');
  144.       rPtr^ := #0;
  145.       Inc(rPtr);
  146.       Result := string(rPtr);
  147.       Dec(rPtr);
  148.       rPtr^ := '/';
  149.       Inc(rPtr);
  150.       rPtr^ := #0;
  151.       SetLength(ParseString, StrLen(SPtr));
  152.     end
  153.     else
  154.       Result := '';
  155.   end;
  156. end;
  157. function ParsePath(var ParseString: string): string;
  158. begin
  159.   Result := ParseString;
  160. end;
  161. function ParsePassword(var ParseString: string): string;
  162. begin
  163.   Result := GetToEnd(':', ParseString, FALSE);
  164. end;
  165. function ParseUserPassword(var ParseString: string): string;
  166. var
  167.   i: Integer;
  168. begin
  169.   Result := '';
  170.   if ParseString <> '' then
  171.   begin
  172.     i := Pos('@', ParseString);
  173.     if i > 0 then
  174.     begin
  175.       Result := Copy(ParseString, 1, i - 1);
  176.       Delete(ParseString, 1, i);
  177.     end;
  178.   end;
  179. end;
  180. function ParsePort(var ParseString: string): string;
  181. begin
  182.   Result := GetToEnd(':', ParseString, TRUE);
  183. end;
  184. procedure ParseURL(URL: string; var FScheme, FUser, FPassword, FNetworkLocation, FPort, FPath, FResource, FParameters, FQuery, FFragment: string);
  185. var
  186.   ParseString: string;
  187. begin
  188.   ParseString := URL;
  189.   FFragment := ParseFragment(ParseString);
  190.   FScheme := ParseScheme(ParseString);
  191.   FNetworkLocation := ParseNetworkLocation(ParseString);
  192.   FQuery := ParseQuery(ParseString);
  193.   FParameters := ParseParameters(ParseString);
  194.   FResource := ParseResource(ParseString);
  195.   FPath := ParsePath(ParseString);
  196.   if FPath = '' then
  197.     FPath := '/';
  198.   if FNetworkLocation <> '' then
  199.   begin
  200.     FUser := ParseUserPassword(FNetworkLocation);
  201.     FPassword := ParsePassword(FUser);
  202.     FPort := ParsePort(FNetworkLocation);
  203.   end
  204.   else
  205.   begin
  206.     FUser := '';
  207.     FPassword := '';
  208.   end;
  209. end;
  210. end.