RTT wrote:
> On 13-12-2011 08:31, Angus Robertson - Magenta Systems Ltd wrote:
>> I'm just about to change to HttpServer MIME handling again, to use a
>> look-up list read from the Windows classes registry or a text file)
>> when the server starts, to replace the current hard coded MIME list.
>
> If filling from the registry, better if the list is filled dynamically
> when a not yet resolved file extension is requested. Enumerating all
> these keys is time consuming, making the server sluggish at start. And
> using memory resources, for MIME types that are not going to be
> requested, is a waste.
Is it realy that slow? I just tested this quick and dirty code,
doesn't take too long to fill the list IMO, it returned ~190 registered
MIME types, though that number may increase on computers longer in
use than my test box:
{code}
TMimeTypes = class(THashedStringList)
public
function LoadFromSystem: Boolean;
function GetValueFromFileName(const AFileName: String): String;
function GetValueFromFileExtension(const AFileExtension: String): String;
end;
implementation
{ TMimeTypes }
const
DEFAULT_MIME_TYPE = 'application/octet-stream';
function TMimeTypes.GetValueFromFileName(const AFileName: String): String;
begin
Result := Values[ExtractFileExt(AFileName)];
if Result = '' then
Result := DEFAULT_MIME_TYPE;
end;
function TMimeTypes.GetValueFromFileExtension(const AFileExtension: String):
String;
begin
Result := Values[AFileExtension];
if Result = '' then
Result := DEFAULT_MIME_TYPE;
end;
{$IFDEF MSWINDOWS}
function TMimeTypes.LoadFromSystem: Boolean;
function GetContentType(const SubKey: String; out Value: string): Boolean;
const
ValName = 'Content Type';
var
ValType: DWORD;
KeyHandle: HKEY;
Buf: Pointer;
BufSize: Cardinal;
begin
Result := False;
if RegOpenKeyEx(HKEY_CLASSES_ROOT, PChar(SubKey), 0, KEY_READ, KeyHandle)
= ERROR_SUCCESS then
begin
if RegQueryValueEx(KeyHandle, ValName, nil, @ValType, nil, @BufSize) =
ERROR_SUCCESS then
begin
GetMem(Buf, BufSize);
if RegQueryValueEx(KeyHandle, ValName, nil, @ValType, Buf, @BufSize)
= ERROR_SUCCESS then
begin
if ValType = REG_SZ then
begin
Value := PChar(Buf);
Result := True;
end;
end;
FreeMem(Buf);
end;
RegCloseKey(KeyHandle);
end;
end;
var
I: Integer;
iRes: Integer;
S, S2: String;
KeyHandle: HKEY;
Buf: PChar;
BufSize: Cardinal;
begin
Result := RegOpenKeyEx(HKEY_CLASSES_ROOT, '', 0, KEY_READ, KeyHandle) =
ERROR_SUCCESS;
if Result then
begin
BufSize := 1024;
GetMem(Buf, BufSize);
I := 0;
iRes := ERROR_SUCCESS;
while iRes = ERROR_SUCCESS do
begin
BufSize := 1024;
iRes := RegEnumKeyEx(KeyHandle, I, Buf, BufSize, nil, nil, nil, nil);
if iRes = ERROR_SUCCESS then
begin
S := Buf;
inc(I);
if (S <> '') and (S[1] = '.') then
begin
if GetContentType(S, S2) then
begin
if IndexOfName(S) < 0 then
Add(S + '=' + S2);
end;
end
else if (S <> '') and (S[1] > '.') then
Break;
end;
end;
FreeMem(Buf);
RegCloseKey(KeyHandle);
end;
end;
{$ENDIF MSWINDOWS}
{code}
> But could be a good idea to pre-fill it with the more common ones
> (e.g. use the current hard-coded to pre-fill it). When a not in the
> list is requested, try from the registry. if found, cache it in the
> list. If not found, cache the default, application/octet-stream, one,
> so you don't loose time searching for it again, the next time it is
> requested.
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be