Преглед на файлове

added support for special headers of XHR: User-Agent

Signed-off-by: Gerald <[email protected]>
Gerald преди 11 години
родител
ревизия
feec4d7325
променени са 2 файла, в които са добавени 63 реда и са изтрити 5 реда
  1. 31 1
      background.js
  2. 32 4
      injected.js

+ 31 - 1
background.js

@@ -232,6 +232,7 @@ function setBadge(n,src,callback) {
 	chrome.browserAction.setBadgeText({text:o.num.toString(),tabId:src.tab.id});
 	if(o.timer) clearTimeout(o.timer);
 	o.timer=setTimeout(function(){delete badges[src.id];},300);
+	callback();
 }
 function getCacheB64(ids,src,callback) {
 	var o=db.transaction('cache').objectStore('cache'),data={};
@@ -602,6 +603,13 @@ function exportZip(z,src,callback){
 	var d={scripts:[],settings:settings},values=[];
 	getScripts();
 }
+var sxhr={};
+function registerXHR(id,src,callback){
+	sxhr[id]=1;
+	// XHR should be sent immediately after registration
+	setTimeout(function(){delete sxhr[id];},1000);
+	callback();
+}
 
 chrome.runtime.onConnect.addListener(function(p){
 	port=p;
@@ -646,6 +654,7 @@ initDb(function(){
 			GetScript: getScript,	// for user edit
 			GetMetas: getMetas,	// for popup menu
 			SetBadge: setBadge,
+			RegisterXHR: registerXHR,
 			AutoUpdate: autoUpdate,
 			Vacuum: vacuum,
 			Move: move,
@@ -671,5 +680,26 @@ chrome.webRequest.onBeforeRequest.addListener(function(o){
 		}
 	}
 },{
-	urls:['*://*/*','file://*/*'],types:['main_frame']
+	urls:['<all_urls>'],types:['main_frame']
 },['blocking']);
+// Modifications on headers
+var allowed_headers=['user-agent'];
+chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
+	var headers=details.requestHeaders,new_headers=[],vm_headers={},v,i;
+	headers.forEach(function(header){
+		if(header.name.substr(0,3)=='VM-')
+			vm_headers[header.name.substr(3)]=header.value;
+		else
+			new_headers.push(header);
+	});
+	v=vm_headers['Verify'];
+	if(v&&sxhr[v]) {
+		for(i in vm_headers)
+			if(allowed_headers.indexOf(i.toLowerCase())>=0)
+				new_headers.push({name:i,value:vm_headers[i]});
+		delete sxhr[v];
+	}
+	return {requestHeaders: new_headers};
+},{
+	urls:['<all_urls>'],types: ['xmlhttprequest'],
+},["blocking", "requestHeaders"]);

+ 32 - 4
injected.js

@@ -24,6 +24,19 @@ function utf8decode (utftext) {
 	}
 	return string;
 }
+function getUniqId() {
+	function int2str(i) {
+		var k='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_+',
+				s='',m;
+		while(i>0) {
+			m=i%64;
+			s+=k[m];
+			i=Math.floor(i/64);
+		}
+		return s;
+	}
+	return int2str(Date.now())+int2str(Math.floor(Math.random()*2147483647));
+}
 
 // Messages
 chrome.runtime.onMessage.addListener(function(req,src) {
@@ -429,7 +442,7 @@ function command(o){
 // Requests
 var requests={};
 function getRequestId() {
-  var id=Date.now()+Math.random().toString().slice(1);
+  var id=getUniqId();
   requests[id]=new XMLHttpRequest();
 	comm.post({cmd:'GotRequestId',data:id});
 }
@@ -468,18 +481,33 @@ function httpRequest(details) {
 		}
 		if(evt.type=='loadend') delete requests[details.id];
   }
-  var i,req=requests[details.id];
+  var i,il,v,sid=null,req=requests[details.id];
+	function addSpecialHeader(){
+		if(sid) return;
+		sid=getUniqId();
+		req.setRequestHeader('VM-Verify',sid);
+	}
   if(req) try {
 		// details.async=true;
     req.open(details.method,details.url,true,details.user,details.password);
     if(details.headers)
-			for(i in details.headers) req.setRequestHeader(i,details.headers[i]);
+			for(i in details.headers) {
+				il=i.toLowerCase();
+				v=details.headers[i];
+				if(il=='user-agent') {
+					addSpecialHeader();
+					req.setRequestHeader('VM-User-Agent',v);
+				} else req.setRequestHeader(i,v);
+			}
 		if(details.responseType) req.responseType='blob';
     if(details.overrideMimeType) req.overrideMimeType(details.overrideMimeType);
     ['abort','error','load','loadend','progress','readystatechange','timeout'].forEach(function(i) {
       req['on'+i]=callback;
     });
-    req.send(details.data);
+		if(sid)
+			chrome.runtime.sendMessage({cmd:'RegisterXHR',data:sid},function(){req.send(details.data);});
+		else
+			req.send(details.data);
   } catch(e) {
 		console.log(e);
   }