void HttpMessage::addHeader(const char* name, int32_t szName, const char* value, int32_t szValue) { if (szName == 10 && !qstricmp(name, "connection", szName)) { if (qstristr(value, "upgrade")) { m_upgrade = true; m_keepAlive = true; } else m_keepAlive = !!qstristr(value, "keep-alive"); } else m_headers->add(name, szName, value, szValue); }
asyncInvoke(HttpFileHandler *pThis, HttpRequest_base *req, exlib::AsyncEvent *ac) : asyncState(ac), m_pThis(pThis), m_req(req), m_gzip(false) { req->get_response(m_rep); Variant hdr; if (m_req->firstHeader("Accept-Encoding", hdr) != CALL_RETURN_NULL) { std::string str = hdr.string(); if (qstristr(str.c_str(), "gzip")) m_gzip = true; } std::string value; m_req->get_value(value); Url::decodeURI(value.c_str(), (int) value.length(), value); if (value.length() > 0 && isPathSlash(value[value.length() - 1])) value.append("index.html", 10); path_base::normalize((m_pThis->m_root + value).c_str(), m_url); set(start); }
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_base::normalize(m_pThis->m_root + m_value, m_url); set(start); }
result_t XmlDocument::load(Buffer_base *source) { std::string strBuf; result_t hr; source->toString(strBuf); if (!m_isXml) { _parser p(strBuf); const char *ptr; while ((ptr = qstristr(p.now(), "<meta")) != NULL && qisspace(ptr[5])) { bool bContentType = false; std::string content; p.pos = (int32_t)(ptr - p.string + 5); while (true) { std::string key, value; p.skipSpace(); p.getWord(key, '=', '>'); if (key.empty()) break; if (p.want('=')) { if (p.want('\"')) { p.getString(value, '\"', '>'); p.want('\"'); } else p.getWord(value, '>'); } if (!qstricmp(key.c_str(), "charset")) { m_encoding = value; break; } else if (!qstricmp(key.c_str(), "content")) content = value; else if (!qstricmp(key.c_str(), "http-equiv") && !qstricmp(value.c_str(), "Content-Type")) bContentType = true; } if (bContentType && !content.empty()) { _parser p1(content); while (true) { std::string key, value; p1.skipSpace(); p1.getWord(key, ';', '='); if (key.empty()) break; if (p1.want('=')) p1.getWord(value, ';'); p1.want(';'); if (!qstricmp(key.c_str(), "charset")) { m_encoding = value; break; } } } if (!m_encoding.empty()) break; } if (!m_encoding.empty()) { encoding_iconv conv(m_encoding.c_str()); conv.decode(strBuf, strBuf); } } hr = load(strBuf.c_str()); if (hr < 0) return hr; return 0; }