DZ-Jay wrote:
> The
> alternative would be to give the user access to the URL when
> automatic redirections are in place, via a new event. 

For this purpose I suggest we trigger the OnHeaderData event at
a slightly different place and make property LastResponse
writeable.  

> However,
> Francois had mentioned that the component should do it itself, and in
> that case a smart check is required (as opposed to the simple space
> substitution), but it should be an optional feature enabled by a flag.

How smart, that's the question. If this check was optional it's a good
compromise.

The following beta-function is not very smart, however rather fast. You
are invited to make it smarter (syntax check etc.), it should be copied
to (Overbyte)IcsUrl.pas. 

const
    { According to rfc #1738 only the following chars may be used unencoded }
    { within a URL.                                                         }
    UrlAllowedChars : TCharSet = [
           {AlphaNum}             'a'..'z', '0'..'9', 'A'..'Z',
           {Specials}             '$', '-', '_', '.', '+', '!', '*', '''', '(', 
')', ',',
           {Reserved}             ';', '/', '?', ':', '@', '=', '&'
                                 ];


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ Returns zero when encoding is not required otherwise index of the first   }
{ character that needs to be encoded.                                       }

function NeedsUrlEncoding(const S: String) : Integer;
var
    I : Integer;
begin
    I := 1;
    while I <= Length(S) do begin
        if (S[I] = '%') and (I < Length(S) - 1) and
            IsXDigit(S[I + 1]) and IsXDigit(S[I + 2]) then
                Inc(I, 2)
        else if not (S[I] in UrlAllowedChars) then begin
            Result := I;
            Exit;
        end;
        Inc(I);
    end;
    Result := 0;
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function UrlCheckEncode(const S: String): String;
var
    I : Integer;
    Y : Integer;
    X : String[2];
begin
    Y := NeedsUrlEncoding(S);
    if Y = 0 then begin
        Result := S;
        Exit;
    end;
    SetLength(Result, 3 * Length(S));
    if Y > 1 then
        Move(S[1], Result[1], Y - 1);
    I := Y;
    while I <= Length(S) do begin
        if S[I] in UrlAllowedChars then begin
            Result[Y] := S[I];
            Inc(Y);
            Inc(I);
        end
        { Don't encode twice }
        else if (S[I] = '%') and (I < Length(S) - 1) and
                 IsXDigit(S[I + 1]) and IsXDigit(S[I + 2]) then begin
            Move(S[I], Result[Y], 3);
            Inc(I, 3);
            Inc(Y, 3);
        end
        else begin
            X := IntToHex(Ord(S[I]), 2);
            Result[Y] := '%';
            Result[Y + 1] := X[1];
            Result[Y + 2] := X[2];
            Inc(Y, 3);
            Inc(I);
        end;
    end;
    SetLength(Result, Y - 1);
end;


{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}


--
Arno Garrels [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html

> 
> dZ.
> 
> --
> DZ-Jay [TeamICS]
> http://www.overbyte.be/eng/overbyte/teamics.html
-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to