134
135
const HttpConnectionHandle& httpConnection,
135
136
DownloadEngine* e,
136
137
const SocketHandle& s)
137
: AbstractCommand(cuid, req, fileEntry, requestGroup, e, s),
138
: AbstractCommand(cuid, req, fileEntry, requestGroup, e, s,
139
httpConnection->getSocketRecvBuffer()),
138
140
httpConnection_(httpConnection)
142
checkSocketRecvBuffer();
141
145
HttpResponseCommand::~HttpResponseCommand() {}
165
169
if(getRequest()->isPipeliningEnabled()) {
166
170
getRequest()->setMaxPipelinedRequest
167
171
(getOption()->getAsInt(PREF_MAX_HTTP_PIPELINING));
173
getRequest()->setMaxPipelinedRequest(1);
170
176
int statusCode = httpResponse->getStatusCode();
171
if(!httpResponse->getHttpRequest()->getIfModifiedSinceHeader().empty()) {
172
if(statusCode == 304) {
173
uint64_t totalLength = httpResponse->getEntityLength();
174
getFileEntry()->setLength(totalLength);
175
getRequestGroup()->initPieceStorage();
176
getPieceStorage()->markAllPiecesDone();
177
// Just set checksum verification done.
178
getDownloadContext()->setChecksumVerified(true);
179
A2_LOG_NOTICE(fmt(MSG_DOWNLOAD_ALREADY_COMPLETED,
180
util::itos(getRequestGroup()->getGID()).c_str(),
181
getRequestGroup()->getFirstFilePath().c_str()));
183
getFileEntry()->poolRequest(getRequest());
185
} else if(statusCode == 200 || statusCode == 206) {
186
// Remote file is newer than local file. We allow overwrite.
187
getOption()->put(PREF_ALLOW_OVERWRITE, A2_V_TRUE);
178
if(statusCode == 304) {
179
uint64_t totalLength = httpResponse->getEntityLength();
180
getFileEntry()->setLength(totalLength);
181
getRequestGroup()->initPieceStorage();
182
getPieceStorage()->markAllPiecesDone();
183
// Just set checksum verification done.
184
getDownloadContext()->setChecksumVerified(true);
185
A2_LOG_NOTICE(fmt(MSG_DOWNLOAD_ALREADY_COMPLETED,
186
util::itos(getRequestGroup()->getGID()).c_str(),
187
getRequestGroup()->getFirstFilePath().c_str()));
189
getFileEntry()->poolRequest(getRequest());
190
if(statusCode != 304 && statusCode >= 300) {
192
if(statusCode >= 300) {
191
193
if(statusCode == 404) {
192
194
getRequestGroup()->increaseAndValidateFileNotFoundCount();
445
447
bool decideFileAllocation
446
448
(const SharedHandle<StreamFilter>& filter)
449
451
for(SharedHandle<StreamFilter> f = filter; f; f = f->getDelegate()){
450
452
// Since the compressed file's length are returned in the response header
451
453
// and the decompressed file size is unknown at this point, disable file