// Copyright 2008 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials provided // with the distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include // To avoid warnings from on windows we disable exceptions. #define _HAS_EXCEPTIONS 0 #include #include #include using namespace std; using namespace v8; static Handle LogCallback ( const Arguments& args ) { if (args.Length() < 1) return v8::Undefined(); HandleScope scope; Handle arg = args[0]; String::Utf8Value value(arg); HttpRequestProcessor::Log(*value); return v8::Undefined(); } // Execute the script and fetch the Process method. bool JsHttpRequestProcessor::Initialize ( map* opts , map* output ) { // Create a handle scope to hold the temporary references. HandleScope handle_scope; // Create a template for the global object where we set the // built-in global functions. Handle global = ObjectTemplate::New(); global->Set(String::New("log"), FunctionTemplate::New(LogCallback)); // Each processor gets its own context so different processors // don't affect each other (ignore the first three lines). Handle context = Context::New(NULL, global); // Store the context in the processor object in a persistent handle, // since we want the reference to remain after we return from this // method. context_ = Persistent::New(context); // Enter the new context so all the following operations take place // within it. Context::Scope context_scope(context); // Make the options mapping available within the context if (!InstallMaps(opts, output)) return false; // Compile and run the script if (!ExecuteScript(script_)) return false; // The script compiled and ran correctly. Now we fetch out the // Process function from the global object. Handle process_name = String::New("Process"); Handle process_val = context->Global()->Get(process_name); // If there is no Process function, or if it is not a function, // bail out if (!process_val->IsFunction()) return false; // It is a function; cast it to a Function Handle process_fun = Handle::Cast(process_val); // Store the function in a Persistent handle, since we also want // that to remain after this call returns process_ = Persistent::New(process_fun); // All done; all went well return true; } bool JsHttpRequestProcessor::ExecuteScript ( Handle script ) { HandleScope handle_scope; // We're just about to compile the script; set up an error handler to // catch any exceptions the script might throw. TryCatch try_catch; // Compile the script and check for errors. Handle