Was steht denn insgesamt in ErrorMessage / ErrorMessage.Text drin?
Wenn ich mich nirgendwo verzählt hab, dann sollte in [0] ein Text passend zum ErrorCode stehen,
in [1] eine Zusatzinfo, wie z.B. das übersetzte GetLastError
und ab [2], falls vorhanden, der empfangene HTTP-Header.
[edit]
Stimmt, die erste Zeile vom HTTP-Header ist noch anders formatiert.
Dein zweiter Code ist also richtig.
Bei den 3xx-StatusCodes könnte man sich mit
URL := Trim(ErrorMessage.Value['Location']);
die neue
URL besorgen.