2017-02-22 104 views
1

Мы посылаем запросы XHR к нашему бэкэнду, получая таким образом такого рода объекты реагирования (независимо от браузера):С HTTP/2 только, `statusText` свойство XMLHttpRequest ответов, как представляется, агент пользователя определяется

{ 
    status: 200, 
    statusText: "OK", 
    config: {...}, 
    data: {...} 
} 

Мы просто перешли на другой балансировщик нагрузки, который поддерживает HTTP/2. По какой-то причине statusText свойство в настоящее время различается в зависимости от браузера:

Chrome (56.0.2924.87):

{ 
    status: 200, 
    statusText: "", // empty 
    config: {...}, 
    data: {...} 
} 

Firefox (51.0.1):

{ 
    status: 200, 
    statusText: "OK", // as previously (+1) 
    config: {...}, 
    data: {...} 
} 

Сафари (10.0.3):

{ 
    status: 200, 
    statusText: "HTTP/2.0 200", // ?! 
    config: {...}, 
    data: {...} 
} 

У нас был устаревший код, который читал это свойство statusText, поэтому некоторые действия были сломаны. Это было легко исправлено (так что в конце концов это неплохо), но все же, почему остается ... Любая идея, что происходит?

Боковые ноты:

  • Мы используем AngularJS 1.x, но it is simply copying this statusText property from the XHR response, так что это не должно быть проблемой Угловое.

  • Как кажется, это зависит от браузера, это не должно быть проблемой балансировки нагрузки ... Я не прав? (DevOps мозги нужны)

  • я тогда ожидал найти в некоторых спецификациях что-то вроде «statusText является агентом пользователя определяется, так что вы не должны полагаться на него» (just like Storage#key(...), например), но ни MDN, ни Fetch standard предоставляет информацию об этом объекте.

ответ

1

Согласно MDN:

XMLHttpRequest.statusText свойство возвращает DOMString, содержащее сообщение о состоянии в ответ, как возвращенный сервером HTTP.

Таким образом, вероятность того, что ваша конфигурация балансировки нагрузки не будет на 100% синхронизирована. Может быть какая-то конфигурация сервера, которая отправляет обратно другой ответ на основе пользовательского агента, делающего запрос.

+0

Интересно, я лично понял это предложение как «* сервер возвращает статус (например, 200, 403), а' statusText' содержит соответствующее сообщение о состоянии *. Другими словами, «сервер отвечает только за статус», поэтому «что-то» отвечает за заполнение этого имущества, но я, возможно, неправильно понял. А также, если это была сторонняя сторона, то это должно было произойти через HTTP/1.x, а также ИМХО, что вы думаете? – sp00m

+2

Это не то, как я это интерпретирую. На самом деле, не имеет смысла ни для чего, кроме сервера, для отправки как «status», так и «statusText», поскольку будущие изменения в HTTP могут привести к новым ответам.Именно поэтому я считаю, что ваш переключатель в HTTP/2 в новой балансированной нагрузке среде является виновником. Я не думаю, что клиенты вовлечены вообще (за исключением отправки их строки пользовательского агента на сервер). –

+0

Большое спасибо за ваши мысли, я дважды проверю эти спецификации балансировки нагрузки, тогда я буду держать вас в курсе :) – sp00m