asyncInvoke(HttpFileHandler* pThis, HttpRequest_base* req, bool autoIndex, AsyncEvent* ac) : AsyncState(ac) , m_pThis(pThis) , m_req(req) , m_autoIndex(autoIndex) , m_pre_gz(false) , m_index(false) , m_dirPos(0) { req->get_response(m_rep); Variant hdr; if (m_req->firstHeader("Accept-Encoding", hdr) != CALL_RETURN_NULL) { exlib::string str = hdr.string(); if (qstristr(str.c_str(), "gzip")) m_pre_gz = true; } m_req->get_value(m_value); Url::decodeURI(m_value, m_value); path_posix_base::normalize(m_value, m_value); if (!qstrcmp(m_value.c_str(), "../", 3) || qstrchr(m_value.c_str(), '\\')) { set(stop); } else { path_base::normalize(m_pThis->m_root + m_value, m_url); set(start); } }
static int start(asyncState *pState, int n) { asyncInvoke *pThis = (asyncInvoke *) pState; if (qstrchr(pThis->m_url.c_str(), '%')) { pThis->m_rep->set_status(400); return pThis->done(CALL_RETURN_NULL); } pThis->m_path = pThis->m_url; if (pThis->m_gzip) pThis->m_path.append(".gz", 3); Variant v; if (pThis->m_req->firstHeader("If-Modified-Since", v) != CALL_RETURN_NULL) { std::string str = v.string(); pThis->m_time.parse(str.c_str(), (int) str.length()); pThis->set(check); return fs_base::stat(pThis->m_path.c_str(), pThis->m_stat, pThis); } pThis->set(open); return fs_base::open(pThis->m_path.c_str(), "r", pThis->m_file, pThis); }
void Url::parseHost(const char*& url) { const char* p0 = url; while (true) { parseHost(url, m_hostname, m_port); m_ipv6 = qstrchr(m_hostname.c_str(), ':') != NULL; if (*url != ',') break; url++; } if (url > p0) { if (m_hostname.length() > 0) { if (m_ipv6) { m_host.append("["); m_host.append(m_hostname); m_host.append("]"); } else m_host.append(m_hostname); } if (m_port.length() > 0) { m_host.append(":"); m_host.append(m_port); } } }
result_t process_base::get_env(v8::Local<v8::Object>& retVal) { Isolate* isolate = Isolate::current(); v8::Local<v8::Object> glob = v8::Local<v8::Object>::New(isolate->m_isolate, isolate->m_global); v8::Local<v8::Value> ev = isolate->GetPrivate(glob, "_env"); if (ev->IsUndefined()) { v8::Local<v8::Object> o = v8::Object::New(isolate->m_isolate); char** env = environ; const char *p, *p1; while ((p = *env++) != NULL) { p1 = qstrchr(p, '='); if (p1) o->Set(isolate->NewFromUtf8(p, (int32_t)(p1 - p)), isolate->NewFromUtf8(p1 + 1)); } isolate->SetPrivate(glob, "_env", o); retVal = o; } else retVal = v8::Local<v8::Object>::Cast(ev); return 0; }
result_t Url::parse(exlib::string url, bool parseQueryString, bool slashesDenoteHost) { bool bHost; clear(); m_slashes = false; trimUrl(url, url); const char* c_str = url.c_str(); bool hasHash = qstrchr(c_str, '#') != NULL; if (!slashesDenoteHost && !hasHash && isUrlSlash(*c_str)) { parsePath(c_str); parseQuery(c_str); parseHash(c_str); if (parseQueryString) { m_queryParsed = new HttpCollection(); m_queryParsed->parse(m_query); } return 0; } parseProtocol(c_str); bHost = checkHost(c_str); if (slashesDenoteHost || m_protocol.length() > 0 || bHost) m_slashes = ((isUrlSlash(*c_str) && isUrlSlash(c_str[1])) && (m_protocol.length() <= 0 || m_protocol.compare("javascript:"))); if (m_protocol.compare("javascript:") && m_slashes) { c_str += 2; parseAuth(c_str); parseHost(c_str); } parsePath(c_str); parseQuery(c_str); parseHash(c_str); if (parseQueryString) { m_queryParsed = new HttpCollection(); m_queryParsed->parse(m_query); } return 0; }
static int32_t start(AsyncState* pState, int32_t n) { asyncInvoke* pThis = (asyncInvoke*)pState; if (qstrchr(pThis->m_url.c_str(), '%')) { pThis->m_rep->set_status(400); return pThis->done(CALL_RETURN_NULL); } pThis->m_path = pThis->m_url; if (pThis->m_gzip) pThis->m_path.append(".gz", 3); pThis->set(open); return fs_base::open(pThis->m_path, "r", pThis->m_file, pThis); }
static int command(asyncState *pState, int n) { asyncReadFrom *pThis = (asyncReadFrom *) pState; if (n == CALL_RETURN_NULL) return pThis->done(CALL_RETURN_NULL); _parser p(pThis->m_strLine); result_t hr; if (!p.getWord(pThis->m_pThis->m_method)) return CHECK_ERROR(Runtime::setError("HttpRequest: bad method.")); p.skipSpace(); std::string &addr = pThis->m_pThis->m_address; if (!p.getWord(addr, '?')) return CHECK_ERROR(Runtime::setError("HttpRequest: bad address.")); if (!qstricmp(addr.c_str(), "http://", 7)) { const char *p = qstrchr(addr.c_str() + 7, '/'); if (p) pThis->m_pThis->m_message.set_value(p); } else pThis->m_pThis->m_message.set_value(addr); if (p.want('?')) p.getWord(pThis->m_pThis->m_queryString); p.skipSpace(); if (p.end()) return CHECK_ERROR(Runtime::setError("HttpRequest: bad protocol version.")); hr = pThis->m_pThis->set_protocol(p.now()); if (hr < 0) return hr; pThis->done(); return pThis->m_pThis->m_message.readFrom(pThis->m_stm, pThis); }
static int32_t start(AsyncState* pState, int32_t n) { asyncInvoke* pThis = (asyncInvoke*)pState; if (qstrchr(pThis->m_url.c_str(), '%')) { pThis->m_rep->set_statusCode(400); return pThis->done(CALL_RETURN_NULL); } pThis->m_path = pThis->m_url; if (isPathSlash(pThis->m_path[pThis->m_path.length() - 1])) { pThis->m_path.append("index.html", 10); pThis->m_index = true; } if (pThis->m_pre_gz) pThis->m_path.append(".gz", 3); pThis->set(open); return fs_base::openFile(pThis->m_path, "r", pThis->m_file, pThis); }
result_t Url::set_hostname(exlib::string newVal) { m_hostname = newVal; m_ipv6 = qstrchr(m_hostname.c_str(), ':') != NULL; if (!m_hostname.empty() && m_host.empty()) { if (m_ipv6) m_host.append(1, '['); m_host.append(m_hostname); if (m_ipv6) m_host.append(1, ']'); if (m_port.length() > 0) { m_host.append(1, ':'); m_host.append(m_port); } } return 0; }
void out(const char *s, FILE *stream) { wstring ws = utf8to16String(s); wchar *ptr = &ws[0]; wchar *ptr2; while (ptr2 = (wchar *) qstrchr(ptr, L'\x1b')) { if (ptr2[1] == '[') { ptr2[0] = 0; fputws(ptr, stream); fflush(stream); ptr2 += 2; while (true) { if (ptr2[0] == 'm') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); ptr2 ++; break; } if (qisdigit(ptr2[0])) { if (ptr2[1] == 'm') { if (ptr2[0] == '0') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); } ptr2 += 2; break; } WORD mask, val; WORD light = m_wLight; if (ptr2[1] == ';') { if (ptr2[0] == '0') m_wLight = light = 0; else if (ptr2[0] == '1') m_wLight = light = FOREGROUND_INTENSITY; ptr2 += 2; } if (ptr2[0] == '3') { mask = 0xf0; ptr2 ++; } else if (ptr2[0] == '4') { mask = 0x0f; ptr2 ++; } else if (ptr2[0] == '9') { mask = 0xf0; light |= FOREGROUND_INTENSITY; ptr2 ++; } else if (ptr2[0] == '1' && ptr2[1] == '0') { mask = 0x0f; light |= FOREGROUND_INTENSITY << 4; ptr2 += 2; } else break; if (!qisdigit(ptr2[0])) break; val = ptr2[0] - '0'; if (val != 8) { if (val == 9) { val = (m_wAttr & 0x0f) | (m_Now & 0xf0); m_Now = val | light; SetConsoleTextAttribute(m_handle, m_Now); } else { val = (val & 2) | ((val & 1) ? 4 : 0) | ((val & 4) ? 1 : 0); if (mask == 0x0f) val <<= 4; m_Now = (m_Now & mask) | val | light; SetConsoleTextAttribute(m_handle, m_Now); } } ptr2 ++; if (ptr2[0] == 'm') { ptr2 ++; break; } } } } ptr = ptr2; } fputws(ptr, stream); fflush(stream); }
void out(exlib::string& s) { static HANDLE s_console; if (!m_tty) { fwrite(s.c_str(), 1, s.length(), stdout); return; } if (!m_handle) { if (!s_console) { AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); s_console = GetStdHandle(STD_OUTPUT_HANDLE); } m_handle = s_console; m_Now = m_wAttr = 0x7; m_wLight = m_wAttr & FOREGROUND_INTENSITY; } exlib::wstring ws = utf8to16String(s); exlib::wchar* ptr = &ws[0]; exlib::wchar* pend = ptr + ws.length(); exlib::wchar* ptr2; while (ptr2 = (exlib::wchar*)qstrchr(ptr, L'\x1b')) { if (ptr2[1] == '[') { WriteConsole(ptr, ptr2 - ptr); ptr2 += 2; while (true) { if (ptr2[0] == 'm') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); ptr2++; break; } if (qisdigit(ptr2[0])) { if (ptr2[1] == 'm') { if (ptr2[0] == '0') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); } ptr2 += 2; break; } WORD mask, val; WORD light = m_wLight; if (ptr2[1] == ';') { if (ptr2[0] == '0') m_wLight = light = 0; else if (ptr2[0] == '1') m_wLight = light = FOREGROUND_INTENSITY; ptr2 += 2; } if (ptr2[0] == '3') { mask = 0xf0; ptr2++; } else if (ptr2[0] == '4') { mask = 0x0f; ptr2++; } else if (ptr2[0] == '9') { mask = 0xf0; light |= FOREGROUND_INTENSITY; ptr2++; } else if (ptr2[0] == '1' && ptr2[1] == '0') { mask = 0x0f; light |= FOREGROUND_INTENSITY << 4; ptr2 += 2; } else break; if (!qisdigit(ptr2[0])) break; val = ptr2[0] - '0'; if (val != 8) { if (val == 9) { val = (m_wAttr & 0x0f) | (m_Now & 0xf0); m_Now = val | light; SetConsoleTextAttribute(m_handle, m_Now); } else { val = (val & 2) | ((val & 1) ? 4 : 0) | ((val & 4) ? 1 : 0); if (mask == 0x0f) val <<= 4; m_Now = (m_Now & mask) | val | light; SetConsoleTextAttribute(m_handle, m_Now); } } ptr2++; if (ptr2[0] == 'm') { ptr2++; break; } } } } ptr = ptr2; } WriteConsole(ptr, pend - ptr); }
result_t MongoDB::open(exlib::string connString) { assert(!Isolate::check()); obj_ptr<Url> u = new Url(); int32_t result; int32_t nPort; result_t hr = u->parse(connString); if (hr < 0) return hr; if (qstrchr(u->m_host.c_str(), ',')) { const char *host = u->m_host.c_str(); mongo_replset_init(&m_conn, ""); while (true) { exlib::string hostname; exlib::string port; Url::parseHost(host, hostname, port); nPort = 27017; if (!port.empty()) nPort = atoi(port.c_str()); mongo_replset_add_seed(&m_conn, hostname.c_str(), nPort); if (*host != ',') break; host++; } result = mongo_replset_connect(&m_conn); } else { nPort = 27017; if (!u->m_port.empty()) nPort = atoi(u->m_port.c_str()); mongo_init(&m_conn); result = mongo_client(&m_conn, u->m_hostname.c_str(), nPort); } if (result != MONGO_OK) return CHECK_ERROR(error()); if (!u->m_pathname.empty()) m_ns = u->m_pathname.substr(1); if (!u->m_username.empty()) if (mongo_cmd_authenticate(&m_conn, m_ns.c_str(), u->m_username.c_str(), u->m_password.c_str()) != MONGO_OK) return CHECK_ERROR(error()); return 0; }
void XmlParser::OnStartElement(const XML_Char* name, const XML_Char** atts) { const XML_Char** p = atts; std::map<exlib::string, exlib::string> nss; exlib::string def_ns; bool has_def = false; while (p[0] && p[1]) { const XML_Char* ns = p[0]; if (!qstrcmp(ns, "xmlns", 5)) { if (ns[5] == ':') nss.insert(std::pair<exlib::string, exlib::string>(ns + 6, p[1])); else if (!ns[5]) { def_ns = p[1]; has_def = true; } } p += 2; } obj_ptr<XmlElement> el; const char* str = qstrchr(name, ':'); if (str) { exlib::string prefix(name, str - name); exlib::string qname(str + 1); std::map<exlib::string, exlib::string>::iterator it; it = nss.find(prefix); if (it != nss.end()) def_ns = it->second; else m_now->lookupNamespaceURI(prefix, def_ns); } else if (!has_def) { int32_t type; m_now->get_nodeType(type); if (type == xml_base::_ELEMENT_NODE) ((XmlElement*)(XmlNode_base*)m_now)->get_defaultNamespace(def_ns); } if (!def_ns.empty()) el = new XmlElement(m_document, def_ns, name, m_isXml); else el = new XmlElement(m_document, name, m_isXml); newNode(el, true); while (atts[0] && atts[1]) { name = atts[0]; str = qstrchr(name, ':'); if (str && str[1]) { exlib::string ns(name, str - name); exlib::string qname(str + 1); std::map<exlib::string, exlib::string>::iterator it; it = nss.find(ns); if (it != nss.end()) def_ns = it->second; else m_now->lookupNamespaceURI(ns, def_ns); } else def_ns.clear(); if (!def_ns.empty()) el->setAttributeNS(def_ns, name, atts[1]); else el->setAttribute(name, atts[1]); atts += 2; } }
exlib::string GetException(TryCatch &try_catch, result_t hr) { if (try_catch.HasCaught()) { v8::String::Utf8Value exception(try_catch.Exception()); v8::Local<v8::Message> message = try_catch.Message(); if (message.IsEmpty()) return ToCString(exception); else { v8::Local<v8::Value> trace_value = try_catch.StackTrace(); if (!IsEmpty(trace_value)) { v8::String::Utf8Value stack_trace(trace_value); const char* s = ToCString(stack_trace); const char* s1 = qstrchr(s, '\n'); while (s1 && qstrcmp(s1 + 1, " at ", 7)) s1 = qstrchr(s1 + 1, '\n'); if (s1) return exlib::string(ToCString(exception)) + s1; } exlib::string strError; v8::String::Utf8Value filename(message->GetScriptResourceName()); if (qstrcmp(ToCString(exception), "SyntaxError: ", 13)) { strError.append(ToCString(exception)); strError.append("\n at "); } else { strError.append((ToCString(exception) + 13)); strError.append("\n at "); } strError.append(ToCString(filename)); int32_t lineNumber = message->GetLineNumber(); if (lineNumber > 0) { char numStr[32]; strError.append(1, ':'); sprintf(numStr, "%d", lineNumber); strError.append(numStr); strError.append(1, ':'); sprintf(numStr, "%d", message->GetStartColumn() + 1); strError.append(numStr); } return strError; } } else if (hr < 0) return getResultMessage(hr); return ""; }
void out(exlib::string& s) { exlib::wstring ws = utf8to16String(s); exlib::wchar *ptr = &ws[0]; exlib::wchar *pend = ptr + ws.length(); exlib::wchar *ptr2; DWORD dwWrite; while (ptr2 = (exlib::wchar *) qstrchr(ptr, L'\x1b')) { if (ptr2[1] == '[') { WriteConsoleW(m_handle, ptr, (DWORD)(ptr2 - ptr), &dwWrite, NULL); ptr2 += 2; while (true) { if (ptr2[0] == 'm') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); ptr2 ++; break; } if (qisdigit(ptr2[0])) { if (ptr2[1] == 'm') { if (ptr2[0] == '0') { m_Now = m_wAttr; m_wLight = m_wAttr & FOREGROUND_INTENSITY; SetConsoleTextAttribute(m_handle, m_Now); } ptr2 += 2; break; } WORD mask, val; WORD light = m_wLight; if (ptr2[1] == ';') { if (ptr2[0] == '0') m_wLight = light = 0; else if (ptr2[0] == '1') m_wLight = light = FOREGROUND_INTENSITY; ptr2 += 2; } if (ptr2[0] == '3') { mask = 0xf0; ptr2 ++; } else if (ptr2[0] == '4') { mask = 0x0f; ptr2 ++; } else if (ptr2[0] == '9') { mask = 0xf0; light |= FOREGROUND_INTENSITY; ptr2 ++; } else if (ptr2[0] == '1' && ptr2[1] == '0') { mask = 0x0f; light |= FOREGROUND_INTENSITY << 4; ptr2 += 2; } else break; if (!qisdigit(ptr2[0])) break; val = ptr2[0] - '0'; if (val != 8) { if (val == 9) { val = (m_wAttr & 0x0f) | (m_Now & 0xf0); m_Now = val | light; SetConsoleTextAttribute(m_handle, m_Now); } else { val = (val & 2) | ((val & 1) ? 4 : 0) | ((val & 4) ? 1 : 0); if (mask == 0x0f) val <<= 4; m_Now = (m_Now & mask) | val | light; SetConsoleTextAttribute(m_handle, m_Now); } } ptr2 ++; if (ptr2[0] == 'm') { ptr2 ++; break; } } } } ptr = ptr2; } WriteConsoleW(m_handle, ptr, (DWORD)(pend - ptr), &dwWrite, NULL); }