Toon posts:

[Delphi] Useragent-string maken mbv versie-informatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
De meesten van jullie weten waarschijnlijk wel dat een browser bij het opvragen van een webpagina een 'useragent'-string meestuurt. Dit ziet er bijvoorbeeld zo uit bij Internet Explorer 6.0:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Of zo bij Firefox:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040608 Firefox/0.8.0+
Ik heb in Delphi een programma geschreven dat pagina's opvraagt via HTTP, en hierbij stuur ik mijn eigen useragent mee, zodat later te herkennen is welke requests er precies door mijn programma zijn gemaakt. Tot voor kort had ik mijn useragent als volgt opgebouwd:
ProgrammaNaam/1.0
waarbij 1.0 staat voor het versienummer, dat dus steeds veranderde bij nieuwe versies.

Nu wil ik ook informatie meesturen over het besturingssysteem. Delphi heeft standaard informatie over de Windows-versie in SysUtils staan, dus die kon ik mooi gebruiken. Op een pagina bij Microsoft is te lezen welk versienummer overeenkomt met een bepaalde Windows-versie.

Ik heb nu een functie geschreven die op basis van de versie-informatie een string teruggeeft zoals "Windows NT 5.1", "Windows 98" etc.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function getOsDescription(): String;
begin
  Result := 'Windows';

  if (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then
  begin
    if (Win32MajorVersion = 4) and (Win32MinorVersion = 0) then
      Result := 'Windows 95' // Windows 95
    else if (Win32MajorVersion = 4) and (Win32MinorVersion = 10) then
      Result := 'Windows 98' // Windows 98
    else if (Win32MajorVersion = 4) and (Win32MinorVersion = 90) then
      Result := 'Windows Me' // Windows Me
  end
  else if (Win32Platform = VER_PLATFORM_WIN32_NT) then
  begin
    Result := 'Windows NT';

    if (Win32MajorVersion = 3) and (Win32MinorVersion = 51) then
      Result := 'Windows NT 3.51' // Windows NT 3.51
    else if (Win32MajorVersion = 4) and (Win32MinorVersion = 0) then
      Result := 'Windows NT 4.0' // Windows NT 4.0
    else if (Win32MajorVersion = 5) and (Win32MinorVersion = 0) then
      Result := 'Windows NT 5.0' // Windows 2000
    else if (Win32MajorVersion = 5) and (Win32MinorVersion = 1) then
      Result := 'Windows NT 5.1' // Windows XP
    else if (Win32MajorVersion = 5) and (Win32MinorVersion = 2) then
      Result := 'Windows NT 5.2' // Windows 2003
  end;
end;


Nu is mijn vraag: komen deze strings overeen met wat de verschillende browsers onder die besturingssystemen ook echt in de useragent-string zetten? Ik heb zelf alleen Windows XP om het op te testen, en daar krijg ik inderdaad "Windows NT 5.1" terug als ik getOsDescription() aanroep.

Ik zou graag willen weten of mijn functie de correcte waarden teruggeeft en of ik misschien Windows-versies over het hoofd heb gezien, die ook apart moeten worden opgegeven.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Om het generiek te houden, kun je misschien beter (in geval van NT) het op een generieke manier oplossen:

Delphi:
1
2
Result := Format('Windows NT %d.%d',
   [Win32MajorVersion, Win32MinorVersion]);
Maar wat jij doet, zou in principe prima moeten werken op de OSsen die in je code staan.

disclaimer: niet getest

[ Voor 3% gewijzigd door _Thanatos_ op 15-07-2004 09:17 ]

日本!🎌


Verwijderd

Topicstarter
_Thanatos_ schreef op 15 juli 2004 @ 09:16:
Om het generiek te houden, kun je misschien beter (in geval van NT) het op een generieke manier oplossen...
Mijn code is in feite direct afgeleid van de tabel met versienummers op de website van Microsoft (zie link in startpost). Ik had niet gekeken of ik nog optimalisaties kon uitvoeren, maar jouw tip lijkt me best handig. Bij de Windows NT-familie bouw ik de strings nu toch steeds op volgens het patroon "Windows NT Major.Minor"

Nu ik dat van tevoren toch al weet, kan ik het net zo goed direct in zo'n formaat omzetten. Blijft nog steeds de vraag of dit dan ook écht de useragent-strings zijn die de betreffende browsers onder die systemen meesturen.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

http://www.mrsneeze.com/httplogs/useragents.html

Zo te zien mag/kan het dus op verschillende manieren. Behalve "Win32" zie ik ook zowel "Windows NT 5.0" als "Windows 2000" langskomen. Windows 95 / 98 / ME worden blijkbaar wel altijd als zodanig meegegeven.

btw, ik kan ook wel ff een bestandje met useragents van de website van m'n werk naar je toe mailen. die zijn denk ik wat moderner dan die site :)

[ Voor 42% gewijzigd door _Thanatos_ op 16-07-2004 01:02 ]

日本!🎌


Verwijderd

Topicstarter
Dit is de uiteindelijke functie geworden, die lijkt tot nu toe prima te werken voor de verschillende Windows-versies:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function getOsDescription(): String;
begin
  Result := 'Windows';

  if (Win32Platform = VER_PLATFORM_WIN32_WINDOWS) then
  begin
    if (Win32MajorVersion = 4) and (Win32MinorVersion = 0) then
      Result := 'Windows 95'
    else if (Win32MajorVersion = 4) and (Win32MinorVersion = 10) then
      Result := 'Windows 98'
    else if (Win32MajorVersion = 4) and (Win32MinorVersion = 90) then
      Result := 'Windows Me'
  end
  else if (Win32Platform = VER_PLATFORM_WIN32_NT) then
    Result := Format('Windows NT %d.%d', [Win32MajorVersion, Win32MinorVersion]);
end;