| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 | #include "HttpResponse.h"#include <iostream>#include <cppunit/extensions/HelperMacros.h>#include "TestUtil.h"#include "prefs.h"#include "PiecedSegment.h"#include "Piece.h"#include "Request.h"#include "HttpHeader.h"#include "HttpRequest.h"#include "Exception.h"#include "A2STR.h"#include "DlRetryEx.h"#include "CookieStorage.h"#include "AuthConfigFactory.h"#include "AuthConfig.h"#include "StreamFilter.h"#include "MetalinkHttpEntry.h"#include "Option.h"#include "Checksum.h"namespace aria2 {class HttpResponseTest : public CppUnit::TestFixture {  CPPUNIT_TEST_SUITE(HttpResponseTest);  CPPUNIT_TEST(testGetContentLength_null);  CPPUNIT_TEST(testGetContentLength_contentLength);  // CPPUNIT_TEST(testGetContentLength_range);  CPPUNIT_TEST(testGetEntityLength);  CPPUNIT_TEST(testGetContentType);  CPPUNIT_TEST(testDetermineFilename_without_ContentDisposition);  CPPUNIT_TEST(testDetermineFilename_with_ContentDisposition_zero_length);  CPPUNIT_TEST(testDetermineFilename_with_ContentDisposition);  CPPUNIT_TEST(testGetRedirectURI_without_Location);  CPPUNIT_TEST(testGetRedirectURI_with_Location);  CPPUNIT_TEST(testIsRedirect);  CPPUNIT_TEST(testIsTransferEncodingSpecified);  CPPUNIT_TEST(testGetTransferEncoding);  CPPUNIT_TEST(testGetTransferEncodingStreamFilter);  CPPUNIT_TEST(testIsContentEncodingSpecified);  CPPUNIT_TEST(testGetContentEncoding);  CPPUNIT_TEST(testGetContentEncodingStreamFilter);  CPPUNIT_TEST(testValidateResponse);  CPPUNIT_TEST(testValidateResponse_good_range);  CPPUNIT_TEST(testValidateResponse_bad_range);  CPPUNIT_TEST(testValidateResponse_chunked);  CPPUNIT_TEST(testValidateResponse_withIfModifiedSince);  CPPUNIT_TEST(testProcessRedirect);  CPPUNIT_TEST(testRetrieveCookie);  CPPUNIT_TEST(testSupportsPersistentConnection);  CPPUNIT_TEST(testGetMetalinKHttpEntries);  CPPUNIT_TEST(testGetDigest);  CPPUNIT_TEST_SUITE_END();private:public:  void setUp() {}  void testGetContentLength_null();  void testGetContentLength_contentLength();  void testGetEntityLength();  void testGetContentType();  void testDetermineFilename_without_ContentDisposition();  void testDetermineFilename_with_ContentDisposition_zero_length();  void testDetermineFilename_with_ContentDisposition();  void testGetRedirectURI_without_Location();  void testGetRedirectURI_with_Location();  void testIsRedirect();  void testIsTransferEncodingSpecified();  void testGetTransferEncoding();  void testGetTransferEncodingStreamFilter();  void testIsContentEncodingSpecified();  void testGetContentEncoding();  void testGetContentEncodingStreamFilter();  void testValidateResponse();  void testValidateResponse_good_range();  void testValidateResponse_bad_range();  void testValidateResponse_chunked();  void testValidateResponse_withIfModifiedSince();  void testProcessRedirect();  void testRetrieveCookie();  void testSupportsPersistentConnection();  void testGetMetalinKHttpEntries();  void testGetDigest();};CPPUNIT_TEST_SUITE_REGISTRATION(HttpResponseTest);void HttpResponseTest::testGetContentLength_null(){  HttpResponse httpResponse;  CPPUNIT_ASSERT_EQUAL((int64_t)0LL, httpResponse.getContentLength());}void HttpResponseTest::testGetContentLength_contentLength(){  HttpResponse httpResponse;  auto httpHeader = make_unique<HttpHeader>();  httpHeader->put(HttpHeader::CONTENT_LENGTH, "4294967296");  httpResponse.setHttpHeader(std::move(httpHeader));  CPPUNIT_ASSERT_EQUAL((int64_t)4294967296LL, httpResponse.getContentLength());}void HttpResponseTest::testGetEntityLength(){  HttpResponse httpResponse;  auto httpHeader = make_unique<HttpHeader>();  httpHeader->put(HttpHeader::CONTENT_LENGTH, "4294967296");  httpResponse.setHttpHeader(std::move(httpHeader));  CPPUNIT_ASSERT_EQUAL((int64_t)4294967296LL, httpResponse.getEntityLength());  httpResponse.getHttpHeader()->put(HttpHeader::CONTENT_RANGE,                                    "bytes 1-4294967296/4294967297");  CPPUNIT_ASSERT_EQUAL((int64_t)4294967297LL, httpResponse.getEntityLength());}void HttpResponseTest::testGetContentType(){  HttpResponse httpResponse;  auto httpHeader = make_unique<HttpHeader>();  httpHeader->put(HttpHeader::CONTENT_TYPE,                  "application/metalink+xml; charset=UTF-8");  httpResponse.setHttpHeader(std::move(httpHeader));  // See parameter is ignored.  CPPUNIT_ASSERT_EQUAL(std::string("application/metalink+xml"),                       httpResponse.getContentType());}void HttpResponseTest::testDetermineFilename_without_ContentDisposition(){  HttpResponse httpResponse;  auto httpRequest = make_unique<HttpRequest>();  auto request = std::make_shared<Request>();  request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");  httpRequest->setRequest(request);  httpResponse.setHttpHeader(make_unique<HttpHeader>());  httpResponse.setHttpRequest(std::move(httpRequest));  CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"),                       httpResponse.determineFilename(false));}void HttpResponseTest::    testDetermineFilename_with_ContentDisposition_zero_length(){  HttpResponse httpResponse;  auto httpHeader = make_unique<HttpHeader>();  httpHeader->put(HttpHeader::CONTENT_DISPOSITION, "attachment; filename=\"\"");  auto httpRequest = make_unique<HttpRequest>();  auto request = std::make_shared<Request>();  request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");  httpRequest->setRequest(request);  httpResponse.setHttpHeader(std::move(httpHeader));  httpResponse.setHttpRequest(std::move(httpRequest));  CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"),                       httpResponse.determineFilename(false));}void HttpResponseTest::testDetermineFilename_with_ContentDisposition(){  HttpResponse httpResponse;  auto httpHeader = make_unique<HttpHeader>();  httpHeader->put(HttpHeader::CONTENT_DISPOSITION,                  "attachment; filename=\"aria2-current.tar.bz2\"");  auto httpRequest = make_unique<HttpRequest>();  auto request = std::make_shared<Request>();  request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");  httpRequest->setRequest(request);  httpResponse.setHttpHeader(std::move(httpHeader));  httpResponse.setHttpRequest(std::move(httpRequest));  CPPUNIT_ASSERT_EQUAL(std::string("aria2-current.tar.bz2"),                       httpResponse.determineFilename(false));}void HttpResponseTest::testGetRedirectURI_without_Location(){  HttpResponse httpResponse;  httpResponse.setHttpHeader(make_unique<HttpHeader>());  CPPUNIT_ASSERT_EQUAL(std::string(""), httpResponse.getRedirectURI());}void HttpResponseTest::testGetRedirectURI_with_Location(){  HttpResponse httpResponse;  auto httpHeader = make_unique<HttpHeader>();  httpHeader->put(HttpHeader::LOCATION,                  "http://localhost/download/aria2-1.0.0.tar.bz2");  httpResponse.setHttpHeader(std::move(httpHeader));  CPPUNIT_ASSERT_EQUAL(      std::string("http://localhost/download/aria2-1.0.0.tar.bz2"),      httpResponse.getRedirectURI());}void HttpResponseTest::testIsRedirect(){  HttpResponse httpResponse;  httpResponse.setHttpHeader(make_unique<HttpHeader>());  httpResponse.getHttpHeader()->setStatusCode(301);  CPPUNIT_ASSERT(!httpResponse.isRedirect());  httpResponse.getHttpHeader()->setStatusCode(200);  CPPUNIT_ASSERT(!httpResponse.isRedirect());  httpResponse.getHttpHeader()->put(      HttpHeader::LOCATION, "http://localhost/download/aria2-1.0.0.tar.bz2");  CPPUNIT_ASSERT(!httpResponse.isRedirect());  httpResponse.getHttpHeader()->setStatusCode(300);  CPPUNIT_ASSERT(httpResponse.isRedirect());  httpResponse.getHttpHeader()->setStatusCode(301);  CPPUNIT_ASSERT(httpResponse.isRedirect());  httpResponse.getHttpHeader()->setStatusCode(302);  CPPUNIT_ASSERT(httpResponse.isRedirect());  httpResponse.getHttpHeader()->setStatusCode(303);  CPPUNIT_ASSERT(httpResponse.isRedirect());  httpResponse.getHttpHeader()->setStatusCode(304);  CPPUNIT_ASSERT(!httpResponse.isRedirect());  httpResponse.getHttpHeader()->setStatusCode(305);  CPPUNIT_ASSERT(!httpResponse.isRedirect());  httpResp
 |