Timestamping mit wget und aria2

Timestamping mit wget und aria2

Postby hbuhrmester » 15.04.2016, 10:18

Timestamping mit wget und aria2

Das Timestamping funktioniert in wget anders als in aria2.

wget sendet nacheinander zwei Abfragen an den Webserver:

  • In der ersten HEAD-Abfrage werden nur die Dateiheader abgefragt. Daran erkennt wget das Änderungsdatum der Datei auf dem Server.
  • Wenn die Datei auf dem Server neuer ist als die lokale Datei, wird sie mit einer zweiten GET-Abfrage heruntergeladen.

Das hat bei bei wget einige Tücken:

  • wget lädt auch alle Dateien neu herunter, wenn sie eine unterschiedliche Dateigröße haben. Das ist so auch dokumentiert. Manchmal wird dadurch eine neuere Datei durch eine ältere ersetzt.
  • In einem Content Delivery Network antworten nicht immer dieselben Server. Manchmal bekommt wget mit der GET-Abfrage eine andere Datei, als vorher mit der HEAD-Abfrage beschrieben wurde. Manchmal lädt wget mit viel Aufwand genau dieselbe Datei neu herunter, die bereits lokal vorhanden ist. Habe ich alles schon gesehen.

aria2 verwendet standardmäßig immer nur eine GET-Abfrage. Dafür sendet aria2 einen zusätzlichen Header "If-Modified-Since" mit, in dem das Änderungsdatum der lokalen Datei angegeben ist. Es ist dann Aufgabe des Webservers, dieses Datum mit der Datei auf dem Server zu vergleichen. Der Server kann auf zwei Arten antworten:

Code: Select all
HTTP/1.1 304 Not Modified — die Datei wird nicht heruntergeladen
HTTP/1.1 200 OK — damit wird die Datei gesendet


Im Prinzip ist das die bessere Methode. In den allerneuesten Versionen von wget wird diese Methode ebenfalls unterstützt.

Das Problem ist nur, dass die Microsoft-Server den Header "If-Modified-Since" manchmal gar nicht auswerten, sondern immer mit "200 OK" antworten und die Datei gleich mitschicken. Dann findet gar kein Timestamping mehr statt. Diese fraglichen Server sind immer vom Typ:

Code: Select all
Server: Microsoft-IIS/8.5


Eventuell kann man das Verhalten von aria2 noch etwas verbessern, indem man zusätzlich die Option --use-head verwendet:

Code: Select all
--use-head[=true|false]
  Use  HEAD  method  for  the  first  request  to the HTTP server.
  Default: false


Es steht zwar nicht dabei, wozu diese zusätzliche Abfrage gut sein soll, aber eigentlich kann es nur dazu dienen, das Timestamping selber lokal zu bestimmen.

Wenn man eine Datei wirklich eindeutig identifizieren will, kann man am besten den ETag abfragen. Das ist zum Beispiel eine Hashsumme und eine UUID. Abgefragt wird der ETag mit den Headern "If-Match" und "If-None-Match". Man braucht dazu zwei Abfragen:

Code: Select all
/tmp$ wget --spider --server-response http://www.wsusoffline.net/index.html
Spider-Modus eingeschaltet.  Prüfe ob die Datei auf dem Server existiert.
--2016-04-15 10:51:43--  http://www.wsusoffline.net/index.html
Auflösen des Hostnamen »www.wsusoffline.net (www.wsusoffline.net)«... 81.3.27.18
Verbindungsaufbau zu www.wsusoffline.net (www.wsusoffline.net)|81.3.27.18|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort...
  HTTP/1.1 200 OK
  Date: Fri, 15 Apr 2016 08:50:07 GMT
  Server: Apache/2.2.16 (Debian)
  Last-Modified: Fri, 18 Mar 2016 14:19:07 GMT
  ETag: "116062-1382-52e536e0c0cc0"
  Accept-Ranges: bytes
  Content-Length: 4994
  Vary: Accept-Encoding
  Keep-Alive: timeout=2, max=1000
  Connection: Keep-Alive
  Content-Type: text/html
Länge: 4994 (4,9K) [text/html]
Datei auf dem Server existiert und könnte weitere Links enthalten,
aber Rekursion ist abgeschaltet -- kein Download.


