| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 | 154 |
| 155 // Execute the script and fetch the Process method. | 155 // Execute the script and fetch the Process method. |
| 156 bool JsHttpRequestProcessor::Initialize(map<string, string>* opts, | 156 bool JsHttpRequestProcessor::Initialize(map<string, string>* opts, |
| 157 map<string, string>* output) { | 157 map<string, string>* output) { |
| 158 // Create a handle scope to hold the temporary references. | 158 // Create a handle scope to hold the temporary references. |
| 159 HandleScope handle_scope(GetIsolate()); | 159 HandleScope handle_scope(GetIsolate()); |
| 160 | 160 |
| 161 // Create a template for the global object where we set the | 161 // Create a template for the global object where we set the |
| 162 // built-in global functions. | 162 // built-in global functions. |
| 163 Handle<ObjectTemplate> global = ObjectTemplate::New(); | 163 Handle<ObjectTemplate> global = ObjectTemplate::New(); |
| 164 global->Set(String::New("log"), FunctionTemplate::New(LogCallback)); | 164 global->Set(String::NewFromUtf8(GetIsolate(), "log"), |
| 165 FunctionTemplate::New(LogCallback)); |
| 165 | 166 |
| 166 // Each processor gets its own context so different processors don't | 167 // Each processor gets its own context so different processors don't |
| 167 // affect each other. Context::New returns a persistent handle which | 168 // affect each other. Context::New returns a persistent handle which |
| 168 // is what we need for the reference to remain after we return from | 169 // is what we need for the reference to remain after we return from |
| 169 // this method. That persistent handle has to be disposed in the | 170 // this method. That persistent handle has to be disposed in the |
| 170 // destructor. | 171 // destructor. |
| 171 v8::Handle<v8::Context> context = Context::New(GetIsolate(), NULL, global); | 172 v8::Handle<v8::Context> context = Context::New(GetIsolate(), NULL, global); |
| 172 context_.Reset(GetIsolate(), context); | 173 context_.Reset(GetIsolate(), context); |
| 173 | 174 |
| 174 // Enter the new context so all the following operations take place | 175 // Enter the new context so all the following operations take place |
| 175 // within it. | 176 // within it. |
| 176 Context::Scope context_scope(context); | 177 Context::Scope context_scope(context); |
| 177 | 178 |
| 178 // Make the options mapping available within the context | 179 // Make the options mapping available within the context |
| 179 if (!InstallMaps(opts, output)) | 180 if (!InstallMaps(opts, output)) |
| 180 return false; | 181 return false; |
| 181 | 182 |
| 182 // Compile and run the script | 183 // Compile and run the script |
| 183 if (!ExecuteScript(script_)) | 184 if (!ExecuteScript(script_)) |
| 184 return false; | 185 return false; |
| 185 | 186 |
| 186 // The script compiled and ran correctly. Now we fetch out the | 187 // The script compiled and ran correctly. Now we fetch out the |
| 187 // Process function from the global object. | 188 // Process function from the global object. |
| 188 Handle<String> process_name = String::New("Process"); | 189 Handle<String> process_name = String::NewFromUtf8(GetIsolate(), "Process"); |
| 189 Handle<Value> process_val = context->Global()->Get(process_name); | 190 Handle<Value> process_val = context->Global()->Get(process_name); |
| 190 | 191 |
| 191 // If there is no Process function, or if it is not a function, | 192 // If there is no Process function, or if it is not a function, |
| 192 // bail out | 193 // bail out |
| 193 if (!process_val->IsFunction()) return false; | 194 if (!process_val->IsFunction()) return false; |
| 194 | 195 |
| 195 // It is a function; cast it to a Function | 196 // It is a function; cast it to a Function |
| 196 Handle<Function> process_fun = Handle<Function>::Cast(process_val); | 197 Handle<Function> process_fun = Handle<Function>::Cast(process_val); |
| 197 | 198 |
| 198 // Store the function in a Persistent handle, since we also want | 199 // Store the function in a Persistent handle, since we also want |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 map<string, string>* output) { | 238 map<string, string>* output) { |
| 238 HandleScope handle_scope(GetIsolate()); | 239 HandleScope handle_scope(GetIsolate()); |
| 239 | 240 |
| 240 // Wrap the map object in a JavaScript wrapper | 241 // Wrap the map object in a JavaScript wrapper |
| 241 Handle<Object> opts_obj = WrapMap(opts); | 242 Handle<Object> opts_obj = WrapMap(opts); |
| 242 | 243 |
| 243 v8::Local<v8::Context> context = | 244 v8::Local<v8::Context> context = |
| 244 v8::Local<v8::Context>::New(GetIsolate(), context_); | 245 v8::Local<v8::Context>::New(GetIsolate(), context_); |
| 245 | 246 |
| 246 // Set the options object as a property on the global object. | 247 // Set the options object as a property on the global object. |
| 247 context->Global()->Set(String::New("options"), opts_obj); | 248 context->Global()->Set(String::NewFromUtf8(GetIsolate(), "options"), |
| 249 opts_obj); |
| 248 | 250 |
| 249 Handle<Object> output_obj = WrapMap(output); | 251 Handle<Object> output_obj = WrapMap(output); |
| 250 context->Global()->Set(String::New("output"), output_obj); | 252 context->Global()->Set(String::NewFromUtf8(GetIsolate(), "output"), |
| 253 output_obj); |
| 251 | 254 |
| 252 return true; | 255 return true; |
| 253 } | 256 } |
| 254 | 257 |
| 255 | 258 |
| 256 bool JsHttpRequestProcessor::Process(HttpRequest* request) { | 259 bool JsHttpRequestProcessor::Process(HttpRequest* request) { |
| 257 // Create a handle scope to keep the temporary object references. | 260 // Create a handle scope to keep the temporary object references. |
| 258 HandleScope handle_scope(GetIsolate()); | 261 HandleScope handle_scope(GetIsolate()); |
| 259 | 262 |
| 260 v8::Local<v8::Context> context = | 263 v8::Local<v8::Context> context = |
| (...skipping 23 matching lines...) Expand all Loading... |
| 284 } else { | 287 } else { |
| 285 return true; | 288 return true; |
| 286 } | 289 } |
| 287 } | 290 } |
| 288 | 291 |
| 289 | 292 |
| 290 JsHttpRequestProcessor::~JsHttpRequestProcessor() { | 293 JsHttpRequestProcessor::~JsHttpRequestProcessor() { |
| 291 // Dispose the persistent handles. When noone else has any | 294 // Dispose the persistent handles. When noone else has any |
| 292 // references to the objects stored in the handles they will be | 295 // references to the objects stored in the handles they will be |
| 293 // automatically reclaimed. | 296 // automatically reclaimed. |
| 294 context_.Dispose(); | 297 context_.Reset(); |
| 295 process_.Dispose(); | 298 process_.Reset(); |
| 296 } | 299 } |
| 297 | 300 |
| 298 | 301 |
| 299 Persistent<ObjectTemplate> JsHttpRequestProcessor::request_template_; | 302 Persistent<ObjectTemplate> JsHttpRequestProcessor::request_template_; |
| 300 Persistent<ObjectTemplate> JsHttpRequestProcessor::map_template_; | 303 Persistent<ObjectTemplate> JsHttpRequestProcessor::map_template_; |
| 301 | 304 |
| 302 | 305 |
| 303 // ----------------------------------- | 306 // ----------------------------------- |
| 304 // --- A c c e s s i n g M a p s --- | 307 // --- A c c e s s i n g M a p s --- |
| 305 // ----------------------------------- | 308 // ----------------------------------- |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 string key = ObjectToString(name); | 366 string key = ObjectToString(name); |
| 364 | 367 |
| 365 // Look up the value if it exists using the standard STL ideom. | 368 // Look up the value if it exists using the standard STL ideom. |
| 366 map<string, string>::iterator iter = obj->find(key); | 369 map<string, string>::iterator iter = obj->find(key); |
| 367 | 370 |
| 368 // If the key is not present return an empty handle as signal | 371 // If the key is not present return an empty handle as signal |
| 369 if (iter == obj->end()) return; | 372 if (iter == obj->end()) return; |
| 370 | 373 |
| 371 // Otherwise fetch the value and wrap it in a JavaScript string | 374 // Otherwise fetch the value and wrap it in a JavaScript string |
| 372 const string& value = (*iter).second; | 375 const string& value = (*iter).second; |
| 373 info.GetReturnValue().Set( | 376 info.GetReturnValue().Set(String::NewFromUtf8( |
| 374 String::New(value.c_str(), static_cast<int>(value.length()))); | 377 info.GetIsolate(), value.c_str(), String::kNormalString, |
| 378 static_cast<int>(value.length()))); |
| 375 } | 379 } |
| 376 | 380 |
| 377 | 381 |
| 378 void JsHttpRequestProcessor::MapSet(Local<String> name, | 382 void JsHttpRequestProcessor::MapSet(Local<String> name, |
| 379 Local<Value> value_obj, | 383 Local<Value> value_obj, |
| 380 const PropertyCallbackInfo<Value>& info) { | 384 const PropertyCallbackInfo<Value>& info) { |
| 381 // Fetch the map wrapped by this object. | 385 // Fetch the map wrapped by this object. |
| 382 map<string, string>* obj = UnwrapMap(info.Holder()); | 386 map<string, string>* obj = UnwrapMap(info.Holder()); |
| 383 | 387 |
| 384 // Convert the key and value to std::strings. | 388 // Convert the key and value to std::strings. |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 | 462 |
| 459 void JsHttpRequestProcessor::GetPath(Local<String> name, | 463 void JsHttpRequestProcessor::GetPath(Local<String> name, |
| 460 const PropertyCallbackInfo<Value>& info) { | 464 const PropertyCallbackInfo<Value>& info) { |
| 461 // Extract the C++ request object from the JavaScript wrapper. | 465 // Extract the C++ request object from the JavaScript wrapper. |
| 462 HttpRequest* request = UnwrapRequest(info.Holder()); | 466 HttpRequest* request = UnwrapRequest(info.Holder()); |
| 463 | 467 |
| 464 // Fetch the path. | 468 // Fetch the path. |
| 465 const string& path = request->Path(); | 469 const string& path = request->Path(); |
| 466 | 470 |
| 467 // Wrap the result in a JavaScript string and return it. | 471 // Wrap the result in a JavaScript string and return it. |
| 468 info.GetReturnValue().Set( | 472 info.GetReturnValue().Set(String::NewFromUtf8( |
| 469 String::New(path.c_str(), static_cast<int>(path.length()))); | 473 info.GetIsolate(), path.c_str(), String::kNormalString, |
| 474 static_cast<int>(path.length()))); |
| 470 } | 475 } |
| 471 | 476 |
| 472 | 477 |
| 473 void JsHttpRequestProcessor::GetReferrer( | 478 void JsHttpRequestProcessor::GetReferrer( |
| 474 Local<String> name, | 479 Local<String> name, |
| 475 const PropertyCallbackInfo<Value>& info) { | 480 const PropertyCallbackInfo<Value>& info) { |
| 476 HttpRequest* request = UnwrapRequest(info.Holder()); | 481 HttpRequest* request = UnwrapRequest(info.Holder()); |
| 477 const string& path = request->Referrer(); | 482 const string& path = request->Referrer(); |
| 478 info.GetReturnValue().Set( | 483 info.GetReturnValue().Set(String::NewFromUtf8( |
| 479 String::New(path.c_str(), static_cast<int>(path.length()))); | 484 info.GetIsolate(), path.c_str(), String::kNormalString, |
| 485 static_cast<int>(path.length()))); |
| 480 } | 486 } |
| 481 | 487 |
| 482 | 488 |
| 483 void JsHttpRequestProcessor::GetHost(Local<String> name, | 489 void JsHttpRequestProcessor::GetHost(Local<String> name, |
| 484 const PropertyCallbackInfo<Value>& info) { | 490 const PropertyCallbackInfo<Value>& info) { |
| 485 HttpRequest* request = UnwrapRequest(info.Holder()); | 491 HttpRequest* request = UnwrapRequest(info.Holder()); |
| 486 const string& path = request->Host(); | 492 const string& path = request->Host(); |
| 487 info.GetReturnValue().Set( | 493 info.GetReturnValue().Set(String::NewFromUtf8( |
| 488 String::New(path.c_str(), static_cast<int>(path.length()))); | 494 info.GetIsolate(), path.c_str(), String::kNormalString, |
| 495 static_cast<int>(path.length()))); |
| 489 } | 496 } |
| 490 | 497 |
| 491 | 498 |
| 492 void JsHttpRequestProcessor::GetUserAgent( | 499 void JsHttpRequestProcessor::GetUserAgent( |
| 493 Local<String> name, | 500 Local<String> name, |
| 494 const PropertyCallbackInfo<Value>& info) { | 501 const PropertyCallbackInfo<Value>& info) { |
| 495 HttpRequest* request = UnwrapRequest(info.Holder()); | 502 HttpRequest* request = UnwrapRequest(info.Holder()); |
| 496 const string& path = request->UserAgent(); | 503 const string& path = request->UserAgent(); |
| 497 info.GetReturnValue().Set( | 504 info.GetReturnValue().Set(String::NewFromUtf8( |
| 498 String::New(path.c_str(), static_cast<int>(path.length()))); | 505 info.GetIsolate(), path.c_str(), String::kNormalString, |
| 506 static_cast<int>(path.length()))); |
| 499 } | 507 } |
| 500 | 508 |
| 501 | 509 |
| 502 Handle<ObjectTemplate> JsHttpRequestProcessor::MakeRequestTemplate( | 510 Handle<ObjectTemplate> JsHttpRequestProcessor::MakeRequestTemplate( |
| 503 Isolate* isolate) { | 511 Isolate* isolate) { |
| 504 HandleScope handle_scope(isolate); | 512 HandleScope handle_scope(isolate); |
| 505 | 513 |
| 506 Handle<ObjectTemplate> result = ObjectTemplate::New(); | 514 Handle<ObjectTemplate> result = ObjectTemplate::New(); |
| 507 result->SetInternalFieldCount(1); | 515 result->SetInternalFieldCount(1); |
| 508 | 516 |
| 509 // Add accessors for each of the fields of the request. | 517 // Add accessors for each of the fields of the request. |
| 510 result->SetAccessor(String::NewSymbol("path"), GetPath); | 518 result->SetAccessor( |
| 511 result->SetAccessor(String::NewSymbol("referrer"), GetReferrer); | 519 String::NewFromUtf8(isolate, "path", String::kInternalizedString), |
| 512 result->SetAccessor(String::NewSymbol("host"), GetHost); | 520 GetPath); |
| 513 result->SetAccessor(String::NewSymbol("userAgent"), GetUserAgent); | 521 result->SetAccessor( |
| 522 String::NewFromUtf8(isolate, "referrer", String::kInternalizedString), |
| 523 GetReferrer); |
| 524 result->SetAccessor( |
| 525 String::NewFromUtf8(isolate, "host", String::kInternalizedString), |
| 526 GetHost); |
| 527 result->SetAccessor( |
| 528 String::NewFromUtf8(isolate, "userAgent", String::kInternalizedString), |
| 529 GetUserAgent); |
| 514 | 530 |
| 515 // Again, return the result through the current handle scope. | 531 // Again, return the result through the current handle scope. |
| 516 return handle_scope.Close(result); | 532 return handle_scope.Close(result); |
| 517 } | 533 } |
| 518 | 534 |
| 519 | 535 |
| 520 // --- Test --- | 536 // --- Test --- |
| 521 | 537 |
| 522 | 538 |
| 523 void HttpRequestProcessor::Log(const char* event) { | 539 void HttpRequestProcessor::Log(const char* event) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 } else { | 584 } else { |
| 569 string key = arg.substr(0, index); | 585 string key = arg.substr(0, index); |
| 570 string value = arg.substr(index+1); | 586 string value = arg.substr(index+1); |
| 571 options[key] = value; | 587 options[key] = value; |
| 572 } | 588 } |
| 573 } | 589 } |
| 574 } | 590 } |
| 575 | 591 |
| 576 | 592 |
| 577 // Reads a file into a v8 string. | 593 // Reads a file into a v8 string. |
| 578 Handle<String> ReadFile(const string& name) { | 594 Handle<String> ReadFile(Isolate* isolate, const string& name) { |
| 579 FILE* file = fopen(name.c_str(), "rb"); | 595 FILE* file = fopen(name.c_str(), "rb"); |
| 580 if (file == NULL) return Handle<String>(); | 596 if (file == NULL) return Handle<String>(); |
| 581 | 597 |
| 582 fseek(file, 0, SEEK_END); | 598 fseek(file, 0, SEEK_END); |
| 583 int size = ftell(file); | 599 int size = ftell(file); |
| 584 rewind(file); | 600 rewind(file); |
| 585 | 601 |
| 586 char* chars = new char[size + 1]; | 602 char* chars = new char[size + 1]; |
| 587 chars[size] = '\0'; | 603 chars[size] = '\0'; |
| 588 for (int i = 0; i < size;) { | 604 for (int i = 0; i < size;) { |
| 589 int read = static_cast<int>(fread(&chars[i], 1, size - i, file)); | 605 int read = static_cast<int>(fread(&chars[i], 1, size - i, file)); |
| 590 i += read; | 606 i += read; |
| 591 } | 607 } |
| 592 fclose(file); | 608 fclose(file); |
| 593 Handle<String> result = String::New(chars, size); | 609 Handle<String> result = |
| 610 String::NewFromUtf8(isolate, chars, String::kNormalString, size); |
| 594 delete[] chars; | 611 delete[] chars; |
| 595 return result; | 612 return result; |
| 596 } | 613 } |
| 597 | 614 |
| 598 | 615 |
| 599 const int kSampleSize = 6; | 616 const int kSampleSize = 6; |
| 600 StringHttpRequest kSampleRequests[kSampleSize] = { | 617 StringHttpRequest kSampleRequests[kSampleSize] = { |
| 601 StringHttpRequest("/process.cc", "localhost", "google.com", "firefox"), | 618 StringHttpRequest("/process.cc", "localhost", "google.com", "firefox"), |
| 602 StringHttpRequest("/", "localhost", "google.net", "firefox"), | 619 StringHttpRequest("/", "localhost", "google.net", "firefox"), |
| 603 StringHttpRequest("/", "localhost", "google.org", "safari"), | 620 StringHttpRequest("/", "localhost", "google.org", "safari"), |
| (...skipping 25 matching lines...) Expand all Loading... |
| 629 v8::V8::InitializeICU(); | 646 v8::V8::InitializeICU(); |
| 630 map<string, string> options; | 647 map<string, string> options; |
| 631 string file; | 648 string file; |
| 632 ParseOptions(argc, argv, options, &file); | 649 ParseOptions(argc, argv, options, &file); |
| 633 if (file.empty()) { | 650 if (file.empty()) { |
| 634 fprintf(stderr, "No script was specified.\n"); | 651 fprintf(stderr, "No script was specified.\n"); |
| 635 return 1; | 652 return 1; |
| 636 } | 653 } |
| 637 Isolate* isolate = Isolate::GetCurrent(); | 654 Isolate* isolate = Isolate::GetCurrent(); |
| 638 HandleScope scope(isolate); | 655 HandleScope scope(isolate); |
| 639 Handle<String> source = ReadFile(file); | 656 Handle<String> source = ReadFile(isolate, file); |
| 640 if (source.IsEmpty()) { | 657 if (source.IsEmpty()) { |
| 641 fprintf(stderr, "Error reading '%s'.\n", file.c_str()); | 658 fprintf(stderr, "Error reading '%s'.\n", file.c_str()); |
| 642 return 1; | 659 return 1; |
| 643 } | 660 } |
| 644 JsHttpRequestProcessor processor(isolate, source); | 661 JsHttpRequestProcessor processor(isolate, source); |
| 645 map<string, string> output; | 662 map<string, string> output; |
| 646 if (!processor.Initialize(&options, &output)) { | 663 if (!processor.Initialize(&options, &output)) { |
| 647 fprintf(stderr, "Error initializing processor.\n"); | 664 fprintf(stderr, "Error initializing processor.\n"); |
| 648 return 1; | 665 return 1; |
| 649 } | 666 } |
| 650 if (!ProcessEntries(&processor, kSampleSize, kSampleRequests)) | 667 if (!ProcessEntries(&processor, kSampleSize, kSampleRequests)) |
| 651 return 1; | 668 return 1; |
| 652 PrintMap(&output); | 669 PrintMap(&output); |
| 653 } | 670 } |
| OLD | NEW |