projects
/
apt.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use some semantically more correct buffer operations
[apt.git]
/
methods
/
http.cc
diff --git
a/methods/http.cc
b/methods/http.cc
index f2a4a4db631add976bcbf36d329a57d45d3304a5..78b20e66d304cde4a383bf6f91143d89e4bc3e40 100644
(file)
--- a/
methods/http.cc
+++ b/
methods/http.cc
@@
-64,7
+64,8
@@
const unsigned int CircleBuf::BW_HZ=10;
// CircleBuf::CircleBuf - Circular input buffer /*{{{*/
// ---------------------------------------------------------------------
/* */
// CircleBuf::CircleBuf - Circular input buffer /*{{{*/
// ---------------------------------------------------------------------
/* */
-CircleBuf::CircleBuf(unsigned long long Size) : Size(Size), Hash(0)
+CircleBuf::CircleBuf(unsigned long long Size)
+ : Size(Size), Hash(NULL), TotalWriten(0)
{
Buf = new unsigned char[Size];
Reset();
{
Buf = new unsigned char[Size];
Reset();
@@
-80,12
+81,13
@@
void CircleBuf::Reset()
InP = 0;
OutP = 0;
StrPos = 0;
InP = 0;
OutP = 0;
StrPos = 0;
+ TotalWriten = 0;
MaxGet = (unsigned long long)-1;
OutQueue = string();
MaxGet = (unsigned long long)-1;
OutQueue = string();
- if (Hash !=
0
)
+ if (Hash !=
NULL
)
{
delete Hash;
{
delete Hash;
- Hash =
new Hashes
;
+ Hash =
NULL
;
}
}
/*}}}*/
}
}
/*}}}*/
@@
-217,8
+219,10
@@
bool CircleBuf::Write(int Fd)
return false;
}
return false;
}
+
+ TotalWriten += Res;
- if (Hash !=
0
)
+ if (Hash !=
NULL
)
Hash->Add(Buf + (OutP%Size),Res);
OutP += Res;
Hash->Add(Buf + (OutP%Size),Res);
OutP += Res;
@@
-438,10
+442,12
@@
bool HttpServerState::RunData(FileFd * const File)
{
/* Closes encoding is used when the server did not specify a size, the
loss of the connection means we are done */
{
/* Closes encoding is used when the server did not specify a size, the
loss of the connection means we are done */
- if (
Encoding == Closes
)
+ if (
Persistent == false
)
In.Limit(-1);
In.Limit(-1);
+ else if (JunkSize != 0)
+ In.Limit(JunkSize);
else
else
- In.Limit(
Size - StartPos
);
+ In.Limit(
DownloadSize
);
// Just transfer the whole block.
do
// Just transfer the whole block.
do
@@
-478,16
+484,14
@@
APT_PURE bool HttpServerState::IsOpen() /*{{{*/
return (ServerFd != -1);
}
/*}}}*/
return (ServerFd != -1);
}
/*}}}*/
-bool HttpServerState::InitHashes(
FileFd &File)
/*{{{*/
+bool HttpServerState::InitHashes(
HashStringList const &ExpectedHashes)
/*{{{*/
{
delete In.Hash;
{
delete In.Hash;
- In.Hash = new Hashes;
-
- // Set the expected size and read file for the hashes
- File.Truncate(StartPos);
- return In.Hash->AddFD(File, StartPos);
+ In.Hash = new Hashes(ExpectedHashes);
+ return true;
}
/*}}}*/
}
/*}}}*/
+
APT_PURE Hashes * HttpServerState::GetHashes() /*{{{*/
{
return In.Hash;
APT_PURE Hashes * HttpServerState::GetHashes() /*{{{*/
{
return In.Hash;
@@
-518,7
+522,7
@@
bool HttpServerState::Die(FileFd &File)
// See if this is because the server finished the data stream
if (In.IsLimit() == false && State != HttpServerState::Header &&
// See if this is because the server finished the data stream
if (In.IsLimit() == false && State != HttpServerState::Header &&
-
Encoding != HttpServerState::Closes
)
+
Persistent == true
)
{
Close();
if (LErrno == 0)
{
Close();
if (LErrno == 0)
@@
-565,7
+569,7
@@
bool HttpServerState::Flush(FileFd * const File)
return true;
}
return true;
}
- if (In.IsLimit() == true ||
Encoding == ServerState::Closes
)
+ if (In.IsLimit() == true ||
Persistent == false
)
return true;
}
return false;
return true;
}
return false;
@@
-651,6
+655,13
@@
bool HttpServerState::Go(bool ToFile, FileFd * const File)
return _error->Errno("write",_("Error writing to output file"));
}
return _error->Errno("write",_("Error writing to output file"));
}
+ if (MaximumSize > 0 && File && File->Tell() > MaximumSize)
+ {
+ Owner->SetFailReason("MaximumSizeExceeded");
+ return _error->Error("Writing more data than expected (%llu > %llu)",
+ File->Tell(), MaximumSize);
+ }
+
// Handle commands from APT
if (FD_ISSET(STDIN_FILENO,&rfds))
{
// Handle commands from APT
if (FD_ISSET(STDIN_FILENO,&rfds))
{
@@
-767,9
+778,9
@@
bool HttpMethod::Configuration(string Message)
return true;
}
/*}}}*/
return true;
}
/*}}}*/
-
ServerState * HttpMethod::CreateServerState(URI uri)
/*{{{*/
+
std::unique_ptr<ServerState> HttpMethod::CreateServerState(URI const &uri)
/*{{{*/
{
{
- return
new HttpServerState(uri, this
);
+ return
std::unique_ptr<ServerState>(new HttpServerState(uri, this)
);
}
/*}}}*/
void HttpMethod::RotateDNS() /*{{{*/
}
/*}}}*/
void HttpMethod::RotateDNS() /*{{{*/