Patch level :
Files correlati : Ricompilazione Demo : [ ] Commento : Aggiunta gestione protocollo HTTP tramite le chiamate http_get e http_get_dir git-svn-id: svn://10.65.10.50/trunk@6971 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
4b6b88e9dd
commit
d2856aefe3
@ -23,7 +23,7 @@ bool rpc_Start()
|
|||||||
{
|
{
|
||||||
delete _client;
|
delete _client;
|
||||||
_client = NULL;
|
_client = NULL;
|
||||||
ok = error_box("Errore di inizializzazione del client.");
|
ok = error_box("Errore di inizializzazione del socket client");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
@ -287,3 +287,40 @@ bool rpc_UserLogout()
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool http_get(const char* server,
|
||||||
|
const char* remote_file,
|
||||||
|
const char* local_file)
|
||||||
|
{
|
||||||
|
TSocketClient client;
|
||||||
|
if (!client.IsOk())
|
||||||
|
return error_box("Impossibile inizializzare il client HTTP");
|
||||||
|
|
||||||
|
unsigned long connection = client.QueryConnection("80", server);
|
||||||
|
bool ok = connection != 0;
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
|
ok = client.HttpGetFile(remote_file, local_file) != 0;
|
||||||
|
client.RemoveConnection(connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool http_dir(const char* server, const char* remote_dir, TString_array& list)
|
||||||
|
{
|
||||||
|
TSocketClient client;
|
||||||
|
if (!client.IsOk())
|
||||||
|
return error_box("Impossibile inizializzare il client HTTP");
|
||||||
|
|
||||||
|
unsigned long connection = client.QueryConnection("80", server);
|
||||||
|
bool ok = connection != 0;
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
|
ok = client.HttpGetDir(remote_dir, list) != 0;
|
||||||
|
client.RemoveConnection(connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -21,8 +21,10 @@ bool rpc_UserLogin(const char* server, const char* user,
|
|||||||
const char* password, const char* application);
|
const char* password, const char* application);
|
||||||
bool rpc_UserLogout();
|
bool rpc_UserLogout();
|
||||||
|
|
||||||
|
|
||||||
bool rpc_Start();
|
bool rpc_Start();
|
||||||
bool rpc_Stop();
|
bool rpc_Stop();
|
||||||
|
|
||||||
|
bool http_get(const char* server, const char* remote_file, const char* local_file);
|
||||||
|
bool http_dir(const char* server, const char* remote_dir, TString_array& list);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#define XVT_INCL_NATIVE
|
#define XVT_INCL_NATIVE
|
||||||
#include <strings.h>
|
#include "progind.h"
|
||||||
|
|
||||||
// skstream.h
|
// skstream.h
|
||||||
// Copyright (C) 1995, 1996 by John C. Wang. All Rights Reserved.
|
// Copyright (C) 1995, 1996 by John C. Wang. All Rights Reserved.
|
||||||
@ -18,9 +18,7 @@
|
|||||||
// [JCW 95-Dec-20] comments added for distribution 95a
|
// [JCW 95-Dec-20] comments added for distribution 95a
|
||||||
// [JCW 96-Jan-01] removed UDP capabilities from skstream
|
// [JCW 96-Jan-01] removed UDP capabilities from skstream
|
||||||
|
|
||||||
#include <iostream.h>
|
#include <fstream.h>
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "winsock.h"
|
#include "winsock.h"
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -517,6 +515,8 @@ TConnection* TSocketClient::OnQueryConnection(const char* service,
|
|||||||
if (cur_socket == NULL)
|
if (cur_socket == NULL)
|
||||||
{
|
{
|
||||||
TString strServer = server;
|
TString strServer = server;
|
||||||
|
if (strServer.compare("http://", 7, TRUE) == 0)
|
||||||
|
strServer.ltrim(7);
|
||||||
if (strServer.empty() || stricmp(strServer, "localhost") == 0)
|
if (strServer.empty() || stricmp(strServer, "localhost") == 0)
|
||||||
strServer = "127.0.0.1";
|
strServer = "127.0.0.1";
|
||||||
|
|
||||||
@ -592,3 +592,121 @@ void TSocketClient::ReleaseBuffer()
|
|||||||
m_dwSize = 0;
|
m_dwSize = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL TSocketClient::HttpGetFile(const char* remote, const char* local)
|
||||||
|
{
|
||||||
|
if (!cur_socket->is_open())
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
BOOL ok = FALSE;
|
||||||
|
|
||||||
|
TString buf(4096);
|
||||||
|
buf << "GET " << remote << " HTTP/1.0\r\n\r\n";
|
||||||
|
|
||||||
|
cur_socket->sync();
|
||||||
|
cur_socket->write(buf, buf.len());
|
||||||
|
cur_socket->flush();
|
||||||
|
if (cur_socket->good())
|
||||||
|
{
|
||||||
|
const clock_t start = clock();
|
||||||
|
|
||||||
|
long size = 0;
|
||||||
|
for (int r = 0; !cur_socket->eof(); r++)
|
||||||
|
{
|
||||||
|
cur_socket->getline(buf.get_buffer(), buf.size(), '\n');
|
||||||
|
if (buf.blank())
|
||||||
|
break;
|
||||||
|
if (r == 0 && buf.find("404") > 0)
|
||||||
|
return FALSE; // File not found
|
||||||
|
if (buf.compare("Content-length:", 15, TRUE) == 0)
|
||||||
|
{
|
||||||
|
const int colon = buf.find(':');
|
||||||
|
size = atol(buf.mid(colon+1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ofstream outfile(local, ios::out | ios::binary);
|
||||||
|
if (outfile.good())
|
||||||
|
{
|
||||||
|
TString msg;
|
||||||
|
msg << remote << " - ";
|
||||||
|
if (size > 1024)
|
||||||
|
msg << (size / 1024) << " K";
|
||||||
|
else
|
||||||
|
msg << size << ' ';
|
||||||
|
msg << "bytes.\nTempo residuo stimato: ";
|
||||||
|
TProgind pi(size, msg, TRUE, TRUE);
|
||||||
|
long total = 0;
|
||||||
|
|
||||||
|
while (!cur_socket->eof())
|
||||||
|
{
|
||||||
|
cur_socket->read(buf.get_buffer(), buf.size());
|
||||||
|
const int count = cur_socket->gcount();
|
||||||
|
if (count > 0)
|
||||||
|
{
|
||||||
|
outfile.write(buf, count);
|
||||||
|
|
||||||
|
total += count;
|
||||||
|
bool tick = pi.setstatus(total);
|
||||||
|
if (pi.iscancelled())
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (tick)
|
||||||
|
{
|
||||||
|
const double estimated_ticks = double(size - total) * double(clock() - start) / total;
|
||||||
|
long secs = long(estimated_ticks / CLOCKS_PER_SEC) + 1;
|
||||||
|
CHECK(secs >= 0, "Bad time estimation");
|
||||||
|
const int hours = int(secs / 3600L);
|
||||||
|
secs %= 3600L;
|
||||||
|
const int mins = int(secs / 60L);
|
||||||
|
secs %= 60L;
|
||||||
|
const int append_pos = msg.find("o: ")+3;
|
||||||
|
msg.cut(append_pos);
|
||||||
|
TString16 tempo;
|
||||||
|
tempo.format("%02d:%02d:%02ld", hours, mins, secs);
|
||||||
|
msg << tempo;
|
||||||
|
pi.set_text(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ok = pi.isfinished();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
error_box("Impossibile scrivere il file %s", local);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL TSocketClient::HttpGetDir(const char* remote, TString_array& list)
|
||||||
|
{
|
||||||
|
TFilename local; local.temp();
|
||||||
|
const BOOL ok = HttpGetFile(remote, local);
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
|
ifstream s(local);
|
||||||
|
TString riga(1024);
|
||||||
|
while (!s.eof())
|
||||||
|
{
|
||||||
|
s.getline(riga.get_buffer(), riga.size());
|
||||||
|
const int href = riga.find("HREF=");
|
||||||
|
if (href > 0)
|
||||||
|
{
|
||||||
|
const int start = riga.find('"', href) + 1;
|
||||||
|
if (start > href)
|
||||||
|
{
|
||||||
|
const int stop = riga.find('"', start);
|
||||||
|
if (stop > start)
|
||||||
|
{
|
||||||
|
const TString& name = riga.sub(start, stop);
|
||||||
|
list.add(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s.close();
|
||||||
|
::remove(local);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
@ -53,6 +53,9 @@ public:
|
|||||||
virtual void ReleaseBuffer();
|
virtual void ReleaseBuffer();
|
||||||
virtual BOOL IsOk() const { return TRUE; }
|
virtual BOOL IsOk() const { return TRUE; }
|
||||||
|
|
||||||
|
BOOL HttpGetFile(const char* remote, const char* local);
|
||||||
|
BOOL HttpGetDir(const char* remote, TString_array& list);
|
||||||
|
|
||||||
TSocketClient();
|
TSocketClient();
|
||||||
virtual ~TSocketClient();
|
virtual ~TSocketClient();
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user