| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 
| 3  * Copyright (C) 2006-2017 eyeo GmbH | 3  * Copyright (C) 2006-2017 eyeo GmbH | 
| 4  * | 4  * | 
| 5  * Adblock Plus is free software: you can redistribute it and/or modify | 5  * Adblock Plus is free software: you can redistribute it and/or modify | 
| 6  * it under the terms of the GNU General Public License version 3 as | 6  * it under the terms of the GNU General Public License version 3 as | 
| 7  * published by the Free Software Foundation. | 7  * published by the Free Software Foundation. | 
| 8  * | 8  * | 
| 9  * Adblock Plus is distributed in the hope that it will be useful, | 9  * Adblock Plus is distributed in the hope that it will be useful, | 
| 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 22 #include "JsContext.h" | 22 #include "JsContext.h" | 
| 23 #include "Thread.h" | 23 #include "Thread.h" | 
| 24 #include "Utils.h" | 24 #include "Utils.h" | 
| 25 #include "WebRequestJsObject.h" | 25 #include "WebRequestJsObject.h" | 
| 26 | 26 | 
| 27 namespace | 27 namespace | 
| 28 { | 28 { | 
| 29   class WebRequestThread : public AdblockPlus::Thread | 29   class WebRequestThread : public AdblockPlus::Thread | 
| 30   { | 30   { | 
| 31   public: | 31   public: | 
| 32     WebRequestThread(const AdblockPlus::JsEnginePtr& jsEngine, const AdblockPlus
     ::JsConstValueList& arguments) | 32     WebRequestThread(const AdblockPlus::JsEnginePtr& jsEngine, const AdblockPlus
     ::JsValueList& arguments) | 
| 33         : Thread(true), jsEngine(jsEngine), url(arguments[0]->AsString()) | 33       : Thread(true), jsEngine(jsEngine), url(arguments[0].AsString()), | 
|  | 34         callback(arguments[2]) | 
| 34     { | 35     { | 
| 35       if (!url.length()) | 36       if (!url.length()) | 
| 36         throw std::runtime_error("Invalid string passed as first argument to GET
     "); | 37         throw std::runtime_error("Invalid string passed as first argument to GET
     "); | 
| 37 | 38 | 
| 38       { | 39       { | 
| 39         AdblockPlus::JsConstValuePtr headersObj = arguments[1]; | 40         const AdblockPlus::JsValue& headersObj = arguments[1]; | 
| 40         if (!headersObj->IsObject()) | 41         if (!headersObj.IsObject()) | 
| 41           throw std::runtime_error("Second argument to GET must be an object"); | 42           throw std::runtime_error("Second argument to GET must be an object"); | 
| 42 | 43 | 
| 43         std::vector<std::string> properties = headersObj->GetOwnPropertyNames(); | 44         std::vector<std::string> properties = headersObj.GetOwnPropertyNames(); | 
| 44         for (const auto& header : properties) | 45         for (const auto& header : properties) | 
| 45         { | 46         { | 
| 46           std::string headerValue = headersObj->GetProperty(header).AsString(); | 47           std::string headerValue = headersObj.GetProperty(header).AsString(); | 
| 47           if (header.length() && headerValue.length()) | 48           if (header.length() && headerValue.length()) | 
| 48             headers.push_back(std::pair<std::string, std::string>(header, header
     Value)); | 49             headers.push_back(std::pair<std::string, std::string>(header, header
     Value)); | 
| 49         } | 50         } | 
| 50       } | 51       } | 
| 51 | 52 | 
| 52       callback = arguments[2]; | 53       if (!callback.IsFunction()) | 
| 53       if (!callback->IsFunction()) |  | 
| 54         throw std::runtime_error("Third argument to GET must be a function"); | 54         throw std::runtime_error("Third argument to GET must be a function"); | 
| 55     } | 55     } | 
| 56 | 56 | 
| 57     AdblockPlus::ServerResponse NotAllowedResponse() | 57     AdblockPlus::ServerResponse NotAllowedResponse() | 
| 58     { | 58     { | 
| 59       AdblockPlus::ServerResponse result; | 59       AdblockPlus::ServerResponse result; | 
| 60       result.status = AdblockPlus::WebRequest::NS_ERROR_CONNECTION_REFUSED; | 60       result.status = AdblockPlus::WebRequest::NS_ERROR_CONNECTION_REFUSED; | 
| 61       result.responseStatus = 0; | 61       result.responseStatus = 0; | 
| 62       return result; | 62       return result; | 
| 63     } | 63     } | 
| 64 | 64 | 
| 65     void Run() | 65     void Run() | 
| 66     { | 66     { | 
| 67       AdblockPlus::ServerResponse result = jsEngine->IsConnectionAllowed() ? | 67       AdblockPlus::ServerResponse result = jsEngine->IsConnectionAllowed() ? | 
| 68         jsEngine->GetWebRequest()->GET(url, headers) : NotAllowedResponse(); | 68         jsEngine->GetWebRequest()->GET(url, headers) : NotAllowedResponse(); | 
| 69 | 69 | 
| 70       AdblockPlus::JsContext context(jsEngine); | 70       AdblockPlus::JsContext context(jsEngine); | 
| 71 | 71 | 
| 72       AdblockPlus::JsValuePtr resultObject = jsEngine->NewObject(); | 72       auto resultObject = jsEngine->NewObject(); | 
| 73       resultObject->SetProperty("status", result.status); | 73       resultObject.SetProperty("status", result.status); | 
| 74       resultObject->SetProperty("responseStatus", result.responseStatus); | 74       resultObject.SetProperty("responseStatus", result.responseStatus); | 
| 75       resultObject->SetProperty("responseText", result.responseText); | 75       resultObject.SetProperty("responseText", result.responseText); | 
| 76 | 76 | 
| 77       AdblockPlus::JsValuePtr headersObject = jsEngine->NewObject(); | 77       auto headersObject = jsEngine->NewObject(); | 
| 78       for (const auto& header : result.responseHeaders) | 78       for (const auto& header : result.responseHeaders) | 
| 79       { | 79       { | 
| 80         headersObject->SetProperty(header.first, header.second); | 80         headersObject.SetProperty(header.first, header.second); | 
| 81       } | 81       } | 
| 82       resultObject->SetProperty("responseHeaders", *headersObject); | 82       resultObject.SetProperty("responseHeaders", headersObject); | 
| 83 | 83 | 
| 84       AdblockPlus::JsConstValueList params; | 84       AdblockPlus::JsValueList params; | 
| 85       params.push_back(resultObject); | 85       params.push_back(resultObject); | 
| 86       callback->Call(params); | 86       callback.Call(params); | 
| 87     } | 87     } | 
| 88 | 88 | 
| 89   private: | 89   private: | 
| 90     AdblockPlus::JsEnginePtr jsEngine; | 90     AdblockPlus::JsEnginePtr jsEngine; | 
| 91     std::string url; | 91     std::string url; | 
| 92     AdblockPlus::HeaderList headers; | 92     AdblockPlus::HeaderList headers; | 
| 93     AdblockPlus::JsConstValuePtr callback; | 93     AdblockPlus::JsValue callback; | 
| 94   }; | 94   }; | 
| 95 | 95 | 
| 96   v8::Handle<v8::Value> GETCallback(const v8::Arguments& arguments) | 96   v8::Handle<v8::Value> GETCallback(const v8::Arguments& arguments) | 
| 97   { | 97   { | 
| 98     WebRequestThread* thread; | 98     WebRequestThread* thread; | 
| 99     try | 99     try | 
| 100     { | 100     { | 
| 101       AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(a
     rguments); | 101       AdblockPlus::JsEnginePtr jsEngine = AdblockPlus::JsEngine::FromArguments(a
     rguments); | 
| 102       AdblockPlus::JsConstValueList converted = jsEngine->ConvertArguments(argum
     ents); | 102       AdblockPlus::JsValueList converted = jsEngine->ConvertArguments(arguments)
     ; | 
| 103       if (converted.size() != 3u) | 103       if (converted.size() != 3u) | 
| 104         throw std::runtime_error("GET requires exactly 3 arguments"); | 104         throw std::runtime_error("GET requires exactly 3 arguments"); | 
| 105       thread = new WebRequestThread(jsEngine, converted); | 105       thread = new WebRequestThread(jsEngine, converted); | 
| 106     } | 106     } | 
| 107     catch (const std::exception& e) | 107     catch (const std::exception& e) | 
| 108     { | 108     { | 
| 109       using AdblockPlus::Utils::ToV8String; | 109       using AdblockPlus::Utils::ToV8String; | 
| 110       v8::Isolate* isolate = arguments.GetIsolate(); | 110       v8::Isolate* isolate = arguments.GetIsolate(); | 
| 111       return v8::ThrowException(ToV8String(isolate, e.what())); | 111       return v8::ThrowException(ToV8String(isolate, e.what())); | 
| 112     } | 112     } | 
| 113     thread->Start(); | 113     thread->Start(); | 
| 114     return v8::Undefined(); | 114     return v8::Undefined(); | 
| 115   } | 115   } | 
| 116 } | 116 } | 
| 117 | 117 | 
| 118 AdblockPlus::JsValue& AdblockPlus::WebRequestJsObject::Setup( | 118 AdblockPlus::JsValue& AdblockPlus::WebRequestJsObject::Setup( | 
| 119     AdblockPlus::JsEngine& jsEngine, AdblockPlus::JsValue& obj) | 119     AdblockPlus::JsEngine& jsEngine, AdblockPlus::JsValue& obj) | 
| 120 { | 120 { | 
| 121   obj.SetProperty("GET", jsEngine.NewCallback(::GETCallback)); | 121   obj.SetProperty("GET", jsEngine.NewCallback(::GETCallback)); | 
| 122   return obj; | 122   return obj; | 
| 123 } | 123 } | 
| OLD | NEW | 
|---|