本文整理汇总了C++中HttpHeaders类的典型用法代码示例。如果您正苦于以下问题:C++ HttpHeaders类的具体用法?C++ HttpHeaders怎么用?C++ HttpHeaders使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了HttpHeaders类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: respond
void respond(int code, const QByteArray &reason, const HttpHeaders &headers, const QByteArray &body)
{
if(state != WriteBody)
return;
HttpHeaders outHeaders = headers;
outHeaders.removeAll("Connection");
outHeaders.removeAll("Transfer-Encoding");
outHeaders.removeAll("Content-Length");
outHeaders += HttpHeader("Connection", "close");
outHeaders += HttpHeader("Content-Length", QByteArray::number(body.size()));
QByteArray respData = "HTTP/";
if(version1dot0)
respData += "1.0 ";
else
respData += "1.1 ";
respData += QByteArray::number(code) + " " + reason + "\r\n";
foreach(const HttpHeader &h, outHeaders)
respData += h.first + ": " + h.second + "\r\n";
respData += "\r\n";
respData += body;
state = WaitForWritten;
pendingWritten += respData.size();
sock->write(respData);
}
示例2: checkNewVersion
void checkNewVersion(const Uuid& uuid, const std::string& extraParams, CheckUpdateDelegate* delegate)
{
using namespace base;
using namespace net;
std::string url = UPDATE_URL;
if (!uuid.empty()) {
url += "&uuid=";
url += uuid;
}
if (!extraParams.empty()) {
url += "&";
url += extraParams;
}
HttpRequest request(url);
HttpHeaders headers;
headers.setHeader("User-Agent", getUserAgent());
request.setHeaders(headers);
std::stringstream body;
HttpResponse response(&body);
request.send(response);
CheckUpdateResponse data(body.str());
delegate->onResponse(data);
}
示例3: set_headers
YETI_Result HttpEntity::set_headers(const HttpHeaders & headers)
{
HttpHeader * header;
header = headers.get_header(YETI_HTTP_HEADER_CONTENT_LENGTH);
if (header != NULL) {
m_content_length_is_known_ = true;
YETI_LargeSize length;
if (YETI_SUCCEEDED(header->get_value().to_integer64(length))) {
m_content_length_ = length;
} else {
m_content_length_ = 0;
}
}
header = headers.get_header(YETI_HTTP_HEADER_CONTENT_TYPE);
if (header != NULL) {
m_content_type_ = header->get_value();
}
header = headers.get_header(YETI_HTTP_HEADER_CONTENT_ENCODING);
if (header != NULL) {
m_content_encoding_ = header->get_value();
}
header = headers.get_header(YETI_HTTP_HEADER_TRANSFER_ENCODING);
if (header != NULL) {
m_transfer_encoding_ = header->get_value();
}
return YETI_SUCCESS;
}
示例4: checkNewVersion
void checkNewVersion(const Uuid& uuid, const std::string& extraParams, CheckUpdateDelegate* delegate)
{
using namespace base;
using namespace net;
#ifndef UPDATE_URL
#define UPDATE_URL ""
#endif
#pragma message("warning: Define UPDATE_URL macro")
std::string url = UPDATE_URL;
if (!uuid.empty()) {
url += "&uuid=";
url += uuid;
}
if (!extraParams.empty()) {
url += "&";
url += extraParams;
}
HttpRequest request(url);
HttpHeaders headers;
headers.setHeader("User-Agent", getUserAgent());
request.setHeaders(headers);
std::stringstream body;
HttpResponse response(&body);
request.send(response);
TRACE("Checking updates: %s (User-Agent: %s)\n", url.c_str(), getUserAgent().c_str());
TRACE("Response:\n--\n%s--\n", body.str().c_str());
CheckUpdateResponse data(body.str());
delegate->onResponse(data);
}
示例5: Apply
bool HttpContentNegociation::Apply(const HttpHeaders& headers)
{
HttpHeaders::const_iterator accept = headers.find("accept");
if (accept != headers.end())
{
return Apply(accept->second);
}
else
{
return Apply("*/*");
}
}
示例6: applyHeaders
void applyHeaders(const HttpHeaders &in, HttpHeaders *out)
{
*out += HttpHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
QByteArray origin;
if(in.contains("Origin"))
origin = in.get("Origin");
else
origin = "*";
*out += HttpHeader("Access-Control-Allow-Origin", origin);
*out += HttpHeader("Access-Control-Allow-Credentials", "true");
}
示例7: TIMED_FUNC
Response* FakeConnection::getDocument(const std::string& uri) {
TIMED_FUNC(FakeConnection_getDocument);
LOG(DEBUG) << " Entering FakeConnection::getDocument";
LOG(DEBUG) << " Fetching document with URI: " << uri;
std::map<std::string,IDocumentContent*>::iterator it;
it = mImpl->documents.find(uri);
std::string ct("");
std::string mime("");
if (mImpl->documents.end() != it) {
LOG(DEBUG) << " Found document with URI: " << uri;
IDocumentContent* docPtr = it->second;
ct = docPtr->getContent();
mime = docPtr->getMimeType();
}
//IDocumentContent& value = mImpl->documents[uri.c_str()];
//LOG(DEBUG) << " pointer value: " << value;
Response* response = new Response;
LOG(DEBUG) << " Setting response code";
LOG(DEBUG) << " Setting response content ptr";
//std::unique_ptr<std::string> content(new std::string(ct));
//response->setContent(std::move(content));
response->setContent(new std::string(ct));
LOG(DEBUG) << " Setting response headers";
if (0 == ct.compare("")) {
// not found
response->setResponseCode(ResponseCode::NOT_FOUND);
response->setResponseType(ResponseType::UNKNOWN_TYPE);
} else {
// found
HttpHeaders headers;
headers.setHeader("Content-type",mime);
response->setResponseHeaders(headers);
response->setResponseCode(ResponseCode::OK);
if (0 == mime.compare("application/json")) {
response->setResponseType(ResponseType::JSON);
} else if (0 == mime.compare("application/xml") ) {
response->setResponseType(ResponseType::XML);
} else if (0 == mime.compare("text/plain")) {
response->setResponseType(ResponseType::TEXT);
} else {
response->setResponseType(ResponseType::BINARY);
}
}
LOG(DEBUG) << " returning response ";
return response;
}
示例8: logFromClient
void Logger::logFromClient(std::string &name, HttpHeaders &headers) {
std::string message = "Got POST (";
message.append(name);
message.append(") :\n");
message.append(headers.getPostData());
log4cpp::Category::getInstance("sslsniff").info(message);
}
示例9: setHeaders
void setHeaders(const HttpHeaders& headers)
{
if (m_headerlist) {
curl_slist_free_all(m_headerlist);
m_headerlist = NULL;
}
std::string tmp;
for (HttpHeaders::const_iterator it=headers.begin(), end=headers.end(); it!=end; ++it) {
tmp = it->first;
tmp += ": ";
tmp += it->second;
m_headerlist = curl_slist_append(m_headerlist, tmp.c_str());
}
curl_easy_setopt(m_curl, CURLOPT_HTTPHEADER, m_headerlist);
}
示例10: headers_callback
/*
* This function serves as a callback for response headers read by libcurl
*
* The libcurl documentation at
* http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTHEADERFUNCTION
* says that the callback is called once for each header and only complete
* header line are passed. So we do not need to handle multi-line headers
* ourselves.
*
* Please see: http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
* The first response header returned will always be "Status-line",
* Also see: http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
*/
static size_t headers_callback(void *buffer, size_t size, size_t nmemb, void *userp) {
char *buf = reinterpret_cast<char*>(buffer);
HttpHeaders *pHeaders = reinterpret_cast<HttpHeaders*>(userp);
size_t result = 0u;
if (pHeaders != NULL) {
/*
* Note: std::string is capable of storing binary stream data and can
* store "\0" as normal character (witout terminating string).
*
* - Until C++11, it is not guaranteed to be contiguously stored though.
* - Use caution when using .c_str(), if string contains "\0", use .data() instead
*
* Since binary data can be stored in std::string, unicode characters
* can be present But beware of using .length() or .size(), since they
* will return number of bytes storage (i.e., char) needed to store the
* string, and not actual number of characters.
*/
std::string s = "";
s.append(buf, size * nmemb);
result = size * nmemb;
// There can be 3 different cases, each should be handled differently:
// Case 1: Check for last header line: CRLF,
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
if (s.size() == 2u && s[0] == '\r' && s[1] == '\n')
return result;
// Case 2: If it is the first header, the it must be a status Line.
// For all other cases, statusLine must be populated with some non-zero length string
if (pHeaders->getStatusLine().length() == 0u) {
pHeaders->setStatusLine(HttpHelperUtils::stripWhitespaces(s));
return result;
}
// Case 3: This is a usual message header, of form
// message-header = field-name ":" [ field-value ]
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
pHeaders->appendHeaderString(s);
}
return result;
}
示例11: buildRequestFromHeaders
void HTTPSBridge::buildRequestFromHeaders(HttpHeaders &headers, std::string &request) {
std::ostringstream requestStream;
requestStream << headers.getMethod() << " "
<< headers.getRequest() << " "
<< "HTTP/1.0\r\n";
std::map<std::string,std::string>::iterator iter;
std::map<std::string,std::string>& headersMap = headers.getHeaders();
for( iter = headersMap.begin(); iter != headersMap.end(); ++iter ) {
std::string key = iter->first;
std::string value = iter->second;
Util::trimString(key);
Util::trimString(value);
if (key != "Accept-Encoding" && key != "Connection" && key != "Keep-Alive")
requestStream << key << ": " << value << "\r\n";
}
requestStream << "Connection: Close" << "\r\n\r\n";
if (headers.isPost()) requestStream << headers.getPostData();
request = requestStream.str();
}
示例12: start
//.........这里部分代码省略.........
else
outStream = false;
// some required fields
if(request.method.isEmpty() || request.uri.isEmpty())
{
log_warning("missing request method or missing uri");
QMetaObject::invokeMethod(this, "respondError", Qt::QueuedConnection, Q_ARG(QByteArray, "bad-request"));
return;
}
log_info("IN id=%s, %s %s", request.id.data(), qPrintable(request.method), request.uri.toEncoded().data());
// inbound streaming must start with sequence number of 0
if(mode == Worker::Stream && request.more && request.seq != 0)
{
log_warning("streamed input must start with seq 0");
QMetaObject::invokeMethod(this, "respondError", Qt::QueuedConnection, Q_ARG(QByteArray, "bad-request"));
return;
}
// fire and forget
if(mode == Worker::Stream && receiver.isEmpty())
quiet = true;
// can't use these two together
if(mode == Worker::Single && request.more)
{
log_warning("cannot use streamed input on router interface");
QMetaObject::invokeMethod(this, "respondError", Qt::QueuedConnection, Q_ARG(QByteArray, "bad-request"));
return;
}
bodySent = false;
inSeq = request.seq;
if(!isAllowed(request.uri.host()) || (!request.connectHost.isEmpty() && !isAllowed(request.connectHost)))
{
QMetaObject::invokeMethod(this, "respondError", Qt::QueuedConnection, Q_ARG(QByteArray, "policy-violation"));
return;
}
hreq = new HttpRequest(dns, this);
connect(hreq, SIGNAL(nextAddress(const QHostAddress &)), SLOT(req_nextAddress(const QHostAddress &)));
connect(hreq, SIGNAL(readyRead()), SLOT(req_readyRead()));
connect(hreq, SIGNAL(bytesWritten(int)), SLOT(req_bytesWritten(int)));
connect(hreq, SIGNAL(error()), SLOT(req_error()));
maxResponseSize = request.maxSize;
if(!request.connectHost.isEmpty())
hreq->setConnectHost(request.connectHost);
hreq->setIgnoreTlsErrors(request.ignoreTlsErrors);
if(request.credits != -1)
outCredits += request.credits;
HttpHeaders headers = request.headers;
// ensure content-length (or overwrite it, if not streaming input)
if((request.method == "POST" || request.method == "PUT") && (!headers.contains("content-length") || !request.more))
headers += HttpHeader("Content-Length", QByteArray::number(request.body.size()));
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), SLOT(timer_timeout()));
timer->setSingleShot(true);
timer->start(config->sessionTimeout * 1000);
hreq->start(request.method, request.uri, headers);
// note: unlike follow-up requests, the initial request is assumed to have a body.
// if no body field is present, we act as if it is present but empty.
if(!request.body.isEmpty())
{
if(request.more && !request.headers.contains("content-length"))
{
log_warning("streamed input requires content-length");
QMetaObject::invokeMethod(this, "respondError", Qt::QueuedConnection, Q_ARG(QByteArray, "length-required"));
return;
}
hreq->writeBody(request.body);
}
if(!request.more)
{
bodySent = true;
hreq->endBody();
}
else
{
// send cts
ZurlResponsePacket resp;
resp.credits = config->sessionBufferSize;
writeResponse(resp);
}
}
示例13: strtol
int CGnutellaSocket::ParseHandshake()
{
const char* p = m_strHandshake.c_str();
const char* pend = p+m_strHandshake.length();
if (!strncmp(p, "GNUTELLA/0.6", 12))
{
p += 12;
p++;
long code = strtol(p, (char**)&p, 10);
p++;
StringA codemsg;
while (p < pend)
{
if (p[0] == '\r' && p[1] == '\n')
{
break;
}
codemsg += *p;
p++;
}
if (*p++ != '\r') ASSERT(0);
if (*p++ != '\n') ASSERT(0);
// HttpHeaders headers;
m_headers.AddHeaders(p);
/*
while (p < pend)
{
std::string header;
while (p < pend)
{
if (p[0] == '\r' && p[1] == '\n')
{
break;
}
header += *p;
p++;
}
if (*p++ != '\r') ASSERT(0);
if (*p++ != '\n') ASSERT(0);
m_headers.push_back(header);
}
ASSERT(*p == 0);
*/
return code;
}
else
{
ASSERT(0);
return 0;
}
}
示例14: tryApplyJsonp
// return true if jsonp applied
bool tryApplyJsonp(const DomainMap::JsonpConfig &config, bool *ok, QString *errorMessage)
{
*ok = true;
// must be a GET
if(requestData.method != "GET")
return false;
QString callbackParam = QString::fromUtf8(config.callbackParam);
if(callbackParam.isEmpty())
callbackParam = "callback";
QString bodyParam;
if(!config.bodyParam.isEmpty())
bodyParam = QString::fromUtf8(config.bodyParam);
QUrl uri = requestData.uri;
QUrlQuery query(uri);
// two ways to activate JSON-P:
// 1) callback param present
// 2) default callback specified in configuration and body param present
if(!query.hasQueryItem(callbackParam) &&
(config.defaultCallback.isEmpty() || bodyParam.isEmpty() || !query.hasQueryItem(bodyParam)))
{
return false;
}
QByteArray callback;
if(query.hasQueryItem(callbackParam))
{
callback = parsePercentEncoding(query.queryItemValue(callbackParam, QUrl::FullyEncoded).toUtf8());
if(callback.isEmpty())
{
log_debug("requestsession: id=%s invalid callback parameter, rejecting", rid.second.data());
*ok = false;
*errorMessage = "Invalid callback parameter.";
return false;
}
query.removeAllQueryItems(callbackParam);
}
else
callback = config.defaultCallback;
QString method;
if(query.hasQueryItem("_method"))
{
method = QString::fromLatin1(parsePercentEncoding(query.queryItemValue("_method", QUrl::FullyEncoded).toUtf8()));
if(!validMethod(method))
{
log_debug("requestsession: id=%s invalid _method parameter, rejecting", rid.second.data());
*ok = false;
*errorMessage = "Invalid _method parameter.";
return false;
}
query.removeAllQueryItems("_method");
}
HttpHeaders headers;
if(query.hasQueryItem("_headers"))
{
QJsonParseError e;
QJsonDocument doc = QJsonDocument::fromJson(parsePercentEncoding(query.queryItemValue("_headers", QUrl::FullyEncoded).toUtf8()), &e);
if(e.error != QJsonParseError::NoError || !doc.isObject())
{
log_debug("requestsession: id=%s invalid _headers parameter, rejecting", rid.second.data());
*ok = false;
*errorMessage = "Invalid _headers parameter.";
return false;
}
QVariantMap headersMap = doc.object().toVariantMap();
QMapIterator<QString, QVariant> vit(headersMap);
while(vit.hasNext())
{
vit.next();
if(vit.value().type() != QVariant::String)
{
log_debug("requestsession: id=%s invalid _headers parameter, rejecting", rid.second.data());
*ok = false;
*errorMessage = "Invalid _headers parameter.";
return false;
}
QByteArray key = vit.key().toUtf8();
// ignore some headers that we explicitly set later on
if(qstricmp(key.data(), "host") == 0)
continue;
if(qstricmp(key.data(), "accept") == 0)
continue;
headers += HttpHeader(key, vit.value().toString().toUtf8());
}
//.........这里部分代码省略.........
示例15: start
void start(const QVariant &vrequest, Mode mode)
{
outSeq = 0;
outCredits = 0;
quiet = false;
ZhttpRequestPacket request;
if(!request.fromVariant(vrequest))
{
log_warning("failed to parse zurl request");
QVariantHash vhash = vrequest.toHash();
rid = vhash.value("id").toByteArray();
toAddress = vhash.value("from").toByteArray();
QByteArray type = vhash.value("type").toByteArray();
if(!toAddress.isEmpty() && type != "error" && type != "cancel")
{
QMetaObject::invokeMethod(this, "respondError", Qt::QueuedConnection, Q_ARG(QByteArray, "bad-request"));
}
else
{
cleanup();
QMetaObject::invokeMethod(q, "finished", Qt::QueuedConnection);
}
return;
}
rid = request.id;
toAddress = request.from;
userData = request.userData;
sentHeader = false;
stuffToRead = false;
bytesReceived = 0;
ignorePolicies = request.ignorePolicies;
if(request.uri.isEmpty())
{
log_warning("missing request uri");
QMetaObject::invokeMethod(this, "respondError", Qt::QueuedConnection, Q_ARG(QByteArray, "bad-request"));
return;
}
QString scheme = request.uri.scheme();
if(scheme == "https" || scheme == "http")
{
transport = HttpTransport;
}
else if(scheme == "wss" || scheme == "ws")
{
transport = WebSocketTransport;
}
else
{
log_warning("unsupported scheme");
QMetaObject::invokeMethod(this, "respondError", Qt::QueuedConnection, Q_ARG(QByteArray, "bad-request"));
return;
}
if(transport == WebSocketTransport && mode != Worker::Stream)
{
log_warning("websocket must be used from stream interface");
QMetaObject::invokeMethod(this, "respondError", Qt::QueuedConnection, Q_ARG(QByteArray, "bad-request"));
return;
}
int defaultPort;
if(scheme == "https" || scheme == "wss")
defaultPort = 443;
else // http || wss
defaultPort = 80;
HttpHeaders headers = request.headers;
if(transport == HttpTransport)
{
// fire and forget
if(mode == Worker::Stream && (rid.isEmpty() || toAddress.isEmpty()))
quiet = true;
// streaming only allowed on streaming interface
if(mode == Worker::Stream)
outStream = request.stream;
else
outStream = false;
if(request.method.isEmpty())
{
log_warning("missing request method");
QMetaObject::invokeMethod(this, "respondError", Qt::QueuedConnection, Q_ARG(QByteArray, "bad-request"));
return;
}
log_info("IN id=%s, %s %s", request.id.data(), qPrintable(request.method), request.uri.toEncoded().data());
//.........这里部分代码省略.........