2015-04-22 3 views
1

Я пытаюсь сделать свое первое расширение Chrome, и это был довольно опыт обучения. Я почти закончил, но этот последний кусок убивает меня.Могу ли я вставить заголовок Content-Length в Chrome?

Я знаю, что Google не хочет, чтобы вы использовали Content-Length (как указано here), но я работаю с API, для которого требуется аутентификация, когда я отправляю POST. This extension говорит, что он может это сделать, но я чувствую, что то, что я написал, должно работать. Был ли это недавно заблокирован в новой версии Chrome?

Это заголовки Я посылаю:

{ 
    "ReplaceHeaders": true, 
    "rh-Authentication": "<my auth token>", 
    "rh-Timestamp": "<timestamp>", 
    "rh-Content-Length": body.length 
} 

Это раздел, который заменяет «RH» заголовки с новыми заголовками (все с «rh-», за «rh-» за исключением случаев, что даже имеет смысл):.

chrome.webRequest.onBeforeSendHeaders.addListener(function(data) { 
    newHeaders = false; 

    _.find(data.requestHeaders, function(header) { 
     if ((header.name === "ReplaceHeaders") && (header.value)) { 
      _.find(data.requestHeaders, function(h) { 
       if (h.name.substring(0, 3) === "rh-") { 
        if (newHeaders === false) { newHeaders = []; } 
        newHeaders.push({ 
         name: h.name.substring(3, h.name.length), 
         value: h.value 
        }); 
       } 
      }); 
      return; 
     } 
    }); 

    if (!!newHeaders) { 
     // Update headers 
     return {requestHeaders: newHeaders}; 
    } 
}, { urls: ["<all_urls>"] }, ["requestHeaders", "blocking"]); 

Когда я делаю запрос GET у меня нет «RH-ContentLength» заголовок и она отлично работает (я могу видеть onSendHeaders, onHeadersReceived и т.д.). Все заменяется, и ответ соответствует ожиданиям. Но когда я делаю запрос POST с «rh-Content-Length», я вижу только onSendHeaders и ничего после этого.

My onSendHeaders для GET и POST имеют недавно отформатированные заголовки.

ответ

1

Хорошо, поэтому я разместил это в 3:00 утра. Получив очень необходимый сон, я проснулся сегодня утром и поговорил с другом об этом. Он отметил, что ошибка была на самом деле в моем призыве ajax. Я исправил это, и теперь я могу отправить Content-Length из моего расширения. Вышеприведенный код действительно работает.

Несколько замечаний для кода я отправил выше для всех, кто ищет это позже:

  • Я использую underscore Переберите массивов
  • Это раздевает все другие заголовки и только добавляет заголовки запуска с "rh-". Вы можете или не захотите этого.
  • Вы должны иметь [ «requestHeaders», «блокирование»] в качестве последнего аргумента в onBeforeSendHeaders.addListener()
  • В ваших разрешений manifest.json убедитесь, что вы «WebRequest» и «webRequestBlocking»

Хотя это и не проверено, это должно работать на других заголовках, что Chrome говорит, что он не пройдет.Вот список заголовков Google говорит, что он не обеспечивает в onBeforeSendHeaders (как описано here):

  • Авторизация
  • Cache-Control
  • Подключение
  • Content-Length
  • Хост
  • If-Modified-Since
  • If-None-Match
  • If- Диапазон
  • Частичного-Data
  • Pragma
  • Proxy-Authorization
  • Proxy-Connection
  • Transfer-Encoding

Надеется, что это помогает.

+1

Удивительно, это действительно работает. Даже когда Google не предоставляет доступ для чтения к этим заголовкам, как указано в документации, ** доступ на запись по-прежнему разрешен **. Другими словами: \t \t 'e.requestHeaders.push ({'name': 'Content-Length', 'value': '123'});' работает вместе с другими, такими как 'e.requestHeaders.push ({ name ':' Host ',' value ':' asdfghhjjk '}); ' – Pacerier

Смежные вопросы