Url class for url parsing.
This commit is contained in:
136
VAR.UrlCompressor/Url.cs
Normal file
136
VAR.UrlCompressor/Url.cs
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace VAR.UrlCompressor
|
||||||
|
{
|
||||||
|
class Url
|
||||||
|
{
|
||||||
|
public string Protocol { get; set; }
|
||||||
|
public string Host { get; set; }
|
||||||
|
public string Port { get; set; }
|
||||||
|
public string Path { get; set; }
|
||||||
|
|
||||||
|
private Url() { }
|
||||||
|
|
||||||
|
private enum ParseStatus
|
||||||
|
{
|
||||||
|
ParsingProtocol,
|
||||||
|
ParsingHost,
|
||||||
|
ParsingPort,
|
||||||
|
ParsingPath,
|
||||||
|
};
|
||||||
|
|
||||||
|
private ParseStatus _status = ParseStatus.ParsingProtocol;
|
||||||
|
private int _i0 = 0;
|
||||||
|
private int _i = 0;
|
||||||
|
|
||||||
|
private void ResetParser()
|
||||||
|
{
|
||||||
|
_status = ParseStatus.ParsingProtocol;
|
||||||
|
_i0 = 0;
|
||||||
|
_i = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ParseUrl(string url)
|
||||||
|
{
|
||||||
|
while (_i < url.Length)
|
||||||
|
{
|
||||||
|
switch (_status)
|
||||||
|
{
|
||||||
|
case ParseStatus.ParsingProtocol:
|
||||||
|
if (url[_i] == ':')
|
||||||
|
{
|
||||||
|
Protocol = url.Substring(_i0, _i - _i0);
|
||||||
|
|
||||||
|
if (_i + 2 >= url.Length)
|
||||||
|
{
|
||||||
|
throw new Exception(string.Format("Unexpected end of URL, while parsing protocol. \"{0}\"", url));
|
||||||
|
}
|
||||||
|
if (url[_i + 1] != '/' || url[_i + 2] != '/')
|
||||||
|
{
|
||||||
|
throw new Exception(string.Format("Unexpected end of URL, while parsing protocol. \"{0}\"", url));
|
||||||
|
}
|
||||||
|
|
||||||
|
_status = ParseStatus.ParsingHost;
|
||||||
|
_i0 = _i + 3;
|
||||||
|
_i = _i0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ParseStatus.ParsingHost:
|
||||||
|
if (char.IsLetterOrDigit(url[_i]) == false && url[_i] != '.')
|
||||||
|
{
|
||||||
|
Host = url.Substring(_i0, _i - _i0);
|
||||||
|
_i0 = _i;
|
||||||
|
|
||||||
|
if (url[_i] == ':')
|
||||||
|
{
|
||||||
|
_status = ParseStatus.ParsingPort;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_status = ParseStatus.ParsingPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ParseStatus.ParsingPort:
|
||||||
|
if (char.IsDigit(url[_i]) == false)
|
||||||
|
{
|
||||||
|
Port = url.Substring(_i0, _i - _i0);
|
||||||
|
_i0 = _i;
|
||||||
|
_status = ParseStatus.ParsingPath;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ParseStatus.ParsingPath:
|
||||||
|
_i = url.Length - 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_i++;
|
||||||
|
}
|
||||||
|
switch (_status)
|
||||||
|
{
|
||||||
|
case ParseStatus.ParsingProtocol:
|
||||||
|
Protocol = url.Substring(_i0, _i - _i0);
|
||||||
|
break;
|
||||||
|
case ParseStatus.ParsingHost:
|
||||||
|
Host = url.Substring(_i0, _i - _i0);
|
||||||
|
break;
|
||||||
|
case ParseStatus.ParsingPort:
|
||||||
|
Port = url.Substring(_i0, _i - _i0);
|
||||||
|
break;
|
||||||
|
case ParseStatus.ParsingPath:
|
||||||
|
Path = url.Substring(_i0, _i - _i0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Url CreateFromString(string url)
|
||||||
|
{
|
||||||
|
var newUrl = new Url();
|
||||||
|
newUrl.ParseUrl(url);
|
||||||
|
return newUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Url CreateFromShortString(string url)
|
||||||
|
{
|
||||||
|
var newUrl = new Url()
|
||||||
|
{
|
||||||
|
Protocol = url[0].ToString(),
|
||||||
|
_status = ParseStatus.ParsingHost,
|
||||||
|
_i = 1,
|
||||||
|
_i0 = 1,
|
||||||
|
};
|
||||||
|
newUrl.ParseUrl(url);
|
||||||
|
return newUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return string.Format("{0}://{1}{2}{3}", Protocol, Host, Port, Path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ToShortString()
|
||||||
|
{
|
||||||
|
return string.Format("{0}{1}{2}{3}", Protocol[0], Host, Port, Path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -63,6 +63,7 @@
|
|||||||
<Compile Include="Huffman.cs" />
|
<Compile Include="Huffman.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="UrlCompressor.cs" />
|
<Compile Include="UrlCompressor.cs" />
|
||||||
|
<Compile Include="Url.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Build.NuGet.cmd" />
|
<None Include="Build.NuGet.cmd" />
|
||||||
|
|||||||
Reference in New Issue
Block a user