mirror of https://github.com/aria2/aria2
				
				
				
			2007-11-22 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Replaced strtol with Util::parseInt * src/ChunkedEncoding.cc * src/HttpConnection.cc * src/CookieBoxFactory.cc * src/ParameterizedStringParser.cc * src/Util.cc * test/UtilTest.cc * test/OptionHandlerTest.cc * src/Request.cc Throw exception when empty string is given. The message for exception changed. * src/Util.cc (parseInt)(parseLLInt) * src/message.hpull/1/head
							parent
							
								
									1fed0c0cb0
								
							
						
					
					
						commit
						7436490f75
					
				
							
								
								
									
										17
									
								
								ChangeLog
								
								
								
								
							
							
						
						
									
										17
									
								
								ChangeLog
								
								
								
								
							| 
						 | 
				
			
			@ -1,3 +1,20 @@
 | 
			
		|||
2007-11-22  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 | 
			
		||||
 | 
			
		||||
	Replaced strtol with Util::parseInt
 | 
			
		||||
	* src/ChunkedEncoding.cc
 | 
			
		||||
	* src/HttpConnection.cc
 | 
			
		||||
	* src/CookieBoxFactory.cc
 | 
			
		||||
	* src/ParameterizedStringParser.cc
 | 
			
		||||
	* src/Util.cc
 | 
			
		||||
	* test/UtilTest.cc
 | 
			
		||||
	* test/OptionHandlerTest.cc
 | 
			
		||||
	* src/Request.cc
 | 
			
		||||
 | 
			
		||||
	Throw exception when empty string is given. The message for exception
 | 
			
		||||
	changed.
 | 
			
		||||
	* src/Util.cc (parseInt)(parseLLInt)
 | 
			
		||||
	* src/message.h
 | 
			
		||||
 | 
			
		||||
2007-11-22  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 | 
			
		||||
 | 
			
		||||
	Set precision to 2 because share ratio is rounded into 1.0 if precision
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								TODO
								
								
								
								
							
							
						
						
									
										2
									
								
								TODO
								
								
								
								
							| 
						 | 
				
			
			@ -53,7 +53,7 @@
 | 
			
		|||
    DlAbortEx .... Abort download with the connection/url. Should be renamed to PermanentFailureException
 | 
			
		||||
    DownloadFailureException .... RequestGroup should halt.
 | 
			
		||||
  FatalException .... Program should abort.
 | 
			
		||||
* replace strtol with Util::parseInt
 | 
			
		||||
 | 
			
		||||
-- remaining issues to be implemented for 0.12.0 release
 | 
			
		||||
* Update translation
 | 
			
		||||
* replace strtol with Util::parseInt
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,6 +35,7 @@
 | 
			
		|||
#include "ChunkedEncoding.h"
 | 
			
		||||
#include "DlAbortEx.h"
 | 
			
		||||
#include "message.h"
 | 
			
		||||
