2012-06-11 3 views
4

Chrome 확장 프로그램의 특정 AJAX 요청에 'Referer'-HTTP-Header를 추가하려고합니다. 나는 webRequest api 사용하여 변경하려고, 그래서 당신은 AJAX 요청에서 직접 변경할 수 없습니다 :Chrome 확장 프로그램 : webRequest.onBeforeSendHeaders가 이상하게 동작합니다.

chrome.webRequest.onBeforeSendHeaders.addListener(function(data) { 
    console.log("onBeforeSendHeaders fired"); 
    var xdata=data.requestHeaders; 
    xdata.push({ 
     "name":"Referer", 
     "value": "http://the.new/referrer" 
    }) 
    return {requestHeaders: xdata}; 
}, { //Filter 
    urls: ["<all_urls>"], //For testing purposes 
    types: ["xmlhttprequest"] 
},["requestHeaders","blocking"]); 

을하지만 내 확장에 AJAX 요청을 작동하지 않습니다. 그것은 다른 AJAX 요청에 대해서만 이벤트를 발생 시키지만 내 확장에서 수행 된 이벤트는 발생시키지 않습니다.
또 다른 이상한 점은 "blocking"플래그가 설정되어 있지 않아도 모든 것이 잘 작동하지만 헤더를 변경할 수 없다는 것입니다. 그것은 작동하지 않습니다

답변

1

블로킹 요청이 없을 때 리퍼러 헤더를 설정할 수없는 이유는 요청이 이미 비워 졌기 때문일 수 있습니다. 비동기 적으로 알림을 받고 요청에 대해 아무 것도 변경할 수 없다는 것입니다. .

내가이 코드를 사용, 헤더를 변경하려면 (. 리퍼러 헤더가 이미 설정되어있는 경우 또는 설정되어 있지 않은 경우)

다음
function mod_headers(header_array,p_name,p_value) { 
    var did_set = false;                      
    for(var i in header_array) {                         
     var header = header_array[i];                        
     var name = header.name;                          
     var value = header.value;                         

     // If the header is already present, change it: 
     if(name == p_name) { 
      header.value = p_value; 
      did_set = true; 
     }                           
    } 
    // if it is not, add it: 
    if(!did_set) { header_array.push({ name : p_name , value : p_value }); }                              
} 
+1

의미 : if (name == p_name) {? – DaveWalley

+0

@DaveWalley 네. 이제 답이 바뀌 었습니다. 감사! – Daniel

2

이 모든 경우에 작동하는 작업 버전의를

var requestFilter = { 
    urls: ["<all_urls>"] 
}, 

extraInfoSpec = ['requestHeaders', 'blocking'], 
handler = function(details) { 

var isRefererSet = false; 
var headers = details.requestHeaders, 
    blockingResponse = {}; 

for (var i = 0, l = headers.length; i < l; ++i) { 
    if (headers[i].name == 'Referer') { 
     headers[i].value = "http://your-url.com/"; 
     isRefererSet = true; 
     break; 
    } 
} 

if (!isRefererSet) { 
    headers.push({ 
     name: "Referer", 
     value: "http://your-url.com/" 
    }); 
} 

blockingResponse.requestHeaders = headers; 
return blockingResponse; 
}; 

chrome.webRequest.onBeforeSendHeaders.addListener(handler, requestFilter, extraInfoSpec); 

는 매니페스트에 다음의 모든 권한을 추가하는 것을 잊지 마세요 :

"permissions": [ "webRequest", "webRequestBlocking", "<all_urls>" ] 
+0

전체 확장 기능을 공유 할 수 있습니까? – Toolkit

-1
chrome.webRequest.onBeforeSendHeaders.addListener(function(details) { 
    console.log(details); 
},{urls: ["<all_urls>"]}); 
관련 문제