5 \brief HttpApp
\82Ì
\83N
\83\8d\81[
\83\93\82â
\82»
\82Ì
\91¼
\8eG
\97p
\8aÖ
\90\94
7 $Id: YofUtils.pas,v 1.10 2004/10/09 15:06:19 yoffy Exp $
11 //==================================================
13 //==================================================
19 \brief ExtractHttpFields
\82Ì
\83N
\83\8d\81[
\83\93
20 \warning
\82Æ
\82è
\82 \82¦
\82¸
\82Ì
\91ã
\97p
\95i
\82È
\82Ì
\82Å chrWhite
\82ð
\8dl
\97¶
\82µ
\82Ä
\82¢
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
\81I
\81I
\81I
22 procedure ExtractHttpFields(
23 const chrSep : TSysCharSet;
24 const chrWhite : TSysCharSet;
25 const strValue : string;
26 var strResult : TStringList;
27 unknownFlag : boolean = false
31 const strValue : string
35 const strValue : string
39 const strValue : string
43 const strValue : string
47 \brief MachiesMask
\82Ì
\83N
\83\8d\81[
\83\93
48 \warning
\82Æ
\82è
\82 \82¦
\82¸
\82Ì
\91ã
\97p
\95i
\82È
\82Ì
\82Å []
\82ð
\8eg
\82Á
\82½
\90³
\8bK
\95\
\8c»
\82ð
\8dl
\97¶
\82µ
\82Ä
\82¢
\82È
\82¢
\82±
\82Æ
\82É
\92\8d\88Ó
\81I
\81I
\81I
51 const filename, mask : string
54 //!
\83\81\83^
\83L
\83\83\83\89\83N
\83^
\82ð
\90³
\8bK
\95\
\8c»
\88µ
\82¢
\82É
\82È
\82ç
\82È
\82¢
\82æ
\82¤
\82É
\92u
\8a·
55 function RegExpEncode(
60 \brief
\95\
\8e¦
\83\81\83b
\83Z
\81[
\83W
\82Ì
\90®
\8c`
61 \param msg
\95\
\8e¦
\82·
\82é
\83\81\83b
\83Z
\81[
\83W
62 \param elements
\92u
\8a·
\92P
\8cê
64 msg
\82Ì
\92\86\82Ì
\92u
\8a·
\82³
\82ê
\82é
\92P
\8cê
\82Í '^
\94Ô
\8d\86'
\82Å
\95\
\82³
\82ê
\81A
65 elements
\82Í
\89ü
\8ds
\82É
\82æ
\82Á
\82Ä
\92P
\8cê
\95ª
\82¯
\82³
\82ê
\82Ü
\82·
\81B<br>
68 elements := IntToStr( 10 ) + #10 + 'hoge';
70 '^0
\8cÂ
\82Ì
\81g^1
\81h
\82ð
\92u
\8a·
\82µ
\82Ü
\82µ
\82½
\81B',
74 \82Å
\8fo
\97Í
\82³
\82ê
\82é m
\82Í
\81u10
\8cÂ
\82Ì
\81ghoge
\81h
\82ð
\92u
\8a·
\82µ
\82Ü
\82µ
\82½
\81B
\81v
\82Æ
\82È
\82è
\82Ü
\82·
\81B
76 function MessageStyle(
78 const elements : string
81 function MessageStyle(
83 const elements : TStringList
87 \brief
\89E
\89ñ
\93]
\83V
\83t
\83g
88 \param v
\89ñ
\93]
\82·
\82é
\92l
89 \param n
\89ñ
\93]
\83r
\83b
\83g
\90\94
90 \return Longword( (v shl (32 - n)) or (v shr n) )
\82Ì
\92l
92 function ror( v, n : Longword ) : Longword; register;
95 \brief
\95¶
\8e\9a\97ñ
\82Ì
\83n
\83b
\83V
\83\85\92l
\82ð
\8cv
\8eZ
96 \param s
\95¶
\8e\9a\97ñ
97 \return
\83n
\83b
\83V
\83\85\92l ( 4 byte )
98 \warning
\91½
\83o
\83C
\83g
\82ð 4 byte
\82É
\8fk
\82ß
\82Ä
\82¢
\82é
\82½
\82ß
\81A
99 \93¯
\82¶
\92l
\82ð
\8fo
\97Í
\82·
\82é
\95¶
\8e\9a\97ñ
\82Í
\96³
\8cÀ
\82É
\91¶
\8dÝ
\82µ
\82Ü
\82·
\81B
100 \83R
\83\93\83t
\83\8a\83N
\83g
\82ª
\8bN
\82±
\82ç
\82È
\82¢
\8e\96\82ð
\91O
\92ñ
\82É
\82µ
\82½
\8bL
\8fq
\82Í
\94ð
\82¯
\82Ä
\82
\82¾
\82³
\82¢
\81B
102 \82±
\82Ì
\8aÖ
\90\94\82Í
\91½
\83o
\83C
\83g
\92·
\82Ì
\95¶
\8e\9a\97ñ
\82ð 4 byte
\82É
\8fk
\82ß
\82Ü
\82·
\81B<br>
103 \82»
\82Ì
\89ß
\92ö
\82Å
\81A'abcdefgh'
\82Æ 'efghabcd'
\82ª
\93¯
\82¶
\92l
\82É
\82È
\82ç
\82È
\82¢
\82æ
\82¤
\82É
\82·
\82é
\93\99\81A
104 \91½
\8f
\95Î
\82è
\82ð
\8fÈ
\82
\82æ
\82¤
\82É
\8dl
\97¶
\82³
\82ê
\82Ü
\82·
\81B
106 function GetStringHash( const s : string ) : Longword;
109 //! Mode
\92l
\82ª
\82¨
\82©
\82µ
\82¢
110 EMappedFileModeError = class( Exception );
111 //!
\83}
\83b
\83s
\83\93\83O
\82É
\8e¸
\94s
112 EMappedFileMappingError = class( Exception );
114 //!
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\81E
\83t
\83@
\83C
\83\8b \83N
\83\89\83X
115 TMappedFile = class( TObject )
117 FFileHandle : THandle;
118 FMappingHandle : THandle;
120 FViewAddress : Pointer;
123 \brief
\83\81\83\82\83\8a\83}
\83b
\83v
\83h
\83t
\83@
\83C
\83\8b\82Ì
\8dì
\90¬
124 \param filePath
\8aJ
\82
\83t
\83@
\83C
\83\8b\82Ì
\83p
\83X
125 \param mode fmOpenRead (
\83f
\83t
\83H
\83\8b\83g)
\82Ü
\82½
\82Í fmOpenReadWrite
126 \param maximumSize
\83y
\81[
\83W
\83T
\83C
\83Y
\82Ì
\8fã
\8cÀ (0
\82È
\82ç
\8c»
\8dÝ
\82Ì
\83t
\83@
\83C
\83\8b\83T
\83C
\83Y)
129 const filePath : string;
130 mode : Longword = fmOpenRead;
131 maximumSize : Int64 = 0 );
132 destructor Destroy; override;
134 //!
\83T
\83C
\83Y
\82Ì
\8eæ
\93¾
135 property Size : Int64 read FSize;
136 //!
\83A
\83h
\83\8c\83X
\82Ì
\8eæ
\93¾
137 property Memory : Pointer read FViewAddress;
140 //==================================================
142 //==================================================
143 kYofKanji : TSysCharSet = [#$80..#$A0, #$E0..#$ff];
145 //==================================================
147 //==================================================
151 procedure ExtractHttpFields(
152 const chrSep : TSysCharSet;
153 const chrWhite : TSysCharSet;
154 const strValue : string;
155 var strResult : TStringList;
156 unknownFlag : boolean = false
159 last, p, strLen : Integer;
162 strLen := Length( strValue );
169 if strValue[ p ] in chrSep then
171 strResult.Add( Copy( strValue, last, p - last ) );
180 strResult.Add( Copy( strValue, last, strLen - last + 1 ) );
185 const strValue : string
193 strLen := Length( strValue );
199 case strValue[ i ] of
202 strResult := strResult + '&';
206 strResult := strResult + '<';
210 strResult := strResult + '>';
214 strResult := strResult + '"';
218 if strValue[ i ] in kYofKanji then
220 strResult := strResult + strValue[ i ];
223 strResult := strResult + strValue[ i ];
236 const strValue : string
242 strResult := StringReplace( strValue, '<', '<', [rfReplaceAll] );
243 strResult := StringReplace( strResult, '>', '>', [rfReplaceAll] );
244 strResult := StringReplace( strResult, '"', '"', [rfReplaceAll] );
245 strResult := StringReplace( strResult, '&', '&', [rfReplaceAll] );
252 const strValue : string
260 kHexCode : array [0..15] of char = (
261 '0', '1', '2', '3', '4', '5', '6', '7',
262 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' );
265 strLen := Length( strValue );
271 case strValue[ i ] of
272 '0' .. '9', 'a' .. 'z', 'A' .. 'Z', '*', '-', '.', '@', '_':
274 strResult := strResult + strValue[ i ];
278 b := Integer( strValue[ i ] );
279 strResult := strResult + '%'
280 + kHexCode[ b div $10 ]
281 + kHexCode[ b mod $10 ];
297 mov ecx, eax // ecx = (ch - 'a')
299 cmp ecx, 26 // edx = ecx < 26 (
\8f¬
\95¶
\8e\9a\82È
\82ç
\83t
\83\8b\83r
\83b
\83g)
301 and edx, $20 // edx &= 0x20 (
\8f¬
\95¶
\8e\9a\82È
\82ç 0x20)
302 xor eax, edx // eax ^= edx
306 const strValue : string
315 strLen := Length( strValue );
321 if '%' = strValue[ i ] then begin
323 if strValue[ i ] in ['a' .. 'z', 'A' .. 'Z'] then
324 b := (toupper( Longword( strValue[ i ] ) ) - 55) shl 4
326 b := (Byte( strValue[ i ] ) - Byte( '0' )) shl 4;
328 if strValue[ i ] in ['a' .. 'z', 'A' .. 'Z'] then
329 b := b or (toupper( Longword( strValue[ i ] ) ) - 55)
331 b := b or (Byte( strValue[ i ] ) - Byte( '0' ));
333 strResult := strResult + Char( Byte( b ) );
335 strResult := strResult + strValue[ i ];
346 function MatchesMask(
347 const filename, mask : string
350 pName, pMask : Integer;
351 ptrName, ptrMask : PChar;
352 nameLen, maskLen : Integer;
354 delimiterPos : Integer;
357 nameLen := Length( filename );
358 maskLen := Length( mask );
359 ptrName := PChar( filename );
360 ptrMask := PChar( mask );
363 delimiterPos := Pos( '\', string( ptrName + pName ) );
364 while delimiterPos > 0 do
366 pName := pName + delimiterPos;
367 delimiterPos := Pos( '\', string( ptrName + pName ) );
370 while (pMask < maskLen) and (pName < nameLen) do
373 case ptrMask[ pMask ] of
376 //
\82±
\82Ì 1
\8e\9a\82Í
\89½
\82à
\82µ
\82È
\82¢
381 // mask
\82ð
\91\96\8d¸
\82µ
\90Ø
\82Á
\82½
\82ç
\8fI
\97¹
382 if pMask >= maskLen then
388 // *
\82Ì
\8e\9f\82Ì
\95¶
\8e\9a\82ª
\97\88\82é
\82Ü
\82Å
\94ò
\82Î
\82·
389 chrUpMask := upcase( ptrMask[ pMask ] );
390 while chrUpMask <> UpCase( ptrName[ pName ] ) do
393 if pName >= nameLen then
400 // *
\82Ì
\8e\9f\82Ì
\95¶
\8e\9a\82ª
\8c©
\82Â
\82©
\82ç
\82È
\82©
\82Á
\82½
\82ç
\8fI
\97¹
401 if chrUpMask <> UpCase( ptrName[ pName ] ) then
412 //
\82±
\82Ì 1
\95¶
\8e\9a\82ª
\88á
\82Á
\82½
\82ç
\8fI
\97¹
413 if UpCase( ptrMask[ pMask ] ) <> UpCase( ptrName[ pName ] ) then
422 //
\8e\9f\82Ì
\95¶
\8e\9a\82Ö
428 if (pMask >= maskLen) and (pName >= nameLen) then
435 function RegExpEncode(
442 strResult := StringReplace( text, '\', '\\', [rfReplaceAll] );
443 strResult := StringReplace( strResult, '[', '\[', [rfReplaceAll] );
444 strResult := StringReplace( strResult, ']', '\]', [rfReplaceAll] );
445 strResult := StringReplace( strResult, '(', '\(', [rfReplaceAll] );
446 strResult := StringReplace( strResult, ')', '\)', [rfReplaceAll] );
447 strResult := StringReplace( strResult, '[', '\[', [rfReplaceAll] );
448 strResult := StringReplace( strResult, ']', '\]', [rfReplaceAll] );
449 strResult := StringReplace( strResult, '*', '\*', [rfReplaceAll] );
450 strResult := StringReplace( strResult, '?', '\?', [rfReplaceAll] );
451 strResult := StringReplace( strResult, '.', '\.', [rfReplaceAll] );
452 strResult := StringReplace( strResult, '+', '\+', [rfReplaceAll] );
453 strResult := StringReplace( strResult, '|', '\|', [rfReplaceAll] );
454 strResult := StringReplace( strResult, '^', '\^', [rfReplaceAll] );
455 strResult := StringReplace( strResult, '$', '\$', [rfReplaceAll] );
461 function MessageStyle(
463 const elements : string
469 list := TStringList.Create;
471 list.Text := elements;
472 Result := MessageStyle( msg, list );
479 function MessageStyle(
481 const elements : TStringList
488 for i := elements.Count - 1 downto 0 do
489 Result := CustomStringReplace( Result, '^' + IntToStr( i ), elements[ i ], false );
493 //==============================
495 //==============================
496 function ror( v, n : Longword ) : Longword; register;
502 //==============================
504 //==============================
505 function GetStringHash( const s : string ) : Longword;
515 tail := p + (l and $fffffffc);
516 while p < tail do begin
517 v := PDword( p )^ + (v shl 2) * ($10000 - v);
520 tail := PChar( s ) + l;
521 while p < tail do begin
522 v := PByte( p )^ + (v shl 2) * ($10000 - v);
526 Result := v xor ((v shl 2) * ($10000 - v));
532 constructor TMappedFile.Create(
533 const filePath : string;
534 mode : Longword = fmOpenRead;
535 maximumSize : Int64 = 0 );
537 dwFileDesiredAccess : DWORD;
539 dwViewDesiredAccess : DWORD;
545 dwFileDesiredAccess := GENERIC_READ;
546 flProtect := PAGE_READONLY;
547 dwViewDesiredAccess := FILE_MAP_READ;
552 dwFileDesiredAccess := GENERIC_READ or GENERIC_WRITE;
553 flProtect := PAGE_READWRITE;
554 dwViewDesiredAccess := FILE_MAP_WRITE;
558 raise EMappedFileModeError.Create( '
\83t
\83@
\83C
\83\8b\83I
\81[
\83v
\83\93\82Ì
\83\82\81[
\83h
\82ª
\95s
\90³
\82Å
\82·
\81B' );
561 FFileHandle := CreateFile(
562 PChar( filePath ), dwFileDesiredAccess, 0, nil, OPEN_ALWAYS,
563 FILE_ATTRIBUTE_NORMAL, 0 );
564 if FFileHandle = INVALID_HANDLE_VALUE then
565 raise EFOpenError.Create( '
\83t
\83@
\83C
\83\8b\82Ì
\83I
\81[
\83v
\83\93\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B' );
567 FSize := GetFileSize( FFileHandle, nil );
568 if FSize < maximumSize then
569 FSize := maximumSize;
571 FMappingHandle := CreateFileMapping(
572 FFileHandle, nil, flProtect,
573 DWORD( (maximumSize shr 32) and $ffffffff ),
574 DWORD( maximumSize and $ffffffff ),
576 if FFileHandle = INVALID_HANDLE_VALUE then
577 raise EMappedFileMappingError.Create( '
\83t
\83@
\83C
\83\8b\82Ì
\83}
\83b
\83s
\83\93\83O
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B' );
579 FViewAddress := MapViewOfFile( FMappingHandle, dwViewDesiredAccess, 0, 0, 0 );
580 if FViewAddress = nil then
581 raise EMappedFileMappingError.Create( '
\83t
\83@
\83C
\83\8b\82Ì
\83}
\83b
\83s
\83\93\83O
\82É
\8e¸
\94s
\82µ
\82Ü
\82µ
\82½
\81B' );
585 destructor TMappedFile.Destroy;
588 UnmapViewOfFile( FViewAddress );
589 CloseHandle( FMappingHandle );
590 CloseHandle( FFileHandle );