/tmp$ wget --debug --header='If-Match: "116062-1382-52e536e0c0cc0"' http://www.wsusoffline.net/index.html
Setting --header (header) to If-Match: "116062-1382-52e536e0c0cc0"
DEBUG output created by Wget 1.13.4 on linux-gnu.

URI encoding = »UTF-8«
--2016-04-15 10:53:56--  http://www.wsusoffline.net/index.html
Auflösen des Hostnamen »www.wsusoffline.net (www.wsusoffline.net)«... 81.3.27.18
Caching www.wsusoffline.net => 81.3.27.18
Verbindungsaufbau zu www.wsusoffline.net (www.wsusoffline.net)|81.3.27.18|:80... verbunden.
Created socket 3.
Releasing 0x0a08c000 (new refcount 1).

---request begin---
GET /index.html HTTP/1.1
User-Agent: Wget/1.13.4 (linux-gnu)
Accept: */*
Host: www.wsusoffline.net
Connection: Keep-Alive
If-Match: "116062-1382-52e536e0c0cc0"

---request end---
HTTP-Anforderung gesendet, warte auf Antwort...
---response begin---
HTTP/1.1 200 OK
Date: Fri, 15 Apr 2016 08:52:20 GMT
Server: Apache/2.2.16 (Debian)
Last-Modified: Fri, 18 Mar 2016 14:19:07 GMT
ETag: "116062-1382-52e536e0c0cc0"
Accept-Ranges: bytes
Content-Length: 4994
Vary: Accept-Encoding
Keep-Alive: timeout=2, max=1000
Connection: Keep-Alive
Content-Type: text/html

---response end---
200 OK
Registered socket 3 for persistent reuse.
Länge: 4994 (4,9K) [text/html]
In »»index.html«« speichern.

100%[===========================================================================>] 4.994       --.-K/s   in 0,06s   

2016-04-15 10:53:58 (83,3 KB/s) - »»index.html«« gespeichert [4994/4994]



Mit einem anderen ETag wird der Server aber eine Fehlermeldung senden:

Code: Select all
/tmp$ wget --debug --header='If-Match: "116062-1380-51dc5249412c0"' http://www.wsusoffline.net/index.html
Setting --header (header) to If-Match: "116062-1380-51dc5249412c0"
DEBUG output created by Wget 1.13.4 on linux-gnu.

URI encoding = »UTF-8«
--2016-04-15 10:52:49--  http://www.wsusoffline.net/index.html
Auflösen des Hostnamen »www.wsusoffline.net (www.wsusoffline.net)«... 81.3.27.18
Caching www.wsusoffline.net => 81.3.27.18
Verbindungsaufbau zu www.wsusoffline.net (www.wsusoffline.net)|81.3.27.18|:80... verbunden.
Created socket 3.
Releasing 0x0810c000 (new refcount 1).

---request begin---
GET /index.html HTTP/1.1
User-Agent: Wget/1.13.4 (linux-gnu)
Accept: */*
Host: www.wsusoffline.net
Connection: Keep-Alive
If-Match: "116062-1380-51dc5249412c0"

---request end---
HTTP-Anforderung gesendet, warte auf Antwort...
---response begin---
HTTP/1.1 412 Precondition Failed
Date: Fri, 15 Apr 2016 08:51:13 GMT
Server: Apache/2.2.16 (Debian)
Last-Modified: Fri, 18 Mar 2016 14:19:07 GMT
ETag: "116062-1382-52e536e0c0cc0"
Accept-Ranges: bytes
Content-Length: 0
Vary: Accept-Encoding
Keep-Alive: timeout=2, max=1000
Connection: Keep-Alive
Content-Type: text/html

---response end---
412 Precondition Failed
Registered socket 3 for persistent reuse.
] done.
2016-04-15 10:52:50 FEHLER 412: Precondition Failed.



(Nur um die Server-Logs für die Admins mal etwas interessanter zu gestalten)

Referenzen:
https://en.wikipedia.org/wiki/List_of_H ... der_fields
https://tools.ietf.org/html/rfc7232#section-2.3

Concerning Etags and Datestamps (PDF)
http://iwaw.europarchive.org/04/Clausen.pdf
hbuhrmester
 
Posts: 381
Joined: 11.10.2013, 20:59

Return to Anregungen / Suggestions

Who is online

Users browsing this forum: Google [Bot] and 5 guests