Обнаруживать, поддерживает ли URL-адрес HTTP2 с использованием запроса AJAX в Chrome Extension?

Я хочу, чтобы пользователь мог ввести URL своего веб-сайта в поле ввода, входящее в состав расширения Chrome, и расширение Chrome будет использовать запрос AJAX или что-то подобное для обнаружения и указания пользователю, если сервер за URL-адресом поддерживает отправку ответов через HTTP2. Возможно ли это?

Возможно, у WebRequest есть способ получить эту информацию? Или новый API-интерфейс Fetch? Может ли ваш запрос сказать серверу, что понимают только ответы HTTP2? Я не вижу очевидного пути.

Я знаю, что вы можете использовать window.chrome.loadTimes().connectionInfo для получения протокола текущей страницы, но для этого требуется загрузить всю страницу, которую я не хочу делать.

Пример URLS:

Поставляется через HTTP2: https://cdn.sstatic.net/

Поставлено через HTTP 1.1: /qaru.site/...

Ответ 1

Для ответов HTTP/2 требуется заголовок ответа "статус" - https://http2.github.io/http2-spec/#HttpResponse, поэтому, чтобы проверить, использует ли ответ HTTP/2, вы можете использовать chrome.webRequest.onHeadersReceived событие с "responseHeaders" в extraInfoSpec. Например, с вашими тестовыми примерами:

chrome.webRequest.onHeadersReceived.addListener(function(details) {
    var isHttp2 = details.responseHeaders.some(function(header) {
        return header.name === 'status';
    });
    console.log('Request to ' + details.url + ', http2 = ' + isHttp2);
}, {
    urls: ['https://cdn.sstatic.net/*', 'http://stackoverflow.com/*'],
    types: ['xmlhttprequest']
}, ['responseHeaders']);

// Tests:
fetch('http://stackoverflow.com');
fetch('https://cdn.sstatic.net');

Ответ 2

EDIT: Очевидно, вы можете сделать это с помощью iframe и webRequest. Я нашел ссылку (но я ее не тестировал сам):

https://gist.github.com/dergachev/e216b25d9a144914eae2

OLD ANSWER

Вероятно, вы не сможете это сделать без внешнего API. Вот почему

1) Использование ajax требует только того, чтобы сервер проверяемого URL отправил заголовки CORS пользователю, иначе браузер не примет его.

2) Вы можете создать iframe на лету и использовать chrome.loadTimes().connectionInfo в iframe contentWindow, но если сервер отправит заголовок X-Frame-Options: Deny, браузер не позволит вам загрузить URL-адрес в iframe также.

3) Разделение заголовков X-frame через API webRequest, как указано здесь

Обход X-Frame-Options DENY в расширении Chrome?

скорее всего, не сработает, расширение afaik Chrome не разрешено изменять тело ответа.

Возможные решения

1) Вышеупомянутые проблемы могут быть решены с помощью простого прокси-сервера, который добавляет соответствующие заголовки. Здесь ссылка на то, как это сделать, используя Nginx

http://balaji-damodaran.com/programming/2015/07/30/nginx-headers.html

2) Просто создайте настраиваемый API, который выполняет запрос для вас на стороне сервера, и проверит результат для проверки поддержки http2. Если ваше расширение становится популярным, все равно будет довольно легко его масштабировать, например, путем кеширования и горизонтального масштабирования.

Надеюсь, это поможет!