本文整理汇总了C++中CHttpRanges类的典型用法代码示例。如果您正苦于以下问题:C++ CHttpRanges类的具体用法?C++ CHttpRanges怎么用?C++ CHttpRanges使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了CHttpRanges类的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetRequestedRanges
bool CWebServer::GetRequestedRanges(struct MHD_Connection *connection, uint64_t totalLength, CHttpRanges &ranges)
{
ranges.Clear();
if (connection == NULL)
return false;
return ranges.Parse(GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_RANGE), totalLength);
}
示例2: GetRequestedRanges
bool HTTPRequestHandlerUtils::GetRequestedRanges(struct MHD_Connection *connection, uint64_t totalLength, CHttpRanges &ranges)
{
ranges.Clear();
if (connection == nullptr)
return false;
return ranges.Parse(GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_RANGE), totalLength);
}
示例3: TEST_F
TEST_F(TestWebServer, CanGetRangedFileRange0_2xEnd)
{
const std::string rangedFileContent = TEST_FILES_DATA_RANGES;
const std::string range = GenerateRangeHeaderValue(0, rangedFileContent.size() * 2);
CHttpRanges ranges;
ASSERT_TRUE(ranges.Parse(range, rangedFileContent.size()));
// get the whole file but specify a larger range
std::string result;
CCurlFile curl;
curl.SetRequestHeader(MHD_HTTP_HEADER_RANGE, range);
ASSERT_TRUE(curl.Get(GetUrlOfTestFile(TEST_FILES_RANGES), result));
CheckRangesTestFileResponse(curl, result, ranges);
}
示例4: IsRequestRanged
bool CWebServer::IsRequestRanged(const HTTPRequest& request, const CDateTime &lastModified) const
{
// parse the Range header and store it in the request object
CHttpRanges ranges;
bool ranged = ranges.Parse(HTTPRequestHandlerUtils::GetRequestHeaderValue(request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_RANGE));
// handle If-Range header but only if the Range header is present
if (ranged && lastModified.IsValid())
{
std::string ifRange = HTTPRequestHandlerUtils::GetRequestHeaderValue(request.connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_IF_RANGE);
if (!ifRange.empty() && lastModified.IsValid())
{
CDateTime ifRangeDate;
ifRangeDate.SetFromRFC1123DateTime(ifRange);
// check if the last modification is newer than the If-Range date
// if so we have to server the whole file instead
if (lastModified.GetAsUTCDateTime() > ifRangeDate)
ranges.Clear();
}
}
return !ranges.IsEmpty();
}
示例5: CheckRangesTestFileResponse
void CheckRangesTestFileResponse(const CCurlFile& curl, const std::string& result, const CHttpRanges& ranges)
{
// get the HTTP header details
const CHttpHeader& httpHeader = curl.GetHttpHeader();
// check the protocol line for the expected HTTP status
std::string httpStatusString = StringUtils::Format(" %d ", MHD_HTTP_PARTIAL_CONTENT);
std::string protocolLine = httpHeader.GetProtoLine();
ASSERT_TRUE(protocolLine.find(httpStatusString) != std::string::npos);
// Accept-Ranges must be "bytes"
EXPECT_STREQ("bytes", httpHeader.GetValue(MHD_HTTP_HEADER_ACCEPT_RANGES).c_str());
// check Last-Modified
CDateTime lastModified;
ASSERT_TRUE(GetLastModifiedOfTestFile(TEST_FILES_RANGES, lastModified));
ASSERT_STREQ(lastModified.GetAsRFC1123DateTime().c_str(), httpHeader.GetValue(MHD_HTTP_HEADER_LAST_MODIFIED).c_str());
// Cache-Control must contain "mag-age=0" and "no-cache"
std::string cacheControl = httpHeader.GetValue(MHD_HTTP_HEADER_CACHE_CONTROL);
EXPECT_TRUE(cacheControl.find("max-age=31536000") != std::string::npos);
EXPECT_TRUE(cacheControl.find("public") != std::string::npos);
// If there's no range Content-Length must be "20"
if (ranges.IsEmpty())
{
EXPECT_STREQ("20", httpHeader.GetValue(MHD_HTTP_HEADER_CONTENT_LENGTH).c_str());
EXPECT_STREQ(TEST_FILES_DATA_RANGES, result.c_str());
return;
}
// check Content-Range
uint64_t firstPosition, lastPosition;
ASSERT_TRUE(ranges.GetFirstPosition(firstPosition));
ASSERT_TRUE(ranges.GetLastPosition(lastPosition));
EXPECT_STREQ(HttpRangeUtils::GenerateContentRangeHeaderValue(firstPosition, lastPosition, 20).c_str(), httpHeader.GetValue(MHD_HTTP_HEADER_CONTENT_RANGE).c_str());
std::string expectedContent = TEST_FILES_DATA_RANGES;
const std::string expectedContentType = "text/plain";
if (ranges.Size() == 1)
{
// Content-Type must be "text/html"
EXPECT_STREQ(expectedContentType.c_str(), httpHeader.GetMimeType().c_str());
// check the content
CHttpRange firstRange;
ASSERT_TRUE(ranges.GetFirst(firstRange));
expectedContent = expectedContent.substr(firstRange.GetFirstPosition(), firstRange.GetLength());
EXPECT_STREQ(expectedContent.c_str(), result.c_str());
// and Content-Length
EXPECT_STREQ(StringUtils::Format("%u", static_cast<unsigned int>(expectedContent.size())).c_str(), httpHeader.GetValue(MHD_HTTP_HEADER_CONTENT_LENGTH).c_str());
return;
}
// Content-Type contains the multipart boundary
const std::string expectedMimeType = "multipart/byteranges";
std::string mimeType = httpHeader.GetMimeType();
ASSERT_STREQ(expectedMimeType.c_str(), mimeType.c_str());
std::string contentType = httpHeader.GetValue(MHD_HTTP_HEADER_CONTENT_TYPE);
std::string contentTypeStart = expectedMimeType + "; boundary=";
// it must start with "multipart/byteranges; boundary=" followed by the boundary
ASSERT_EQ(0, contentType.find(contentTypeStart));
ASSERT_GT(contentType.size(), contentTypeStart.size());
// extract the boundary
std::string multipartBoundary = contentType.substr(contentTypeStart.size());
ASSERT_FALSE(multipartBoundary.empty());
multipartBoundary = "--" + multipartBoundary;
ASSERT_EQ(0, result.find(multipartBoundary));
std::vector<std::string> rangeParts = StringUtils::Split(result, multipartBoundary);
// the first part is not really a part and is therefore empty (the place before the first boundary)
ASSERT_TRUE(rangeParts.front().empty());
rangeParts.erase(rangeParts.begin());
// the last part is the end of the end multipart boundary
ASSERT_STREQ("--", rangeParts.back().c_str());
rangeParts.erase(rangeParts.begin() + rangeParts.size() - 1);
ASSERT_EQ(ranges.Size(), rangeParts.size());
for (size_t i = 0; i < rangeParts.size(); ++i)
{
std::string data = rangeParts.at(i);
StringUtils::Trim(data, " \r\n");
// find the separator between header and data
size_t pos = data.find("\r\n\r\n");
ASSERT_NE(std::string::npos, pos);
std::string header = data.substr(0, pos + 4);
data = data.substr(pos + 4);
// get the expected range
CHttpRange range;
ASSERT_TRUE(ranges.Get(i, range));
// parse the header of the range part
CHttpHeader rangeHeader;
rangeHeader.Parse(header);
//.........这里部分代码省略.........
示例6: TEST
TEST(TestHttpRanges, ParseUnorderedBackToBack)
{
const uint64_t totalLength = 5;
const CHttpRange range0_0(0, 0);
const CHttpRange range1_1(1, 1);
const CHttpRange range0_1(0, 1);
const CHttpRange range2_2(2, 2);
const CHttpRange range0_2(0, 2);
const CHttpRange range1_2(1, 2);
const CHttpRange range3_3(3, 3);
const CHttpRange range0_3(0, 3);
const CHttpRange range4_4(4, 4);
const CHttpRange range0_4(0, 4);
const CHttpRange range3_4(3, 4);
CHttpRange range;
CHttpRanges ranges;
EXPECT_TRUE(ranges.Parse(RANGES_START "1-1,0-0", totalLength));
EXPECT_EQ(1U, ranges.Size());
EXPECT_TRUE(ranges.Get(0, range));
EXPECT_EQ(range0_1, range);
EXPECT_TRUE(ranges.Parse(RANGES_START "1-1,0-0,2-2", totalLength));
EXPECT_EQ(1U, ranges.Size());
EXPECT_TRUE(ranges.Get(0, range));
EXPECT_EQ(range0_2, range);
EXPECT_TRUE(ranges.Parse(RANGES_START "2-2,1-1,3-3,0-0", totalLength));
EXPECT_EQ(1U, ranges.Size());
EXPECT_TRUE(ranges.Get(0, range));
EXPECT_EQ(range0_3, range);
EXPECT_TRUE(ranges.Parse(RANGES_START "4-4,1-1,0-0,2-2,3-3", totalLength));
EXPECT_EQ(1U, ranges.Size());
EXPECT_TRUE(ranges.Get(0, range));
EXPECT_EQ(range0_4, range);
EXPECT_TRUE(ranges.Parse(RANGES_START "3-3,0-0,4-4,1-1", totalLength));
EXPECT_EQ(2U, ranges.Size());
EXPECT_TRUE(ranges.Get(0, range));
EXPECT_EQ(range0_1, range);
EXPECT_TRUE(ranges.Get(1, range));
EXPECT_EQ(range3_4, range);
EXPECT_TRUE(ranges.Parse(RANGES_START "4-4,1-1,2-2", totalLength));
EXPECT_EQ(2U, ranges.Size());
EXPECT_TRUE(ranges.Get(0, range));
EXPECT_EQ(range1_2, range);
EXPECT_TRUE(ranges.Get(1, range));
EXPECT_EQ(range4_4, range);
}
示例7: conHandler
int CWebServer::AnswerToConnection(void *cls, struct MHD_Connection *connection,
const char *url, const char *method,
const char *version, const char *upload_data,
unsigned int *upload_data_size, void **con_cls)
#endif
{
if (cls == NULL || con_cls == NULL || *con_cls == NULL)
{
CLog::Log(LOGERROR, "CWebServer: invalid request received");
return MHD_NO;
}
CWebServer *server = reinterpret_cast<CWebServer*>(cls);
std::auto_ptr<ConnectionHandler> conHandler(reinterpret_cast<ConnectionHandler*>(*con_cls));
HTTPMethod methodType = GetMethod(method);
HTTPRequest request = { server, connection, conHandler->fullUri, url, methodType, version };
// remember if the request was new
bool isNewRequest = conHandler->isNew;
// because now it isn't anymore
conHandler->isNew = false;
// reset con_cls and set it if still necessary
*con_cls = NULL;
#ifdef WEBSERVER_DEBUG
if (isNewRequest)
{
std::multimap<std::string, std::string> headerValues;
GetRequestHeaderValues(connection, MHD_HEADER_KIND, headerValues);
std::multimap<std::string, std::string> getValues;
GetRequestHeaderValues(connection, MHD_GET_ARGUMENT_KIND, getValues);
CLog::Log(LOGDEBUG, "webserver [IN] %s %s %s", version, method, request.pathUrlFull.c_str());
if (!getValues.empty())
{
std::string tmp;
for (std::multimap<std::string, std::string>::const_iterator get = getValues.begin(); get != getValues.end(); ++get)
{
if (get != getValues.begin())
tmp += "; ";
tmp += get->first + " = " + get->second;
}
CLog::Log(LOGDEBUG, "webserver [IN] Query arguments: %s", tmp.c_str());
}
for (std::multimap<std::string, std::string>::const_iterator header = headerValues.begin(); header != headerValues.end(); ++header)
CLog::Log(LOGDEBUG, "webserver [IN] %s: %s", header->first.c_str(), header->second.c_str());
}
#endif
if (!IsAuthenticated(server, connection))
return AskForAuthentication(connection);
// check if this is the first call to AnswerToConnection for this request
if (isNewRequest)
{
// parse the Range header and store it in the request object
CHttpRanges ranges;
bool ranged = ranges.Parse(GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_RANGE));
// look for a IHTTPRequestHandler which can take care of the current request
for (std::vector<IHTTPRequestHandler *>::const_iterator it = m_requestHandlers.begin(); it != m_requestHandlers.end(); ++it)
{
IHTTPRequestHandler *requestHandler = *it;
if (requestHandler->CanHandleRequest(request))
{
// we found a matching IHTTPRequestHandler so let's get a new instance for this request
IHTTPRequestHandler *handler = requestHandler->Create(request);
// if we got a GET request we need to check if it should be cached
if (methodType == GET)
{
if (handler->CanBeCached())
{
bool cacheable = true;
// handle Cache-Control
std::string cacheControl = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CACHE_CONTROL);
if (!cacheControl.empty())
{
std::vector<std::string> cacheControls = StringUtils::Split(cacheControl, ",");
for (std::vector<std::string>::const_iterator it = cacheControls.begin(); it != cacheControls.end(); ++it)
{
std::string control = *it;
control = StringUtils::Trim(control);
// handle no-cache
if (control.compare(HEADER_VALUE_NO_CACHE) == 0)
cacheable = false;
}
}
if (cacheable)
{
// handle Pragma (but only if "Cache-Control: no-cache" hasn't been set)
std::string pragma = GetRequestHeaderValue(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_PRAGMA);
if (pragma.compare(HEADER_VALUE_NO_CACHE) == 0)
cacheable = false;
}
//.........这里部分代码省略.........