diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..80dae8ede0 --- /dev/null +++ b/Makefile @@ -0,0 +1,32 @@ +EVDIR=$(HOME)/local/libev +V8INC = $(HOME)/src/v8/include +V8LIB = $(HOME)/src/v8/libv8.a + +CFLAGS = -g -I$(V8INC) -Ideps/oi -DHAVE_GNUTLS=0 -Ideps/ebb +LDFLAGS = -lev #-lefence + +ifdef EVDIR + CFLAGS += -I$(EVDIR)/include + LDFLAGS += -L$(EVDIR)/lib +endif + +server: server.o deps/oi/oi_socket.o deps/ebb/ebb_request_parser.o + g++ $(CFLAGS) $(LDFLAGS) $(V8LIB) -o server $^ + +server.o: server.cc + g++ $(CFLAGS) -c $@ $< + +ebb_request_parser.o: ebb_request_parser.c deps/ebb/ebb_request_parser.h + gcc $(CFLAGS) -c $@ $< + +ebb_request_parser.c: deps/ebb/ebb_request_parser.rl + ragel -s -G2 $< -o $@ + +oi_socket.o: deps/oi/oi_socket.c deps/oi/oi_socket.h + gcc $(CFLAGS) -c $@ $< + +clean: + rm -f *.o + rm -f server + +.PHONY: clean test diff --git a/README b/README new file mode 100644 index 0000000000..b177f9457e --- /dev/null +++ b/README @@ -0,0 +1,4 @@ + +git submodule init +git submodule update +make diff --git a/js_http_request_processor.cc b/js_http_request_processor.cc new file mode 100644 index 0000000000..5c76f4b5c5 --- /dev/null +++ b/js_http_request_processor.cc @@ -0,0 +1,606 @@ +// 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