#include "Util.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <strings.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -155,23 +156,15 @@ int32_t ChunkedEncoding::readChunkSize(char** pp) {
 | 
			
		|||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
  p = rp;
 | 
			
		||||
 | 
			
		||||
  // We ignore chunk-extension
 | 
			
		||||
  char* exsp = (char*)memchr(*pp, ';', strbufTail-*pp);
 | 
			
		||||
  if(exsp == NULL) {
 | 
			
		||||
  if(exsp == 0 || p < exsp) {
 | 
			
		||||
    exsp = p;
 | 
			
		||||
  }
 | 
			
		||||
  // TODO check invalid characters in buffer
 | 
			
		||||
  char* temp = new char[exsp-*pp+1];
 | 
			
		||||
  memcpy(temp, *pp, exsp-*pp);
 | 
			
		||||
  temp[exsp-*pp] = '\0';
 | 
			
		||||
 | 
			
		||||
  chunkSize = strtol(temp, NULL, 16);
 | 
			
		||||
  delete [] temp;
 | 
			
		||||
  string temp(*pp, exsp);
 | 
			
		||||
  chunkSize = Util::parseInt(temp, 16);
 | 
			
		||||
  if(chunkSize < 0) {
 | 
			
		||||
    throw new DlAbortEx(EX_INVALID_CHUNK_SIZE);
 | 
			
		||||
  } else if(errno == ERANGE && (chunkSize == INT32_MAX || chunkSize == INT32_MIN)) {
 | 
			
		||||
    throw new DlAbortEx(strerror(errno));
 | 
			
		||||
  }
 | 
			
		||||
  *pp = p+2;
 | 
			
		||||
  return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ Cookie CookieBoxFactory::parseNsCookie(const string& nsCookieStr) const
 | 
			
		|||
  c.domain = vs[0];
 | 
			
		||||
  c.path = vs[2];
 | 
			
		||||
  c.secure = vs[3] == "TRUE" ? true : false;
 | 
			
		||||
  c.expires = strtol(vs[4].c_str(), NULL, 10);
 | 
			
		||||
  c.expires = Util::parseInt(vs[4]);
 | 
			
		||||
  c.name = vs[5];
 | 
			
		||||
  if(vs.size() >= 7) {
 | 
			
		||||
    c.value = vs[6];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -115,7 +115,7 @@ HttpResponseHandle HttpConnection::receiveResponse()
 | 
			
		|||
 | 
			
		||||
  HttpResponseHandle httpResponse = new HttpResponse();
 | 
			
		||||
  httpResponse->setCuid(cuid);
 | 
			
		||||
  httpResponse->setStatus(strtol(httpStatusHeader.first.c_str(), 0, 10));
 | 
			
		||||
  httpResponse->setStatus(Util::parseInt(httpStatusHeader.first));
 | 
			
		||||
  httpResponse->setHttpHeader(httpStatusHeader.second);
 | 
			
		||||
  httpResponse->setHttpRequest(entry->getHttpRequest());
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,7 +111,7 @@ PStringDatumHandle ParameterizedStringParser::createLoop(const string& src,
 | 
			
		|||
  if(colonIndex != string::npos) {
 | 
			
		||||
    string stepStr = loopStr.substr(colonIndex+1);
 | 
			
		||||
    if(Util::isNumber(stepStr)) {
 | 
			
		||||
      step = strtol(stepStr.c_str(), 0, 10);
 | 
			
		||||
      step = Util::parseInt(stepStr);
 | 
			
		||||
    } else {
 | 
			
		||||
      throw new FatalException("A step count must be a number.");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -126,8 +126,8 @@ PStringDatumHandle ParameterizedStringParser::createLoop(const string& src,
 | 
			
		|||
  int32_t end;
 | 
			
		||||
  if(Util::isNumber(range.first) && Util::isNumber(range.second)) {
 | 
			
		||||
    nd = new FixedWidthNumberDecorator(range.first.size());
 | 
			
		||||
    start = strtol(range.first.c_str(), 0, 10);
 | 
			
		||||
    end = strtol(range.second.c_str(), 0, 10);
 | 
			
		||||
    start = Util::parseInt(range.first);
 | 
			
		||||
    end = Util::parseInt(range.second);
 | 
			
		||||
  } else if(Util::isLowercase(range.first) && Util::isLowercase(range.second)) {
 | 
			
		||||
    nd = new AlphaNumberDecorator(range.first.size());
 | 
			
		||||
    start = Util::alphaToNum(range.first);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,7 @@
 | 
			
		|||
#include "Util.h"
 | 
			
		||||
#include "FeatureConfig.h"
 | 
			
		||||
#include "CookieBoxFactory.h"
 | 
			
		||||
#include "RecoverableException.h"
 | 
			
		||||
 | 
			
		||||
const string Request::METHOD_GET = "get";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -113,8 +114,13 @@ bool Request::parseUrl(const string& url) {
 | 
			
		|||
  Util::split(hostAndPort, hostPart, ':');
 | 
			
		||||
  host = hostAndPort.first;
 | 
			
		||||
  if(hostAndPort.second != "") {
 | 
			
		||||
    port = strtol(hostAndPort.second.c_str(), NULL, 10);
 | 
			
		||||
    if(!(0 < port && port <= 65535)) {
 | 
			
		||||
    try {
 | 
			
		||||
      port = Util::parseInt(hostAndPort.second);
 | 
			
		||||
      if(!(0 < port && port <= 65535)) {
 | 
			
		||||
	return false;
 | 
			
		||||
      }
 | 
			
		||||
    } catch(RecoverableException* e) {
 | 
			
		||||
      delete e;
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										36
									
								
								src/Util.cc
								
								
								
								
							
							
						
						
									
										36
									
								
								src/Util.cc
								
								
								
								
							| 
						 | 
				
			
			@ -304,11 +304,7 @@ string Util::urldecode(const string& target) {
 | 
			
		|||
    if(*itr == '%') {
 | 
			
		||||
      if(itr+1 != target.end() && itr+2 != target.end() &&
 | 
			
		||||
	 isxdigit(*(itr+1)) && isxdigit(*(itr+2))) {
 | 
			
		||||
	char temp[3];
 | 
			
		||||
	temp[0] = *(itr+1);
 | 
			
		||||
	temp[1] = *(itr+2);
 | 
			
		||||
	temp[2] = '\0';
 | 
			
		||||
	result += strtol(temp, 0, 16);
 | 
			
		||||
	result += Util::parseInt(string(itr+1, itr+3), 16);
 | 
			
		||||
	itr += 2;
 | 
			
		||||
      } else {
 | 
			
		||||
	result += *itr;
 | 
			
		||||
| 
						 | 
				
			
			@ -466,26 +462,38 @@ void Util::unfoldRange(const string& src, Integers& range) {
 | 
			
		|||
 | 
			
		||||
int32_t Util::parseInt(const string& s, int32_t base)
 | 
			
		||||
{
 | 
			
		||||
  if(s.empty()) {
 | 
			
		||||
    throw new DlAbortEx(MSG_STRING_INTEGER_CONVERSION_FAILURE,
 | 
			
		||||
			"empty string");
 | 
			
		||||
  }
 | 
			
		||||
  char* stop;
 | 
			
		||||
  errno = 0;
 | 
			
		||||
  long int v = strtol(s.c_str(), &stop, base);
 | 
			
		||||
  if(*stop != '\0') {
 | 
			
		||||
    throw new DlAbortEx(MSG_ILLEGAL_CHARACTER, stop);
 | 
			
		||||
    throw new DlAbortEx(MSG_STRING_INTEGER_CONVERSION_FAILURE,
 | 
			
		||||
			"illegal character");
 | 
			
		||||
  } else if((v == LONG_MIN || v == LONG_MAX) && errno == ERANGE || v > INT32_MAX || v < INT32_MIN) {
 | 
			
		||||
    throw new DlAbortEx(MSG_OVERFLOW_UNDERFLOW_DETECTED, s.c_str());
 | 
			
		||||
    throw new DlAbortEx(MSG_STRING_INTEGER_CONVERSION_FAILURE,
 | 
			
		||||
			"overflow/underflow");
 | 
			
		||||
  }
 | 
			
		||||
  return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int64_t Util::parseLLInt(const string& s, int32_t base)
 | 
			
		||||
{
 | 
			
		||||
  if(s.empty()) {
 | 
			
		||||
    throw new DlAbortEx(MSG_STRING_INTEGER_CONVERSION_FAILURE,
 | 
			
		||||
			"empty string");
 | 
			
		||||
  }
 | 
			
		||||
  char* stop;
 | 
			
		||||
  errno = 0;
 | 
			
		||||
  int64_t v = strtoll(s.c_str(), &stop, base);
 | 
			
		||||
  if(*stop != '\0') {
 | 
			
		||||
    throw new DlAbortEx(MSG_ILLEGAL_CHARACTER, stop);
 | 
			
		||||
    throw new DlAbortEx(MSG_STRING_INTEGER_CONVERSION_FAILURE,
 | 
			
		||||
			"illegal character");
 | 
			
		||||
  } else if((v == INT64_MIN || v == INT64_MAX) && errno == ERANGE) {
 | 
			
		||||
    throw new DlAbortEx(MSG_OVERFLOW_UNDERFLOW_DETECTED, s.c_str());
 | 
			
		||||
    throw new DlAbortEx(MSG_STRING_INTEGER_CONVERSION_FAILURE,
 | 
			
		||||
			"overflow/underflow");
 | 
			
		||||
  }
 | 
			
		||||
  return v;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -646,7 +654,15 @@ int64_t Util::getRealSize(const string& sizeWithUnit)
 | 
			
		|||
    }
 | 
			
		||||
    size = sizeWithUnit.substr(0, p);
 | 
			
		||||
  }
 | 
			
		||||
  return strtoll(size.c_str(), 0, 10)*mult;
 | 
			
		||||
  int64_t v = Util::parseLLInt(size);
 | 
			
		||||
 | 
			
		||||
  if(v < 0) {
 | 
			
		||||
    throw new DlAbortEx("Negative value detected: %s", sizeWithUnit.c_str());
 | 
			
		||||
  } else if(v*mult < 0) {
 | 
			
		||||
    throw new DlAbortEx(MSG_STRING_INTEGER_CONVERSION_FAILURE,
 | 
			
		||||
			"overflow/underflow");
 | 
			
		||||
  }
 | 
			
		||||
  return v*mult;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
string Util::abbrevSize(int64_t size)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -126,9 +126,8 @@
 | 
			
		|||
#define MSG_DAEMON_FAILED _("daemon failed.")
 | 
			
		||||
#define MSG_VERIFICATION_SUCCESSFUL _("Verification finished successfully. file=%s")
 | 
			
		||||
#define MSG_VERIFICATION_FAILED _("Checksum error detected. file=%s")
 | 
			
		||||
#define MSG_ILLEGAL_CHARACTER _("Illegal character detected: %s")
 | 
			
		||||
#define MSG_INCOMPLETE_RANGE _("Incomplete range specified. %s")
 | 
			
		||||
#define MSG_OVERFLOW_UNDERFLOW_DETECTED _("Overflow/underflow detected: %s")
 | 
			
		||||
#define MSG_STRING_INTEGER_CONVERSION_FAILURE _("Failed to convert string into value: %s")
 | 
			
		||||
 | 
			
		||||
#define EX_TIME_OUT _("Timeout.")
 | 
			
		||||
#define EX_INVALID_CHUNK_SIZE _("Invalid chunk size.")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -151,12 +151,26 @@ void OptionHandlerTest::testUnitNumberOptionHandler()
 | 
			
		|||
  CPPUNIT_ASSERT_EQUAL(string("4294967296"), option.get("foo"));
 | 
			
		||||
  handler.parse(&option, "4096K");
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(string("4194304"), option.get("foo"));
 | 
			
		||||
  handler.parse(&option, "K");
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(string("0"), option.get("foo"));
 | 
			
		||||
  handler.parse(&option, "M");
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(string("0"), option.get("foo"));
 | 
			
		||||
  handler.parse(&option, "");
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(string("0"), option.get("foo"));
 | 
			
		||||
  try {
 | 
			
		||||
    handler.parse(&option, "K");
 | 
			
		||||
    CPPUNIT_FAIL("exception must be thrown.");
 | 
			
		||||
  } catch(Exception* e) {
 | 
			
		||||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
  try {
 | 
			
		||||
    handler.parse(&option, "M");
 | 
			
		||||
  } catch(Exception* e) {
 | 
			
		||||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
  try {
 | 
			
		||||
    handler.parse(&option, "");
 | 
			
		||||
    CPPUNIT_FAIL("exception must be thrown.");
 | 
			
		||||
  } catch(Exception* e) {
 | 
			
		||||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OptionHandlerTest::testParameterOptionHandler_1argInit()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -305,8 +305,41 @@ void UtilTest::testGetRealSize()
 | 
			
		|||
{
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((int64_t)4294967296LL, Util::getRealSize("4096M"));
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((int64_t)1024, Util::getRealSize("1K"));
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((int64_t)0, Util::getRealSize(""));
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((int64_t)0, Util::getRealSize("foo"));
 | 
			
		||||
  try {
 | 
			
		||||
    Util::getRealSize("");
 | 
			
		||||
    CPPUNIT_FAIL("exception must be thrown.");
 | 
			
		||||
  } catch(Exception* e) {
 | 
			
		||||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
  try {
 | 
			
		||||
    Util::getRealSize("foo");
 | 
			
		||||
    CPPUNIT_FAIL("exception must be thrown.");
 | 
			
		||||
  } catch(Exception* e) {
 | 
			
		||||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
  try {
 | 
			
		||||
    Util::getRealSize("-1");
 | 
			
		||||
    CPPUNIT_FAIL("exception must be thrown.");
 | 
			
		||||
  } catch(Exception* e) {
 | 
			
		||||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
  try {
 | 
			
		||||
    Util::getRealSize("9223372036854775807K");
 | 
			
		||||
    CPPUNIT_FAIL("exception must be thrown.");
 | 
			
		||||
  } catch(Exception* e) {
 | 
			
		||||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
  try {
 | 
			
		||||
    Util::getRealSize("9223372036854775807M");
 | 
			
		||||
    CPPUNIT_FAIL("exception must be thrown.");
 | 
			
		||||
  } catch(Exception* e) {
 | 
			
		||||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UtilTest::testAbbrevSize()
 | 
			
		||||
| 
						 | 
				
			
			@ -504,7 +537,13 @@ void UtilTest::testParseInt()
 | 
			
		|||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
    Util::parseInt("");
 | 
			
		||||
    CPPUNIT_FAIL("exception must be thrown.");
 | 
			
		||||
  } catch(Exception* e) {
 | 
			
		||||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UtilTest::testParseLLInt()
 | 
			
		||||
| 
						 | 
				
			
			@ -533,5 +572,11 @@ void UtilTest::testParseLLInt()
 | 
			
		|||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
    Util::parseLLInt("");
 | 
			
		||||
    CPPUNIT_FAIL("exception must be thrown.");
 | 
			
		||||
  } catch(Exception* e) {
 | 
			
		||||
    cerr << *e;
 | 
			
		||||
    delete e;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue