WWW.responseHeader [ "STATUS" ] не существует

Я уже спрашивал answers.unity3d, но поскольку ответа нет, я тоже спрошу о SO..

Я не могу получить http-статус ответа на объекте WWW на Windows Phone 8 и Windows RT 8.1 ( в то время как это нормально на IOS/Android).

www.responseHeader["STATUS"] не существует, а скрытое поле _responseHeaderString не содержит в качестве первой строки

HTTP/1.1 200 OK


responseHeaderString:

Server: nginx
Date: Wed, 21 Oct 2015 07:44:36 GMT
Last-Modified: Mon, 07 Sep 2015 11:43:46 GMT
Connection: keep-alive
Expires: Fri, 20 Nov 2015 07:44:36 GMT
Cache-Control: max-age=2592000
Cache-Control: public

responseHeader:

{
    "SERVER"       : "nginx"
    "DATE"         : "Wed, 21 Oct 2015 07:44:36 GMT"
    "LAST-MODIFIED": "Mon, 07 Sep 2015 11:43:46 GMT"
    "CONNECTION"   : "keep-alive"
    "EXPIRES"      : "Fri, 20 Nov 2015 07:44:36 GMT"
    "CACHE-CONTROL": "public"
}

Пример кода для воспроизведения: (проверен на пустой новый проект)

WWW www = new WWW("http://www.google.com");

yield return www;

Debug.Log("Google Status : " + www.responseHeaders.ContainsKey("STATUS")); // False
Debug.Log(www.text); // <doctype ...
Debug.Log(www.responseHeaders["STATUS"]); // KeyError

Я что-то пропустил или есть кто-то, кто может подтвердить это как ошибку?

Edit:  Все еще не удается получить статус http с последним 5.3

Ответы

Ответ 1

Вероятно, ваш сетевой сервер отвечает другим (неожиданным) ответом на каждое устройство. По различным причинам, таким как строка пользовательского агента, которая может привести к тому, что класс WWW не получит STATUS.

Во-первых, я бы установил прокси-сервер, чтобы вы могли точно видеть, что отправляет телефон и что такое серверный ответ. Либо Charles Proxy (mac/windows) или Fiddler (окна) велики.

Вот фактический код, который использует Unity WWW для генерации статуса:

        if (num++ == 0 && text.StartsWith("HTTP"))
        {
            dictionary["STATUS"] = text;
        }

Ссылка: https://github.com/MattRix/UnityDecompiled/blob/master/UnityEngine/UnityEngine/WWW.cs#L483

Из прокси должно быть ясно, что происходит. Если нет, отправьте запрос и ответ здесь (как raw).

Ответ 2

Попробуйте прочитать www.error перед поиском заголовка STATUS.

// Construct the response object
string error = www.error;
if (error == null) {
    if (www.responseHeaders.ContainsKey("STATUS")) {
        string [] status=www.responseHeaders["STATUS"].Split(' ');
        if (status.Length>2 && status[2] != "OK") {
            error = www.responseHeaders["STATUS"];
        }
    }
}