mirror of https://github.com/aria2/aria2
				
				
				
			2010-11-15 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Replaced HttpHeader::responseStatus_ with HttpHeader::statusCode_. statusCode_ is of type int. * src/AbstractProxyResponseCommand.cc * src/FtpNegotiationCommand.cc * src/HttpHeader.cc * src/HttpHeader.h * src/HttpHeaderProcessor.cc * src/HttpResponse.cc * src/HttpResponse.h * src/HttpResponseCommand.cc * src/HttpSkipResponseCommand.cc * src/util.cc * src/util.h * test/HttpHeaderProcessorTest.cc * test/HttpHeaderTest.cc * test/HttpResponseTest.cc * test/UtilTest.ccpull/1/head
							parent
							
								
									6a1fe66975
								
							
						
					
					
						commit
						d8d159ccd8
					
				
							
								
								
									
										20
									
								
								ChangeLog
								
								
								
								
							
							
						
						
									
										20
									
								
								ChangeLog
								
								
								
								
							| 
						 | 
				
			
			@ -1,3 +1,23 @@
 | 
			
		|||
2010-11-15  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	Replaced HttpHeader::responseStatus_ with HttpHeader::statusCode_.
 | 
			
		||||
	statusCode_ is of type int.
 | 
			
		||||
	* src/AbstractProxyResponseCommand.cc
 | 
			
		||||
	* src/FtpNegotiationCommand.cc
 | 
			
		||||
	* src/HttpHeader.cc
 | 
			
		||||
	* src/HttpHeader.h
 | 
			
		||||
	* src/HttpHeaderProcessor.cc
 | 
			
		||||
	* src/HttpResponse.cc
 | 
			
		||||
	* src/HttpResponse.h
 | 
			
		||||
	* src/HttpResponseCommand.cc
 | 
			
		||||
	* src/HttpSkipResponseCommand.cc
 | 
			
		||||
	* src/util.cc
 | 
			
		||||
	* src/util.h
 | 
			
		||||
	* test/HttpHeaderProcessorTest.cc
 | 
			
		||||
	* test/HttpHeaderTest.cc
 | 
			
		||||
	* test/HttpResponseTest.cc
 | 
			
		||||
	* test/UtilTest.cc
 | 
			
		||||
 | 
			
		||||
