http - fix some bugs, add some bugs
This commit is contained in:
parent
f25e384a0a
commit
4a735d140e
|
@ -217,6 +217,7 @@ public:
|
||||||
// Wrapper to Map
|
// Wrapper to Map
|
||||||
NodeMetadata* getNodeMetadata(v3s16 p);
|
NodeMetadata* getNodeMetadata(v3s16 p);
|
||||||
|
|
||||||
|
Player* getPlayer(const char* name) { return m_env.getPlayer(name);}
|
||||||
LocalPlayer* getLocalPlayer();
|
LocalPlayer* getLocalPlayer();
|
||||||
|
|
||||||
void setPlayerControl(PlayerControl &control);
|
void setPlayerControl(PlayerControl &control);
|
||||||
|
|
71
src/http.cpp
71
src/http.cpp
|
@ -294,13 +294,19 @@ int HTTPRemoteClient::handlePlayer()
|
||||||
if (m_recv_headers.getUrl(3) == "hash") {
|
if (m_recv_headers.getUrl(3) == "hash") {
|
||||||
FILE *f;
|
FILE *f;
|
||||||
f = fopen(file.c_str(),"rb");
|
f = fopen(file.c_str(),"rb");
|
||||||
if (!f)
|
if (!f) {
|
||||||
|
if (m_auth && m_recv_headers.getHeader("User") == m_recv_headers.getUrl(1))
|
||||||
|
return handleSpecial("304 Not Modified");
|
||||||
return handleSpecial("204 No Content");
|
return handleSpecial("204 No Content");
|
||||||
|
}
|
||||||
fseek(f,0,SEEK_END);
|
fseek(f,0,SEEK_END);
|
||||||
size_t l = ftell(f);
|
size_t l = ftell(f);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
if (!l)
|
if (!l) {
|
||||||
|
if (m_auth && m_recv_headers.getHeader("User") == m_recv_headers.getUrl(1))
|
||||||
|
return handleSpecial("304 Not Modified");
|
||||||
return handleSpecial("204 No Content");
|
return handleSpecial("204 No Content");
|
||||||
|
}
|
||||||
SHA1 s;
|
SHA1 s;
|
||||||
s.addFile(file.c_str());
|
s.addFile(file.c_str());
|
||||||
s.getDigest(buff);
|
s.getDigest(buff);
|
||||||
|
@ -334,11 +340,16 @@ int HTTPRemoteClient::handlePlayer()
|
||||||
size_t t = 0;
|
size_t t = 0;
|
||||||
if (c > s)
|
if (c > s)
|
||||||
c = s;
|
c = s;
|
||||||
|
printf("pending: %lu %lu %d %d\n",c,s,m_start,m_end);
|
||||||
if (c) {
|
if (c) {
|
||||||
|
printf("pending: %lu %lu %d %d\n",c,s,m_start,m_end);
|
||||||
|
if (m_start == m_end)
|
||||||
|
m_socket->WaitData(5000);
|
||||||
while ((l = read(buff,c)) > 0) {
|
while ((l = read(buff,c)) > 0) {
|
||||||
s -= l;
|
s -= l;
|
||||||
t += l;
|
t += l;
|
||||||
c = fwrite(buff,1,l,f);
|
c = fwrite(buff,1,l,f);
|
||||||
|
printf("written: %lu\n",c);
|
||||||
if (c != l) {
|
if (c != l) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return handleSpecial("500 Internal Server Error");
|
return handleSpecial("500 Internal Server Error");
|
||||||
|
@ -350,9 +361,13 @@ int HTTPRemoteClient::handlePlayer()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("recieved: %lu %lu\n",s,l);
|
printf("received: %lu %lu\n",s,t);
|
||||||
|
l = ftell(f);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return handleSpecial("201 Created");
|
if (s == t)
|
||||||
|
return handleSpecial("201 Created");
|
||||||
|
fs::RecursiveDelete(file.c_str());
|
||||||
|
return handleSpecial("500 Internal Server Error");
|
||||||
}else if (m_server->getGameServer()->getPlayer(m_recv_headers.getUrl(1))) {
|
}else if (m_server->getGameServer()->getPlayer(m_recv_headers.getUrl(1))) {
|
||||||
std::string html("<h1>Players</h1>\n");
|
std::string html("<h1>Players</h1>\n");
|
||||||
Player *player = m_server->getGameServer()->getPlayer(m_recv_headers.getUrl(1));
|
Player *player = m_server->getGameServer()->getPlayer(m_recv_headers.getUrl(1));
|
||||||
|
@ -518,7 +533,7 @@ void HTTPRemoteClient::sendFile(std::string &file)
|
||||||
fseek(f,0,SEEK_END);
|
fseek(f,0,SEEK_END);
|
||||||
size_t l = ftell(f);
|
size_t l = ftell(f);
|
||||||
fseek(f,0,SEEK_SET);
|
fseek(f,0,SEEK_SET);
|
||||||
size_t s = l;
|
//size_t s = l;
|
||||||
size_t t = 0;
|
size_t t = 0;
|
||||||
|
|
||||||
m_send_headers.setLength(l);
|
m_send_headers.setLength(l);
|
||||||
|
@ -529,7 +544,7 @@ void HTTPRemoteClient::sendFile(std::string &file)
|
||||||
t += l;
|
t += l;
|
||||||
m_socket->Send(buff,l);
|
m_socket->Send(buff,l);
|
||||||
}
|
}
|
||||||
printf("sent: %lu %lu\n",s,t);
|
//printf("sent: %lu %lu\n",s,t);
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
@ -636,6 +651,7 @@ void HTTPClient::start(const Address &address)
|
||||||
m_thread.stop();
|
m_thread.stop();
|
||||||
|
|
||||||
m_address = address;
|
m_address = address;
|
||||||
|
m_connection_failures = 0;
|
||||||
|
|
||||||
// Start thread
|
// Start thread
|
||||||
m_thread.setRun(true);
|
m_thread.setRun(true);
|
||||||
|
@ -686,8 +702,16 @@ void HTTPClient::step()
|
||||||
m_req_mutex.Lock();
|
m_req_mutex.Lock();
|
||||||
m_requests.push_back(q);
|
m_requests.push_back(q);
|
||||||
m_req_mutex.Unlock();
|
m_req_mutex.Unlock();
|
||||||
|
m_connection_failures++;
|
||||||
|
/* assume the server has no http */
|
||||||
|
if (m_connection_failures > 4) {
|
||||||
|
stop();
|
||||||
|
p.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
m_connection_failures = 0;
|
||||||
|
|
||||||
m_recv_headers.clear();
|
m_recv_headers.clear();
|
||||||
m_send_headers.clear();
|
m_send_headers.clear();
|
||||||
|
@ -702,13 +726,10 @@ void HTTPClient::step()
|
||||||
int h = -1;
|
int h = -1;
|
||||||
m_start = 0;
|
m_start = 0;
|
||||||
m_end = 0;
|
m_end = 0;
|
||||||
|
m_recv_headers.setResponse(0);
|
||||||
while (m_socket->WaitData(1000)) {
|
while (m_socket->WaitData(1000)) {
|
||||||
r = fillBuffer();
|
r = fillBuffer();
|
||||||
if (r<1) {
|
if (r<1) {
|
||||||
delete m_socket;
|
|
||||||
m_req_mutex.Lock();
|
|
||||||
m_requests.push_back(q);
|
|
||||||
m_req_mutex.Unlock();
|
|
||||||
h = -1;
|
h = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -716,16 +737,17 @@ void HTTPClient::step()
|
||||||
if (h > -1)
|
if (h > -1)
|
||||||
break;
|
break;
|
||||||
if (h == -1 || m_recv_headers.getResponse() == 500) {
|
if (h == -1 || m_recv_headers.getResponse() == 500) {
|
||||||
delete m_socket;
|
sleep(1);
|
||||||
m_req_mutex.Lock();
|
|
||||||
m_requests.push_back(q);
|
|
||||||
m_req_mutex.Unlock();
|
|
||||||
r = 0;
|
r = 0;
|
||||||
|
h = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (h < 0) {
|
if (h < 0) {
|
||||||
delete m_socket;
|
delete m_socket;
|
||||||
|
m_req_mutex.Lock();
|
||||||
|
m_requests.push_back(q);
|
||||||
|
m_req_mutex.Unlock();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -840,8 +862,14 @@ void HTTPClient::pushRequest(HTTPRequestType type, std::string &data)
|
||||||
std::string tex = std::string("player_") + data + ".png";
|
std::string tex = std::string("player_") + data + ".png";
|
||||||
std::string ptex = getPath("player",tex,true);
|
std::string ptex = getPath("player",tex,true);
|
||||||
if (ptex == "") {
|
if (ptex == "") {
|
||||||
pushRequest(HTTPREQUEST_SKIN,data);
|
if (data == m_client->getLocalPlayer()->getName()) {
|
||||||
return;
|
ptex = getPath("texture","player.png",true);
|
||||||
|
if (ptex == "")
|
||||||
|
return;
|
||||||
|
}else{
|
||||||
|
pushRequest(HTTPREQUEST_SKIN,data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
char buff[100];
|
char buff[100];
|
||||||
SHA1 s;
|
SHA1 s;
|
||||||
|
@ -922,7 +950,6 @@ bool HTTPClient::put(std::string &url, std::string &file)
|
||||||
return false;
|
return false;
|
||||||
fseek(f,0,SEEK_END);
|
fseek(f,0,SEEK_END);
|
||||||
s = ftell(f);
|
s = ftell(f);
|
||||||
printf("filesize: %u\n",s);
|
|
||||||
fseek(f,0,SEEK_SET);
|
fseek(f,0,SEEK_SET);
|
||||||
m_send_headers.setLength(s);
|
m_send_headers.setLength(s);
|
||||||
m_send_headers.setHeader("Content-Type","image/png");
|
m_send_headers.setHeader("Content-Type","image/png");
|
||||||
|
@ -931,10 +958,15 @@ printf("filesize: %u\n",s);
|
||||||
|
|
||||||
sendHeaders();
|
sendHeaders();
|
||||||
|
|
||||||
|
u32 t = 0;
|
||||||
|
u32 l;
|
||||||
|
|
||||||
char buff[1024];
|
char buff[1024];
|
||||||
while ((s = fread(buff,1,1024,f)) > 0) {
|
while ((l = fread(buff,1,1024,f)) > 0) {
|
||||||
m_socket->Send(buff,s);
|
t += l;
|
||||||
|
m_socket->Send(buff,l);
|
||||||
}
|
}
|
||||||
|
printf("sent: %u %u\n",t,s);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1112,6 +1144,7 @@ int HTTPResponseHeaders::read(char* buff, int length)
|
||||||
if (buff[i] == '\n') {
|
if (buff[i] == '\n') {
|
||||||
if (!c) {
|
if (!c) {
|
||||||
nbuff[o] = 0;
|
nbuff[o] = 0;
|
||||||
|
printf("%d '%s'\n",__LINE__,nbuff);
|
||||||
char* r = strchr(nbuff,' ');
|
char* r = strchr(nbuff,' ');
|
||||||
if (!r)
|
if (!r)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -255,6 +255,7 @@ private:
|
||||||
JMutex m_req_mutex;
|
JMutex m_req_mutex;
|
||||||
HTTPClientThread m_thread;
|
HTTPClientThread m_thread;
|
||||||
Client *m_client;
|
Client *m_client;
|
||||||
|
int m_connection_failures;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -361,8 +361,10 @@ TCPSocket::TCPSocket()
|
||||||
}
|
}
|
||||||
|
|
||||||
int a=1;
|
int a=1;
|
||||||
setsockopt(m_handle, SOL_SOCKET, SO_REUSEADDR, &a, sizeof(a));
|
setsockopt(m_handle, SOL_SOCKET, SO_REUSEADDR, &a, sizeof(int));
|
||||||
|
#if defined(__FreeBSD__)
|
||||||
|
setsockopt(m_handle, SOL_SOCKET, SO_NOSIGPIPE, &a, sizeof(int));
|
||||||
|
#endif
|
||||||
setTimeoutMs(0);
|
setTimeoutMs(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -421,7 +423,11 @@ bool TCPSocket::Connect(const Address &destination)
|
||||||
|
|
||||||
void TCPSocket::Send(const void *data, int size)
|
void TCPSocket::Send(const void *data, int size)
|
||||||
{
|
{
|
||||||
int sent = send(m_handle, (const char*)data, size, 0);
|
int flags = 0;
|
||||||
|
#if defined(linux)
|
||||||
|
flags = MSG_NOSIGNAL;
|
||||||
|
#endif
|
||||||
|
int sent = send(m_handle, (const char*)data, size, flags);
|
||||||
|
|
||||||
if (sent != size)
|
if (sent != size)
|
||||||
throw SendFailedException("Failed to send data");
|
throw SendFailedException("Failed to send data");
|
||||||
|
|
Loading…
Reference in New Issue