std::pair<PExprNode, FilePath> FileCompiler::loadCode(ExprLocation loc, ConstStrA name) { FilePath p = loc.getFileName(); if (p.getPath().empty()) p = FilePath(ConstStrW(L"."), true); for (ConstStrA::SplitIterator iter = name.split('/'); iter.hasItems();) { ConstStrA part = iter.getNext(); if (part.empty()) { continue; } else if (part == "..") { p = p / parent; } else { p = p / part; } } const PExprNode *code = codeCache.find(p); PExprNode out; if (code) out = *code; else { out = compileFile(p); codeCache(p, out); } return std::make_pair(out, p); }
int LightSpeed::AppBase::main_entry( int argc, wchar_t *argv[], ConstStrW pathname) { AutoArray<ConstStrW> params; params.reserve(argc); for (int i = 0; i < argc; i++) params.add(ConstStrW(argv[i])); appPathname = pathname; return startApp(Args(params)); }
bool ServiceApp::processRequest(const void *request) { const char *p = reinterpret_cast<const char*>(request); natural count = *p++; ConstStrA command(p); p += command.length() + 1; AutoArray<String,StaticAlloc<256> > params; AutoArray<ConstStrW,StaticAlloc<256> > wparams; for(natural i = 0;i < count;i++){ ConstStrA param(p); p += param.length() + 1; params.add(String(param)); wparams.add(ConstStrW(params[i])); } AutoArray<byte> output; output.resize(instance->getReplyMaxSize()); SeqOutputBuffer fakeout(output.data() + sizeof (integer), output.length() - sizeof (integer)); fakeout.setStaticObj(); integer res = -1; bool stop = false; SeqFileOutput out(&fakeout); try { res = onMessage(command, wparams, out); stop = command == ConstStrA(stopCmd); } catch(std::exception & e){ TextOut<SeqFileOutput> msg(out); msg("%1") << e.what(); res = -1; } try { *reinterpret_cast<integer*>(output.data()) = res; instance->sendReply(output.data(), fakeout.length() + sizeof (integer)); } catch(...){ } return !stop; }
void WinHttpStream::initRequest() { TextParser<wchar_t> parser; if (!parser(L"%1://%[*-_.a-zA-Z0-9:@]2%%[/](*)*3",url)) throw FileOpenError(THISLOCATION,ERROR_FILE_NOT_FOUND,url); String protocol = parser[1].str(); String hostident = parser[2].str(); String::SplitIterator hostidentsplit = hostident.split('@'); String ident; String domain; domain = hostidentsplit.getNext(); while (hostidentsplit.hasItems()) { ident = ident + domain + ConstStrW('@'); domain = hostidentsplit.getNext(); } String path = parser[3].str(); natural port; String username; String password; bool secure; if (parser( L"%1:%u2",domain)) { domain = parser[1].str(); port = parser[2]; secure = false; } else if (protocol == ConstStrW(L"http")) { port = INTERNET_DEFAULT_HTTP_PORT; secure = false; } else if (protocol == ConstStrW(L"https")) { port = INTERNET_DEFAULT_HTTPS_PORT; secure = true; } else throw FileOpenError(THISLOCATION,ERROR_NOT_FOUND,url); if (!ident.empty()) { if (parser(L"%1:%2@",ident)) { username = parser[1].str(); password = parser[2].str(); } else { throw FileMsgException(THISLOCATION,0,url,"Invalid identification field in the url"); } } DWORD accessType; switch (settings.proxyMode) { case pmManual: accessType = INTERNET_OPEN_TYPE_PROXY; case pmDirect: accessType = INTERNET_OPEN_TYPE_DIRECT; case pmAuto: accessType = INTERNET_OPEN_TYPE_PRECONFIG; } TextFormatBuff<wchar_t> fmt; String proxyName; if (accessType == INTERNET_OPEN_TYPE_PROXY) { fmt(L"%1:%2") << settings.proxyAddr << settings.proxyPort; proxyName = fmt.write(); } if (hInternet) InternetCloseHandle(hInternet); hInternet = InternetOpenW(settings.userAgent.cStr(),accessType,proxyName.cStr(),0,0); if (hInternet == 0) throw FileMsgException(THISLOCATION,GetLastError(),url,"Cannot initialize WinInet"); if (hConnect) InternetCloseHandle(hConnect); hConnect = InternetConnectW(hInternet,domain.cStr(),(INTERNET_PORT)port, username.empty()?0:username.cStr(), password.empty()?0:password.cStr(), INTERNET_SERVICE_HTTP ,0,0); if (hConnect == 0) throw FileMsgException(THISLOCATION,GetLastError(),url,"Cannot connect remote site"); DWORD reqFlags = INTERNET_FLAG_NO_UI |INTERNET_FLAG_HYPERLINK ; if (redirDisabled) reqFlags|=INTERNET_FLAG_NO_AUTO_REDIRECT ; if (!settings.cookiesEnabled) reqFlags|=INTERNET_FLAG_NO_COOKIES; if (secure) reqFlags|=INTERNET_FLAG_SECURE; hHTTPConn = HttpOpenRequestW(hConnect,String(method).cStr(),path.cStr(), 0,0,0,reqFlags,0); if (hHTTPConn == 0) throw FileMsgException(THISLOCATION,GetLastError(),url,"Cannot connect remote site"); AutoArray<wchar_t> hdrall; for (HeaderMap::Iterator iter = hdrmap.getFwIter(); iter.hasItems();) { const HeaderMap::Entity &e = iter.getNext(); fmt(L"%1: %2\n") << e.key << e.value; hdrall.append(fmt.write()); } if (!hdrall.empty() && !HttpAddRequestHeadersW(hHTTPConn,hdrall.data(),(DWORD)hdrall.length(),HTTP_ADDREQ_FLAG_REPLACE|HTTP_ADDREQ_FLAG_ADD)) throw FileMsgException(THISLOCATION,GetLastError(),url,"AddRequest failed"); if (!HttpSendRequestW(hHTTPConn,0,0,postBuffer.data(),(DWORD)postBuffer.length())) { bool stillError = true; DWORD dwError = GetLastError(); if (dwError == ERROR_INTERNET_INVALID_CA && settings.allowUntrustedCert) { DWORD dwFlags; DWORD dwBuffLen = sizeof(dwFlags); InternetQueryOption (hHTTPConn, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen); dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA; InternetSetOption (hHTTPConn, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags) ); if (HttpSendRequestW(hHTTPConn,0,0,postBuffer.data(),(DWORD)postBuffer.length())) stillError = false; } if (stillError) throw FileMsgException(THISLOCATION,GetLastError(),url,"Failed to SendRequest"); } postBuffer.clear(); }
integer ServiceApp::startCommand(ConstStrA command, const Args & args, SeqFileOutput &serr) { if (command == ConstStrA(startCmd)) { integer x = validateService(args,serr); if (x) return x; createInstanceFile(); x = onMessage(command,args,serr); if (x) return x; x = initService(args,serr); if (x) return x; serr = nil; instance->enterDaemonMode(restartDelaySec); return startService(); } else if (command == ConstStrA(startForeCmd)) { integer x = validateService(args,serr); if (x) return x; createInstanceFile(); x = onMessage(command,args,serr); if (x) return x; x = initService(args,serr); if (x) return x; return startService(); } else if (command == ConstStrA(restartCmd)){ integer x = validateService(args,serr); if (x) return x; try { instance->open(); postMessage(stopCmd,Args(), serr); instance->waitForTerminate(timeout); } catch (ProgInstance::NotRunningException &) { } catch (ProgInstance::TimeoutException &) { instance->terminate(); instance->waitForTerminate(timeout); } createInstanceFile(); x = onMessage(command,args,serr); if (x) return x; x = initService(args,serr); if (x) return x; serr = nil; instance->enterDaemonMode(restartDelaySec); return startService(); } else if (command == ConstStrA(stopCmd)) { try { instance->open(); integer res = postMessage(command,args, serr); if (res == 0) instance->waitForTerminate(timeout); return res; } catch (ProgInstance::TimeoutException &) { instance->terminate(); return 0; } } else if (command == ConstStrA(waitCmd)) { natural timeout = naturalNull; if (!args.empty()) { TextParser<wchar_t> parser; if (parser(L" %u1 ",args[0])) timeout = parser[1]; } instance->open(); instance->waitForTerminate(timeout); } else if (command == ConstStrA(testCmd)) { integer x = validateService(args, serr); return x; } else if (command == ConstStrA(runTestsCmd)) { if (args.empty()) return Singleton<TestCollector>::getInstance().runTests(ConstStrA(), serr); else if (args[0] == ConstStrW(L"list")) { SeqTextOutA out(serr); TextOut<SeqTextOutA> print(out); print("%1\n")<<(Singleton<TestCollector>::getInstance().listTests()); return 0; } else return Singleton<TestCollector>::getInstance().runTests(args[1], serr); } else { instance->open(); return postMessage(command,args, serr); } return 0; }