Make an independent function for converting port string
This commit is contained in:
parent
c268696ee9
commit
61814d5383
@ -264,6 +264,30 @@ final class ConvException : Exception
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
package bool stringToInt(R)(R range, ref ushort n)
|
||||||
|
{
|
||||||
|
import tanya.encoding.ascii;
|
||||||
|
import tanya.range.array;
|
||||||
|
|
||||||
|
size_t i = 1;
|
||||||
|
uint lPort;
|
||||||
|
|
||||||
|
for (; !range.empty && range.front.isDigit() && i <= 6; ++i, range.popFront())
|
||||||
|
{
|
||||||
|
lPort = lPort * 10 + (range.front - '0');
|
||||||
|
}
|
||||||
|
if (i != 1 && (range.empty || range.front == '/'))
|
||||||
|
{
|
||||||
|
if (lPort > ushort.max)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
n = cast(ushort) lPort;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the source type $(D_PARAM From) and the target type $(D_PARAM To) are
|
* If the source type $(D_PARAM From) and the target type $(D_PARAM To) are
|
||||||
* equal, does nothing. If $(D_PARAM From) can be implicitly converted to
|
* equal, does nothing. If $(D_PARAM From) can be implicitly converted to
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
module tanya.net.uri;
|
module tanya.net.uri;
|
||||||
|
|
||||||
|
import tanya.conv;
|
||||||
import tanya.encoding.ascii;
|
import tanya.encoding.ascii;
|
||||||
import tanya.memory;
|
import tanya.memory;
|
||||||
|
|
||||||
@ -37,7 +38,7 @@ final class URIException : Exception
|
|||||||
this(string msg,
|
this(string msg,
|
||||||
string file = __FILE__,
|
string file = __FILE__,
|
||||||
size_t line = __LINE__,
|
size_t line = __LINE__,
|
||||||
Throwable next = null) @nogc @safe pure nothrow
|
Throwable next = null) @nogc nothrow pure @safe
|
||||||
{
|
{
|
||||||
super(msg, file, line, next);
|
super(msg, file, line, next);
|
||||||
}
|
}
|
||||||
@ -82,7 +83,7 @@ struct URL
|
|||||||
*
|
*
|
||||||
* Throws: $(D_PSYMBOL URIException) if the URL is malformed.
|
* Throws: $(D_PSYMBOL URIException) if the URL is malformed.
|
||||||
*/
|
*/
|
||||||
this(const char[] source) pure @nogc
|
this(const char[] source) @nogc pure
|
||||||
{
|
{
|
||||||
ptrdiff_t pos = -1, endPos = source.length, start;
|
ptrdiff_t pos = -1, endPos = source.length, start;
|
||||||
|
|
||||||
@ -152,16 +153,13 @@ struct URL
|
|||||||
goto ParsePath;
|
goto ParsePath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (!parsePort(source[pos .. $]))
|
||||||
{
|
{
|
||||||
// Schemas like mailto: and zlib: may not have any slash after
|
// Schemas like mailto: and zlib: may not have any slash after
|
||||||
// them.
|
// them.
|
||||||
if (!parsePort(source[pos .. $]))
|
this.scheme = source[0 .. pos];
|
||||||
{
|
start = pos + 1;
|
||||||
this.scheme = source[0 .. pos];
|
goto ParsePath;
|
||||||
start = pos + 1;
|
|
||||||
goto ParsePath;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (pos == 0 && parsePort(source[pos .. $]))
|
else if (pos == 0 && parsePort(source[pos .. $]))
|
||||||
@ -305,26 +303,9 @@ struct URL
|
|||||||
*
|
*
|
||||||
* Returns: Whether the port could be found.
|
* Returns: Whether the port could be found.
|
||||||
*/
|
*/
|
||||||
private bool parsePort(const char[] port) pure nothrow @safe @nogc
|
private bool parsePort(const(char)[] port) @nogc nothrow pure @safe
|
||||||
{
|
{
|
||||||
ptrdiff_t i = 1;
|
return stringToInt(port[1 .. $], this.port);
|
||||||
float lPort = 0;
|
|
||||||
|
|
||||||
for (; i < port.length && port[i].isDigit() && i <= 6; ++i)
|
|
||||||
{
|
|
||||||
lPort += (port[i] - '0') / cast(float) (10 ^^ (i - 1));
|
|
||||||
}
|
|
||||||
if (i != 1 && (i == port.length || port[i] == '/'))
|
|
||||||
{
|
|
||||||
lPort *= 10 ^^ (i - 2);
|
|
||||||
if (lPort > ushort.max)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this.port = cast(ushort) lPort;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user