|
|
@ -67,7 +67,7 @@ unsigned long CircleBuf::BwReadLimit=0; |
|
|
|
unsigned long CircleBuf::BwTickReadData=0; |
|
|
|
struct timeval CircleBuf::BwReadTick={0,0}; |
|
|
|
const unsigned int CircleBuf::BW_HZ=10; |
|
|
|
|
|
|
|
|
|
|
|
// CircleBuf::CircleBuf - Circular input buffer /*{{{*/
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
/* */ |
|
|
@ -378,7 +378,7 @@ bool ServerState::Close() |
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
/* Returns 0 if things are OK, 1 if an IO error occurred and 2 if a header
|
|
|
|
parse error occurred */ |
|
|
|
int ServerState::RunHeaders() |
|
|
|
ServerState::RunHeadersResult ServerState::RunHeaders() |
|
|
|
{ |
|
|
|
State = Header; |
|
|
|
|
|
|
@ -407,7 +407,7 @@ int ServerState::RunHeaders() |
|
|
|
string::const_iterator J = I; |
|
|
|
for (; J != Data.end() && *J != '\n' && *J != '\r';J++); |
|
|
|
if (HeaderLine(string(I,J)) == false) |
|
|
|
return 2; |
|
|
|
return RUN_HEADERS_PARSE_ERROR; |
|
|
|
I = J; |
|
|
|
} |
|
|
|
|
|
|
@ -419,11 +419,11 @@ int ServerState::RunHeaders() |
|
|
|
if (Encoding == Closes && HaveContent == true) |
|
|
|
Persistent = false; |
|
|
|
|
|
|
|
return 0; |
|
|
|
return RUN_HEADERS_OK; |
|
|
|
} |
|
|
|
while (Owner->Go(false,this) == true); |
|
|
|
|
|
|
|
return 1; |
|
|
|
return RUN_HEADERS_IO_ERROR; |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// ServerState::RunData - Transfer the data from the socket /*{{{*/
|
|
|
@ -922,7 +922,8 @@ bool HttpMethod::ServerDie(ServerState *Srv) |
|
|
|
5 - Unrecoverable non-server error (close the connection) |
|
|
|
6 - Try again with a new or changed URI |
|
|
|
*/ |
|
|
|
int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv) |
|
|
|
HttpMethod::DealWithHeadersResult |
|
|
|
HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv) |
|
|
|
{ |
|
|
|
// Not Modified
|
|
|
|
if (Srv->Result == 304) |
|
|
@ -930,7 +931,7 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv) |
|
|
|
unlink(Queue->DestFile.c_str()); |
|
|
|
Res.IMSHit = true; |
|
|
|
Res.LastModified = Queue->LastModified; |
|
|
|
return 1; |
|
|
|
return IMS_HIT; |
|
|
|
} |
|
|
|
|
|
|
|
/* Redirect
|
|
|
@ -949,7 +950,7 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv) |
|
|
|
if (!Srv->Location.empty()) |
|
|
|
{ |
|
|
|
NextURI = Srv->Location; |
|
|
|
return 6; |
|
|
|
return TRY_AGAIN_OR_REDIRECT; |
|
|
|
} |
|
|
|
/* else pass through for error message */ |
|
|
|
} |
|
|
@ -960,8 +961,8 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv) |
|
|
|
{ |
|
|
|
_error->Error("%u %s",Srv->Result,Srv->Code); |
|
|
|
if (Srv->HaveContent == true) |
|
|
|
return 4; |
|
|
|
return 3; |
|
|
|
return ERROR_WITH_CONTENT_PAGE; |
|
|
|
return ERROR_UNRECOVERABLE; |
|
|
|
} |
|
|
|
|
|
|
|
// This is some sort of 2xx 'data follows' reply
|
|
|
@ -972,7 +973,7 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv) |
|
|
|
delete File; |
|
|
|
File = new FileFd(Queue->DestFile,FileFd::WriteAny); |
|
|
|
if (_error->PendingError() == true) |
|
|
|
return 5; |
|
|
|
return ERROR_NOT_FROM_SERVER; |
|
|
|
|
|
|
|
FailFile = Queue->DestFile; |
|
|
|
FailFile.c_str(); // Make sure we dont do a malloc in the signal handler
|
|
|
@ -1000,13 +1001,13 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv) |
|
|
|
if (Srv->In.Hash->AddFD(File->Fd(),Srv->StartPos) == false) |
|
|
|
{ |
|
|
|
_error->Errno("read",_("Problem hashing file")); |
|
|
|
return 5; |
|
|
|
return ERROR_NOT_FROM_SERVER; |
|
|
|
} |
|
|
|
lseek(File->Fd(),0,SEEK_END); |
|
|
|
} |
|
|
|
|
|
|
|
SetNonBlock(File->Fd(),true); |
|
|
|
return 0; |
|
|
|
return FILE_IS_OPEN; |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// HttpMethod::SigTerm - Handle a fatal signal /*{{{*/
|
|
|
@ -1147,11 +1148,11 @@ int HttpMethod::Loop() |
|
|
|
// Fetch the next URL header data from the server.
|
|
|
|
switch (Server->RunHeaders()) |
|
|
|
{ |
|
|
|
case 0: |
|
|
|
case ServerState::RUN_HEADERS_OK: |
|
|
|
break; |
|
|
|
|
|
|
|
// The header data is bad
|
|
|
|
case 2: |
|
|
|
case ServerState::RUN_HEADERS_PARSE_ERROR: |
|
|
|
{ |
|
|
|
_error->Error(_("Bad header data")); |
|
|
|
Fail(true); |
|
|
@ -1161,7 +1162,7 @@ int HttpMethod::Loop() |
|
|
|
|
|
|
|
// The server closed a connection during the header get..
|
|
|
|
default: |
|
|
|
case 1: |
|
|
|
case ServerState::RUN_HEADERS_IO_ERROR: |
|
|
|
{ |
|
|
|
FailCounter++; |
|
|
|
_error->Discard(); |
|
|
@ -1185,7 +1186,7 @@ int HttpMethod::Loop() |
|
|
|
switch (DealWithHeaders(Res,Server)) |
|
|
|
{ |
|
|
|
// Ok, the file is Open
|
|
|
|
case 0: |
|
|
|
case FILE_IS_OPEN: |
|
|
|
{ |
|
|
|
URIStart(Res); |
|
|
|
|
|
|
@ -1238,21 +1239,21 @@ int HttpMethod::Loop() |
|
|
|
} |
|
|
|
|
|
|
|
// IMS hit
|
|
|
|
case 1: |
|
|
|
case IMS_HIT: |
|
|
|
{ |
|
|
|
URIDone(Res); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
// Hard server error, not found or something
|
|
|
|
case 3: |
|
|
|
case ERROR_UNRECOVERABLE: |
|
|
|
{ |
|
|
|
Fail(); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
// Hard internal error, kill the connection and fail
|
|
|
|
case 5: |
|
|
|
case ERROR_NOT_FROM_SERVER: |
|
|
|
{ |
|
|
|
delete File; |
|
|
|
File = 0; |
|
|
@ -1264,7 +1265,7 @@ int HttpMethod::Loop() |
|
|
|
} |
|
|
|
|
|
|
|
// We need to flush the data, the header is like a 404 w/ error text
|
|
|
|
case 4: |
|
|
|
case ERROR_WITH_CONTENT_PAGE: |
|
|
|
{ |
|
|
|
Fail(); |
|
|
|
|
|
|
@ -1277,7 +1278,7 @@ int HttpMethod::Loop() |
|
|
|
} |
|
|
|
|
|
|
|
// Try again with a new URL
|
|
|
|
case 6: |
|
|
|
case TRY_AGAIN_OR_REDIRECT: |
|
|
|
{ |
|
|
|
// Clear rest of response if there is content
|
|
|
|
if (Server->HaveContent) |
|
|
|