2010-11-15  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	Use SharedHandle::swap() in some places.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,7 +69,7 @@ bool AbstractProxyResponseCommand::executeInternal() {
 | 
			
		|||
    getDownloadEngine()->addCommand(this);
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  if(httpResponse->getResponseStatus() != HttpHeader::S200) {
 | 
			
		||||
  if(httpResponse->getStatusCode() != 200) {
 | 
			
		||||
    throw DL_RETRY_EX(EX_PROXY_CONNECTION_FAILED);
 | 
			
		||||
  }
 | 
			
		||||
  getDownloadEngine()->addCommand(getNextCommand());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -747,7 +747,7 @@ bool FtpNegotiationCommand::recvTunnelResponse()
 | 
			
		|||
  if(!httpResponse) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  if(httpResponse->getResponseStatus() != HttpHeader::S200) {
 | 
			
		||||
  if(httpResponse->getStatusCode() != 200) {
 | 
			
		||||
    throw DL_RETRY_EX(EX_PROXY_CONNECTION_FAILED);
 | 
			
		||||
  }
 | 
			
		||||
  sequence_ = SEQ_SEND_REST_PASV;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -76,28 +76,6 @@ const std::string HttpHeader::ACCEPT_ENCODING("Accept-Encoding");
 | 
			
		|||
 | 
			
		||||
const std::string HttpHeader::HTTP_1_1("HTTP/1.1");
 | 
			
		||||
 | 
			
		||||
const std::string HttpHeader::S200("200");
 | 
			
		||||
 | 
			
		||||
const std::string HttpHeader::S206("206");
 | 
			
		||||
 | 
			
		||||
const std::string HttpHeader::S300("300");
 | 
			
		||||
 | 
			
		||||
const std::string HttpHeader::S301("301");
 | 
			
		||||
 | 
			
		||||
const std::string HttpHeader::S302("302");
 | 
			
		||||
 | 
			
		||||
const std::string HttpHeader::S303("303");
 | 
			
		||||
 | 
			
		||||
const std::string HttpHeader::S304("304");
 | 
			
		||||
 | 
			
		||||
const std::string HttpHeader::S307("307");
 | 
			
		||||
 | 
			
		||||
const std::string HttpHeader::S400("400");
 | 
			
		||||
 | 
			
		||||
const std::string HttpHeader::S401("401");
 | 
			
		||||
  
 | 
			
		||||
const std::string HttpHeader::S404("404");
 | 
			
		||||
 | 
			
		||||
HttpHeader::HttpHeader() {}
 | 
			
		||||
HttpHeader::~HttpHeader() {}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -201,11 +179,6 @@ RangeHandle HttpHeader::getRange() const
 | 
			
		|||
  return SharedHandle<Range>(new Range(startByte, endByte, entityLength));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HttpHeader::setResponseStatus(const std::string& responseStatus)
 | 
			
		||||
{
 | 
			
		||||
  responseStatus_ = responseStatus;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HttpHeader::setVersion(const std::string& version)
 | 
			
		||||
{
 | 
			
		||||
  version_ = version;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,9 +52,8 @@ class HttpHeader {
 | 
			
		|||
private:
 | 
			
		||||
  std::multimap<std::string, std::string> table_;
 | 
			
		||||
 | 
			
		||||
  // for HTTP response header only
 | 
			
		||||
  // response status, e.g. "200"
 | 
			
		||||
  std::string responseStatus_;
 | 
			
		||||
  // HTTP status code, e.g. 200
 | 
			
		||||
  int statusCode_;
 | 
			
		||||
 | 
			
		||||
  // HTTP version, e.g. HTTP/1.1
 | 
			
		||||
  std::string version_;
 | 
			
		||||
| 
						 | 
				
			
			@ -77,12 +76,15 @@ public:
 | 
			
		|||
 | 
			
		||||
  SharedHandle<Range> getRange() const;
 | 
			
		||||
 | 
			
		||||
  const std::string& getResponseStatus() const
 | 
			
		||||
  int getStatusCode() const
 | 
			
		||||
  {
 | 
			
		||||
    return responseStatus_;
 | 
			
		||||
    return statusCode_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void setResponseStatus(const std::string& responseStatus);
 | 
			
		||||
  void setStatusCode(int code)
 | 
			
		||||
  {
 | 
			
		||||
    statusCode_ = code;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const std::string& getVersion() const
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -143,28 +145,6 @@ public:
 | 
			
		|||
  static const std::string ACCEPT_ENCODING;
 | 
			
		||||
 | 
			
		||||
  static const std::string HTTP_1_1;
 | 
			
		||||
 | 
			
		||||
  static const std::string S200;
 | 
			
		||||
 | 
			
		||||
  static const std::string S206;
 | 
			
		||||
 | 
			
		||||
  static const std::string S300;
 | 
			
		||||
 | 
			
		||||
  static const std::string S301;
 | 
			
		||||
 | 
			
		||||
  static const std::string S302;
 | 
			
		||||
 | 
			
		||||
  static const std::string S303;
 | 
			
		||||
 | 
			
		||||
  static const std::string S304;
 | 
			
		||||
 | 
			
		||||
  static const std::string S307;
 | 
			
		||||
 | 
			
		||||
  static const std::string S400;
 | 
			
		||||
 | 
			
		||||
  static const std::string S401;
 | 
			
		||||
  
 | 
			
		||||
  static const std::string S404;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef SharedHandle<HttpHeader> HttpHeaderHandle;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -110,9 +110,13 @@ SharedHandle<HttpHeader> HttpHeaderProcessor::getHttpResponseHeader()
 | 
			
		|||
     delimpos < 12) {
 | 
			
		||||
    throw DL_RETRY_EX(EX_NO_STATUS_HEADER);
 | 
			
		||||
  }
 | 
			
		||||
  int32_t statusCode;
 | 
			
		||||
  if(!util::parseIntNoThrow(statusCode, buf_.substr(9, 3))) {
 | 
			
		||||
    throw DL_RETRY_EX("Status code could not be parsed as integer.");
 | 
			
		||||
  }
 | 
			
		||||
  HttpHeaderHandle httpHeader(new HttpHeader());
 | 
			
		||||
  httpHeader->setVersion(buf_.substr(0, 8));
 | 
			
		||||
  httpHeader->setResponseStatus(buf_.substr(9, 3));
 | 
			
		||||
  httpHeader->setStatusCode(statusCode);
 | 
			
		||||
  std::istringstream strm(buf_);
 | 
			
		||||
  // TODO 1st line(HTTP/1.1 200...) is also send to HttpHeader, but it should
 | 
			
		||||
  // not.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,26 +64,24 @@ HttpResponse::~HttpResponse() {}
 | 
			
		|||
 | 
			
		||||
void HttpResponse::validateResponse() const
 | 
			
		||||
{
 | 
			
		||||
  const std::string& status = getResponseStatus();
 | 
			
		||||
  if(status >= HttpHeader::S400) {
 | 
			
		||||
  int statusCode = getStatusCode();
 | 
			
		||||
  if(statusCode >= 400) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  if(status == HttpHeader::S304) {
 | 
			
		||||
  if(statusCode == 304) {
 | 
			
		||||
    if(httpRequest_->getIfModifiedSinceHeader().empty()) {
 | 
			
		||||
      throw DL_ABORT_EX("Got 304 without If-Modified-Since");
 | 
			
		||||
    }
 | 
			
		||||
  } else if(status == HttpHeader::S301 ||
 | 
			
		||||
     status == HttpHeader::S302 ||
 | 
			
		||||
     status == HttpHeader::S303 ||
 | 
			
		||||
     status == HttpHeader::S307) {
 | 
			
		||||
  } else if(statusCode == 301 ||
 | 
			
		||||
            statusCode == 302 ||
 | 
			
		||||
            statusCode == 303 ||
 | 
			
		||||
            statusCode == 307) {
 | 
			
		||||
    if(!httpHeader_->defined(HttpHeader::LOCATION)) {
 | 
			
		||||
      throw DL_ABORT_EX
 | 
			
		||||
        (StringFormat(EX_LOCATION_HEADER_REQUIRED,
 | 
			
		||||
                      util::parseUInt(status)).str());
 | 
			
		||||
        (StringFormat(EX_LOCATION_HEADER_REQUIRED, statusCode).str());
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
  } else if(status == HttpHeader::S200 ||
 | 
			
		||||
            status == HttpHeader::S206) {
 | 
			
		||||
  } else if(statusCode == 200 || statusCode == 206) {
 | 
			
		||||
    if(!httpHeader_->defined(HttpHeader::TRANSFER_ENCODING)) {
 | 
			
		||||
      // compare the received range against the requested range
 | 
			
		||||
      RangeHandle responseRange = httpHeader_->getRange();
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +100,7 @@ void HttpResponse::validateResponse() const
 | 
			
		|||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    throw DL_ABORT_EX
 | 
			
		||||
      (StringFormat("Unexpected status %s", status.c_str()).str());
 | 
			
		||||
      (StringFormat("Unexpected status %d", statusCode).str());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -140,11 +138,11 @@ void HttpResponse::retrieveCookie()
 | 
			
		|||
 | 
			
		||||
bool HttpResponse::isRedirect() const
 | 
			
		||||
{
 | 
			
		||||
  const std::string& status = getResponseStatus();
 | 
			
		||||
  return (HttpHeader::S301 == status ||
 | 
			
		||||
          HttpHeader::S302 == status ||
 | 
			
		||||
          HttpHeader::S303 == status ||
 | 
			
		||||
          HttpHeader::S307 == status) &&
 | 
			
		||||
  int statusCode = getStatusCode();
 | 
			
		||||
  return (301 == statusCode ||
 | 
			
		||||
          302 == statusCode ||
 | 
			
		||||
          303 == statusCode ||
 | 
			
		||||
          307 == statusCode) &&
 | 
			
		||||
    httpHeader_->defined(HttpHeader::LOCATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -254,10 +252,9 @@ void HttpResponse::setHttpRequest(const SharedHandle<HttpRequest>& httpRequest)
 | 
			
		|||
  httpRequest_ = httpRequest;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO return std::string
 | 
			
		||||
const std::string& HttpResponse::getResponseStatus() const
 | 
			
		||||
int HttpResponse::getStatusCode() const
 | 
			
		||||
{
 | 
			
		||||
  return httpHeader_->getResponseStatus();
 | 
			
		||||
  return httpHeader_->getStatusCode();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool HttpResponse::hasRetryAfter() const
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -108,7 +108,7 @@ public:
 | 
			
		|||
    return httpHeader_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const std::string& getResponseStatus() const;
 | 
			
		||||
  int getStatusCode() const;
 | 
			
		||||
 | 
			
		||||
  void setHttpRequest(const SharedHandle<HttpRequest>& httpRequest);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -167,8 +167,9 @@ bool HttpResponseCommand::executeInternal()
 | 
			
		|||
      (getOption()->getAsInt(PREF_MAX_HTTP_PIPELINING));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int statusCode = httpResponse->getStatusCode();
 | 
			
		||||
  if(!httpResponse->getHttpRequest()->getIfModifiedSinceHeader().empty()) {
 | 
			
		||||
    if(httpResponse->getResponseStatus() == HttpHeader::S304) {
 | 
			
		||||
    if(statusCode == 304) {
 | 
			
		||||
      uint64_t totalLength = httpResponse->getEntityLength();
 | 
			
		||||
      getFileEntry()->setLength(totalLength);
 | 
			
		||||
      getRequestGroup()->initPieceStorage();
 | 
			
		||||
| 
						 | 
				
			
			@ -181,15 +182,13 @@ bool HttpResponseCommand::executeInternal()
 | 
			
		|||
      poolConnection();
 | 
			
		||||
      getFileEntry()->poolRequest(getRequest());
 | 
			
		||||
      return true;
 | 
			
		||||
    } else if(httpResponse->getResponseStatus() == HttpHeader::S200 ||
 | 
			
		||||
              httpResponse->getResponseStatus() == HttpHeader::S206) {
 | 
			
		||||
    } else if(statusCode == 200 || statusCode == 206) {
 | 
			
		||||
      // Remote file is newer than local file. We allow overwrite.
 | 
			
		||||
      getOption()->put(PREF_ALLOW_OVERWRITE, A2_V_TRUE);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if(httpResponse->getResponseStatus() >= HttpHeader::S300 &&
 | 
			
		||||
     httpResponse->getResponseStatus() != HttpHeader::S304) {
 | 
			
		||||
    if(httpResponse->getResponseStatus() == HttpHeader::S404) {
 | 
			
		||||
  if(statusCode != 304 && statusCode >= 300) {
 | 
			
		||||
    if(statusCode == 404) {
 | 
			
		||||
      getRequestGroup()->increaseAndValidateFileNotFoundCount();
 | 
			
		||||
    }
 | 
			
		||||
    return skipResponseBody(httpResponse);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -171,6 +171,7 @@ void HttpSkipResponseCommand::poolConnection() const
 | 
			
		|||
 | 
			
		||||
bool HttpSkipResponseCommand::processResponse()
 | 
			
		||||
{
 | 
			
		||||
  int statusCode;
 | 
			
		||||
  if(httpResponse_->isRedirect()) {
 | 
			
		||||
    unsigned int rnum =
 | 
			
		||||
      httpResponse_->getHttpRequest()->getRequest()->getRedirectCount();
 | 
			
		||||
| 
						 | 
				
			
			@ -180,8 +181,8 @@ bool HttpSkipResponseCommand::processResponse()
 | 
			
		|||
    }
 | 
			
		||||
    httpResponse_->processRedirect();
 | 
			
		||||
    return prepareForRetry(0);
 | 
			
		||||
  } else if(httpResponse_->getResponseStatus() >= HttpHeader::S400) {
 | 
			
		||||
    if(httpResponse_->getResponseStatus() == HttpHeader::S401) {
 | 
			
		||||
  } else if((statusCode = httpResponse_->getStatusCode()) >= 400) {
 | 
			
		||||
    if(statusCode == 401) {
 | 
			
		||||
      if(getOption()->getAsBool(PREF_HTTP_AUTH_CHALLENGE) &&
 | 
			
		||||
         !httpResponse_->getHttpRequest()->authenticationUsed() &&
 | 
			
		||||
         getDownloadEngine()->getAuthConfigFactory()->activateBasicCred
 | 
			
		||||
| 
						 | 
				
			
			@ -190,14 +191,11 @@ bool HttpSkipResponseCommand::processResponse()
 | 
			
		|||
      } else {
 | 
			
		||||
        throw DL_ABORT_EX(EX_AUTH_FAILED);
 | 
			
		||||
      }
 | 
			
		||||
    }else if(httpResponse_->getResponseStatus() == HttpHeader::S404) {
 | 
			
		||||
    } else if(statusCode == 404) {
 | 
			
		||||
      throw DL_ABORT_EX2(MSG_RESOURCE_NOT_FOUND,
 | 
			
		||||
                         downloadresultcode::RESOURCE_NOT_FOUND);
 | 
			
		||||
    } else {
 | 
			
		||||
      throw DL_ABORT_EX
 | 
			
		||||
        (StringFormat
 | 
			
		||||
         (EX_BAD_STATUS,
 | 
			
		||||
          util::parseUInt(httpResponse_->getResponseStatus())).str());
 | 
			
		||||
      throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, statusCode).str());
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    return prepareForRetry(0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										23
									
								
								src/util.cc
								
								
								
								
							
							
						
						
									
										23
									
								
								src/util.cc
								
								
								
								
							| 
						 | 
				
			
			@ -512,6 +512,26 @@ int32_t parseInt(const std::string& s, int32_t base)
 | 
			
		|||
  return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool parseIntNoThrow(int32_t& result, const std::string& s, int base)
 | 
			
		||||
{
 | 
			
		||||
  // Without trim, strtol("  -1  ",..) emits error.
 | 
			
		||||
  std::string trimed = strip(s);
 | 
			
		||||
  if(trimed.empty()) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  char* stop;
 | 
			
		||||
  errno = 0;
 | 
			
		||||
  long int v = strtol(trimed.c_str(), &stop, base);
 | 
			
		||||
  if(*stop != '\0') {
 | 
			
		||||
    return false;
 | 
			
		||||
  } else if(((v == LONG_MAX || v == LONG_MIN) && (errno == ERANGE)) ||
 | 
			
		||||
            v < INT32_MIN || INT32_MAX < v) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  result = v;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t parseUInt(const std::string& s, int base)
 | 
			
		||||
{
 | 
			
		||||
  uint64_t v = parseULLInt(s, base);
 | 
			
		||||
| 
						 | 
				
			
			@ -524,7 +544,7 @@ uint32_t parseUInt(const std::string& s, int base)
 | 
			
		|||
 | 
			
		||||
bool parseUIntNoThrow(uint32_t& result, const std::string& s, int base)
 | 
			
		||||
{
 | 
			
		||||
  // TODO what happens when we don't trim s?
 | 
			
		||||
  // Without trim, strtol("  -1  ",..) emits error.
 | 
			
		||||
  std::string trimed = strip(s);
 | 
			
		||||
  if(trimed.empty()) {
 | 
			
		||||
    return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -567,6 +587,7 @@ int64_t parseLLInt(const std::string& s, int32_t base)
 | 
			
		|||
 | 
			
		||||
bool parseLLIntNoThrow(int64_t& result, const std::string& s, int base)
 | 
			
		||||
{
 | 
			
		||||
  // Without trim, strtol("  -1  ",..) emits error.
 | 
			
		||||
  std::string trimed = strip(s);
 | 
			
		||||
  if(trimed.empty()) {
 | 
			
		||||
    return false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -188,6 +188,8 @@ std::string secfmt(time_t sec);
 | 
			
		|||
 | 
			
		||||
int32_t parseInt(const std::string& s, int32_t base = 10);
 | 
			
		||||
 | 
			
		||||
bool parseIntNoThrow(int32_t& result, const std::string& s, int base = 10);
 | 
			
		||||
 | 
			
		||||
uint32_t parseUInt(const std::string& s, int base = 10);
 | 
			
		||||
  
 | 
			
		||||
bool parseUIntNoThrow(uint32_t& result, const std::string& s, int base = 10);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,7 +107,7 @@ void HttpHeaderProcessorTest::testGetHttpResponseHeader()
 | 
			
		|||
  proc.update(hd);
 | 
			
		||||
 | 
			
		||||
  SharedHandle<HttpHeader> header = proc.getHttpResponseHeader();
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("200"), header->getResponseStatus());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(200, header->getStatusCode());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("HTTP/1.1"), header->getVersion());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("Mon, 25 Jun 2007 16:04:59 GMT"),
 | 
			
		||||
                       header->getFirst("Date"));
 | 
			
		||||
| 
						 | 
				
			
			@ -138,7 +138,7 @@ void HttpHeaderProcessorTest::testGetHttpResponseHeader_statusOnly()
 | 
			
		|||
  std::string hd = "HTTP/1.1 200\r\n\r\n";
 | 
			
		||||
  proc.update(hd);
 | 
			
		||||
  SharedHandle<HttpHeader> header = proc.getHttpResponseHeader();
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("200"), header->getResponseStatus());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(200, header->getStatusCode());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HttpHeaderProcessorTest::testGetHttpResponseHeader_insufficientStatusLength()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -83,7 +83,7 @@ void HttpHeaderTest::testGet()
 | 
			
		|||
void HttpHeaderTest::testClearField()
 | 
			
		||||
{
 | 
			
		||||
  HttpHeader h;
 | 
			
		||||
  h.setResponseStatus(HttpHeader::S200);
 | 
			
		||||
  h.setStatusCode(200);
 | 
			
		||||
  h.setVersion(HttpHeader::HTTP_1_1);
 | 
			
		||||
  h.put("Foo", "Bar");
 | 
			
		||||
  
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +92,7 @@ void HttpHeaderTest::testClearField()
 | 
			
		|||
  h.clearField();
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string(""), h.getFirst("Foo"));
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(HttpHeader::S200, h.getResponseStatus());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(200, h.getStatusCode());
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(HttpHeader::HTTP_1_1, h.getVersion());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -212,14 +212,14 @@ void HttpResponseTest::testIsRedirect()
 | 
			
		|||
{
 | 
			
		||||
  HttpResponse httpResponse;
 | 
			
		||||
  SharedHandle<HttpHeader> httpHeader(new HttpHeader());
 | 
			
		||||
  httpHeader->setResponseStatus("200");
 | 
			
		||||
  httpHeader->setStatusCode(200);
 | 
			
		||||
  httpHeader->put("Location", "http://localhost/download/aria2-1.0.0.tar.bz2");
 | 
			
		||||
 | 
			
		||||
  httpResponse.setHttpHeader(httpHeader);
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT(!httpResponse.isRedirect());
 | 
			
		||||
 | 
			
		||||
  httpHeader->setResponseStatus("301");
 | 
			
		||||
  httpHeader->setStatusCode(301);
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT(httpResponse.isRedirect());  
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -340,7 +340,7 @@ void HttpResponseTest::testValidateResponse()
 | 
			
		|||
  SharedHandle<HttpHeader> httpHeader(new HttpHeader());
 | 
			
		||||
  httpResponse.setHttpHeader(httpHeader);
 | 
			
		||||
 | 
			
		||||
  httpHeader->setResponseStatus("301");
 | 
			
		||||
  httpHeader->setStatusCode(301);
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
    httpResponse.validateResponse();
 | 
			
		||||
| 
						 | 
				
			
			@ -372,7 +372,7 @@ void HttpResponseTest::testValidateResponse_good_range()
 | 
			
		|||
  request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
 | 
			
		||||
  httpRequest->setRequest(request);
 | 
			
		||||
  httpResponse.setHttpRequest(httpRequest);
 | 
			
		||||
  httpHeader->setResponseStatus("206");
 | 
			
		||||
  httpHeader->setStatusCode(206);
 | 
			
		||||
  httpHeader->put("Content-Range", "bytes 1048576-10485760/10485760");
 | 
			
		||||
  
 | 
			
		||||
  try {
 | 
			
		||||
| 
						 | 
				
			
			@ -399,7 +399,7 @@ void HttpResponseTest::testValidateResponse_bad_range()
 | 
			
		|||
  request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
 | 
			
		||||
  httpRequest->setRequest(request);
 | 
			
		||||
  httpResponse.setHttpRequest(httpRequest);
 | 
			
		||||
  httpHeader->setResponseStatus("206");
 | 
			
		||||
  httpHeader->setStatusCode(206);
 | 
			
		||||
  httpHeader->put("Content-Range", "bytes 0-10485760/10485761");
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
| 
						 | 
				
			
			@ -425,7 +425,7 @@ void HttpResponseTest::testValidateResponse_chunked()
 | 
			
		|||
  request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
 | 
			
		||||
  httpRequest->setRequest(request);
 | 
			
		||||
  httpResponse.setHttpRequest(httpRequest);
 | 
			
		||||
  httpHeader->setResponseStatus("206");
 | 
			
		||||
  httpHeader->setStatusCode(206);
 | 
			
		||||
  httpHeader->put("Content-Range", "bytes 0-10485760/10485761");
 | 
			
		||||
  httpHeader->put("Transfer-Encoding", "chunked");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -442,7 +442,7 @@ void HttpResponseTest::testValidateResponse_withIfModifiedSince()
 | 
			
		|||
  HttpResponse httpResponse;
 | 
			
		||||
  SharedHandle<HttpHeader> httpHeader(new HttpHeader());
 | 
			
		||||
  httpResponse.setHttpHeader(httpHeader);
 | 
			
		||||
  httpHeader->setResponseStatus("304");
 | 
			
		||||
  httpHeader->setStatusCode(304);
 | 
			
		||||
  SharedHandle<HttpRequest> httpRequest(new HttpRequest());
 | 
			
		||||
  httpResponse.setHttpRequest(httpRequest);
 | 
			
		||||
  try {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,6 +48,7 @@ class UtilTest:public CppUnit::TestFixture {
 | 
			
		|||
  CPPUNIT_TEST(testParseUInt);
 | 
			
		||||
  CPPUNIT_TEST(testParseLLInt);
 | 
			
		||||
  CPPUNIT_TEST(testParseULLInt);
 | 
			
		||||
  CPPUNIT_TEST(testParseIntNoThrow);
 | 
			
		||||
  CPPUNIT_TEST(testParseUIntNoThrow);
 | 
			
		||||
  CPPUNIT_TEST(testParseLLIntNoThrow);
 | 
			
		||||
  CPPUNIT_TEST(testToString_binaryStream);
 | 
			
		||||
| 
						 | 
				
			
			@ -106,6 +107,7 @@ public:
 | 
			
		|||
  void testParseUInt();
 | 
			
		||||
  void testParseLLInt();
 | 
			
		||||
  void testParseULLInt();
 | 
			
		||||
  void testParseIntNoThrow();
 | 
			
		||||
  void testParseUIntNoThrow();
 | 
			
		||||
  void testParseLLIntNoThrow();
 | 
			
		||||
  void testToString_binaryStream();
 | 
			
		||||
| 
						 | 
				
			
			@ -828,6 +830,22 @@ void UtilTest::testParseULLInt()
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UtilTest::testParseIntNoThrow()
 | 
			
		||||
{
 | 
			
		||||
  int32_t n;
 | 
			
		||||
  CPPUNIT_ASSERT(util::parseIntNoThrow(n, " -1 "));
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((int32_t)-1, n);
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT(util::parseIntNoThrow(n, "2147483647"));
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((int32_t)2147483647, n);
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT(!util::parseIntNoThrow(n, "2147483648"));
 | 
			
		||||
  CPPUNIT_ASSERT(!util::parseIntNoThrow(n, "-2147483649"));
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT(!util::parseIntNoThrow(n, "12x"));
 | 
			
		||||
  CPPUNIT_ASSERT(!util::parseIntNoThrow(n, ""));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UtilTest::testParseUIntNoThrow()
 | 
			
		||||
{
 | 
			
		||||
  uint32_t n;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue