/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 
 *
 * @author didierfred@gmail.com
 * @version 0.1
 */


"use strict";

var targetPage = "https://httpbin.org/*";
var modifyTable = [];
var started = "off";

// If no table stored , use and store a default one
if (!localStorage.getItem('modifyTable')) 
	{
	modifyTable = [
		["add","test_header_name","test_header_value","on"],
		];
	localStorage.setItem("modifyTable",JSON.stringify(modifyTable));
	}
else 
	{
	modifyTable=JSON.parse(localStorage.getItem("modifyTable"));
	}

// If no target page stored , use a default one 
if (!localStorage.getItem('targetPage')) localStorage.setItem('targetPage',targetPage);
else targetPage = localStorage.getItem('targetPage');

// If no started value stored , use a default one 
if (!localStorage.getItem('started')) localStorage.setItem('started',started);
else started = localStorage.getItem('started');

if (started=="on") 
		{
		addListener();
		browser.browserAction.setIcon({ path: "icons/modify-green-32.png"});
		}


// listen for change in configuration or start/stop 
browser.runtime.onMessage.addListener(notify);


/*
* Rewrite the header (add , modify or delete)
*
*/
function rewriteHeader(e) 
{

  for (var to_modify of modifyTable)
	{
		if (to_modify[3]=="on")
			{
			if (to_modify[0]=="add")  
				{
					var new_header = {"name" :to_modify[1],"value":to_modify[2]};
					e.requestHeaders.push(new_header);
				}
			else if (to_modify[0]=="modify")
				{
				for (var header of e.requestHeaders) 
					{
					if (header.name.toLowerCase() == to_modify[1].toLowerCase()) header.value = to_modify[2];
					}
				}
			else if (to_modify[0]=="delete")
				{
				var index = -1;
			
				for (var i=0; i < e.requestHeaders.length; i++)
					{
				 	if (e.requestHeaders[i].name.toLowerCase() == to_modify[1].toLowerCase())  index=i;
					}
				if (index!=-1) 
					{
					e.requestHeaders.splice(index,1);	
					}
				}
			}
	}
	
  return {requestHeaders: e.requestHeaders};
}



/*
* Listen for message form config.js
* if message is reload : reload the configuration 
* if message is on : start the modify header 
* if message is off : stop the modify header
*
**/
function notify(message) 
	{
	if (message=="reload") 
		{
		modifyTable=JSON.parse(localStorage.getItem("modifyTable"));
		targetPage = localStorage.getItem('targetPage');
		if (started=="on")
			{		
			browser.webRequest.onBeforeSendHeaders.removeListener(rewriteHeader);
			addListener();
			}
		}

	else if (message=="off")
		{
		browser.webRequest.onBeforeSendHeaders.removeListener(rewriteHeader);
		browser.browserAction.setIcon({ path: "icons/modify-32.png"});
		started="off";
		}

	else if (message=="on")
		{
		addListener();
		browser.browserAction.setIcon({ path: "icons/modify-green-32.png"});
		started="on";
		}
  	}

/*
* Add rewriteHeader as a listener to onBeforeSendHeaders, only for the target page.
* Make it "blocking" so we can modify the headers.
*/
function addListener()
	{
	browser.webRequest.onBeforeSendHeaders.addListener(rewriteHeader,
                                          {urls: [targetPage]},
                                          ["blocking", "requestHeaders"]);
	}