// // http.cpp // Player Javascript // // Created by Anthony Liot on 23/11/12. // #include "http.h" #include #include #include int http::uid = 0; /* - Useful for download an url on other domain */ // http://..../download.php?url= std::string http::cross_domain = ""; //---------------------------------------------------------------------------------------- // HTTP CLASS //---------------------------------------------------------------------------------------- void http::onLoaded(void* parent, const char * file) { http* req = reinterpret_cast(parent); req->onLoaded(file); } void http::onError(void* parent, int statuserror) { http* req = reinterpret_cast(parent); req->onError(statuserror); } void http::onProgress(void* parent, int progress) { http* req = reinterpret_cast(parent); req->onProgress(progress); } /** * Constructeur */ http::http(const char* hostname, int requestType, const char* targetFilename) : _hostname(hostname), _page(""), _targetFileName(targetFilename), _param(""), _content(""), _error(""), _request((RequestType)requestType), _status(ST_PENDING), _assync(ASSYNC_THREAD) { _progressValue = -1; _uid = uid++; } /** * Destructeur */ http::~http() { } /** * Effectue la requete */ void http::runRequest(const char* page, int assync) { _page = page; _status = ST_PENDING; _assync = (AssyncMode)assync; _progressValue = 0; std::string url = cross_domain; url += _hostname + _page; if (_hostname.size() > 0 && _page.size() > 0) { printf("URL : %s\n",url.c_str()); printf("REQUEST : %s\n",(_request==REQUEST_GET) ? "GET":"POST"); printf("PARAMS : %s\n",_param.c_str()); if (_targetFileName.size() == 0 ) { _targetFileName = format("prepare%d",_uid); } emscripten_async_wget2(url.c_str(), _targetFileName.c_str(), (_request==REQUEST_GET) ? "GET":"POST", _param.c_str(), this, http::onLoaded, http::onError, http::onProgress); } else { _error = format("malformed url : %s\n",url.c_str()); _content = ""; _status = ST_FAILED; _progressValue = -1; } } /** * Accede a la reponse */ const char* http::getContent() { return _content.c_str(); } /** * Accede a l'erreur */ const char* http::getError() { return _error.c_str(); } /** * Accede au status */ int http::getStatus() { return _status; } /** * Accede a la progression between 0 & 100 */ float http::getProgress() { return (float)_progressValue; } /** * Accede a la progression between 0 & 100 */ int http::getId() { return _uid; } /** * Post */ void http::addValue(const char* key, const char* value) { if (_param.size() > 0) { _param += "&"; _param += key; _param += "="; _param += value; } else { _param += key; _param += "="; _param += value; } } void http::onProgress(int progress) { _progressValue = progress; } void http::onLoaded(const char* file) { if (strstr(file,"prepare")) { FILE* f = fopen(file,"rb"); if (f) { fseek (f, 0, SEEK_END); int size=ftell (f); fseek (f, 0, SEEK_SET); char* data = new char[size]; fread(data,size,1,f); _content = data; delete data; fclose(f); } else { _content = file; } } else { _content = file; } _progressValue = 100; _status = ST_OK; } void http::onError(int error) { printf("Error status : %d\n",error); _error = ""; _content = ""; _status = ST_FAILED; _progressValue = -1; } /// TEST int num_request = 0; float time_elapsed = 0.0f; void wait_https() { if (num_request == 0) { printf("End of all download ... %fs\n",(emscripten_get_now() - time_elapsed) / 1000.f); emscripten_cancel_main_loop(); int result = 0; REPORT_RESULT(); } } void wait_http(void* request) { http* req = reinterpret_cast(request); if (req != 0) { if (req->getStatus() == http::ST_PENDING) { if ((int)req->getProgress()>0) { printf("Progress Request n°%d : %d\n",req->getId(),(int)req->getProgress()); } emscripten_async_call(wait_http,request,500); } else { if (req->getStatus() == http::ST_OK) { printf("Success Request n°%d : %s\n",req->getId(),req->getContent()); } else { printf("Error Request n°%d : %s\n",req->getId(), req->getError()); } num_request --; } } else { num_request --; } } int main() { time_elapsed = emscripten_get_now(); http* http1 = new http("https://github.com",http::REQUEST_GET,"emscripten_master.zip"); http1->runRequest("/kripken/emscripten/archive/master.zip",http::ASSYNC_THREAD); http* http2 = new http("https://github.com",http::REQUEST_GET,"wolfviking_master.zip"); http2->runRequest("/wolfviking0/image.js/archive/master.zip",http::ASSYNC_THREAD); http* http3 = new http("https://raw.github.com",http::REQUEST_GET); http3->runRequest("/kripken/emscripten/master/LICENSE",http::ASSYNC_THREAD); num_request ++; emscripten_async_call(wait_http,http1,500); num_request ++; emscripten_async_call(wait_http,http2,500); num_request ++; emscripten_async_call(wait_http,http3,500); /* Http* http4 = new Http("http://www.---.com",Http::REQUEST_POST); http4->addValue("app","123"); http4->runRequest("/test.php",Http::ASSYNC_THREAD); num_request ++; emscripten_async_call(wait_http,http4,500); */ emscripten_set_main_loop(wait_https, 0, 0); }