X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Furllib.qc;h=8529ebd6dd52f38bab8fef47ecd3b6fc48b72070;hb=153e558088db2813f7f7dd5367244b5470f4d425;hp=5c585ae593f8f4cee007b1d8b9edcbfa94498b43;hpb=0721159b52f6a2cfeff7c7df87349b80b74401df;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/urllib.qc b/qcsrc/common/urllib.qc index 5c585ae59..8529ebd6d 100644 --- a/qcsrc/common/urllib.qc +++ b/qcsrc/common/urllib.qc @@ -1,7 +1,21 @@ +#if defined(CSQC) + #include "../dpdefs/csprogsdefs.qh" + #include "constants.qh" + #include "util.qh" + #include "urllib.qh" +#elif defined(MENUQC) +#elif defined(SVQC) + #include "../dpdefs/progsdefs.qh" + #include "../dpdefs/dpextensions.qh" + #include "constants.qh" + #include "util.qh" + #include "urllib.qh" +#endif + // files .float url_fh; -#define URL_FH_CURL -1 -#define URL_FH_STDOUT -2 +const float URL_FH_CURL = -1; +const float URL_FH_STDOUT = -2; // URLs .string url_url; @@ -13,10 +27,14 @@ .url_ready_func url_ready; .entity url_ready_pass; +// for multi handles +.int url_attempt; +.int url_mode; + entity url_fromid[NUM_URL_ID]; -float autocvar__urllib_nextslot; +int autocvar__urllib_nextslot; -float url_URI_Get_Callback(float id, float status, string data) +float url_URI_Get_Callback(int id, float status, string data) { if(id < MIN_URL_ID) return 0; @@ -29,7 +47,7 @@ float url_URI_Get_Callback(float id, float status, string data) return 0; if(e.url_rbuf >= 0 || e.url_wbuf >= 0) { - print(sprintf("WARNING: handle %d (%s) has already received data?!?\n", id + NUM_URL_ID, e.url_url)); + printf("WARNING: handle %d (%s) has already received data?!?\n", id + NUM_URL_ID, e.url_url); return 0; } @@ -78,10 +96,10 @@ float url_URI_Get_Callback(float id, float status, string data) } } -void url_single_fopen(string url, float mode, url_ready_func rdy, entity pass) +void url_single_fopen(string url, int mode, url_ready_func rdy, entity pass) { entity e; - float i; + int i; if(strstrofs(url, "://", 0) >= 0) { switch(mode) @@ -107,6 +125,8 @@ void url_single_fopen(string url, float mode, url_ready_func rdy, entity pass) } e.url_wbufpos = 0; e.url_rbuf = -1; + e.url_ready = rdy; + e.url_ready_pass = pass; rdy(e, pass, URL_READY_CANWRITE); break; @@ -153,7 +173,7 @@ void url_single_fopen(string url, float mode, url_ready_func rdy, entity pass) url_fromid[i] = e; // make sure this slot won't be reused quickly even on map change - cvar_set("_urllib_nextslot", ftos(mod(i + 1, NUM_URL_ID))); + cvar_set("_urllib_nextslot", ftos((i + 1) % NUM_URL_ID)); break; } } @@ -166,6 +186,8 @@ void url_single_fopen(string url, float mode, url_ready_func rdy, entity pass) e = spawn(); e.classname = "url_single_fopen_stdout"; e.url_fh = URL_FH_STDOUT; + e.url_ready = rdy; + e.url_ready_pass = pass; rdy(e, pass, URL_READY_CANWRITE); break; case FILE_READ: @@ -188,6 +210,8 @@ void url_single_fopen(string url, float mode, url_ready_func rdy, entity pass) e = spawn(); e.classname = "url_single_fopen_file"; e.url_fh = fh; + e.url_ready = rdy; + e.url_ready_pass = pass; if(mode == FILE_READ) rdy(e, pass, URL_READY_CANREAD); else @@ -197,9 +221,9 @@ void url_single_fopen(string url, float mode, url_ready_func rdy, entity pass) } // close a file -void url_fclose(entity e, url_ready_func rdy, entity pass) +void url_fclose(entity e) { - float i; + int i; if(e.url_fh == URL_FH_CURL) { @@ -224,7 +248,7 @@ void url_fclose(entity e, url_ready_func rdy, entity pass) if(i >= autocvar__urllib_nextslot) { print("url_fclose: too many concurrent requests\n"); - rdy(e, pass, URL_READY_ERROR); + e.url_ready(e,e.url_ready_pass, URL_READY_ERROR); buf_del(e.url_wbuf); strunzone(e.url_url); remove(e); @@ -236,7 +260,7 @@ void url_fclose(entity e, url_ready_func rdy, entity pass) if(!crypto_uri_postbuf(e.url_url, i + MIN_URL_ID, "text/plain", "", e.url_wbuf, 0)) { print("url_fclose: failure in crypto_uri_postbuf\n"); - rdy(e, pass, URL_READY_ERROR); + e.url_ready(e, e.url_ready_pass, URL_READY_ERROR); buf_del(e.url_wbuf); strunzone(e.url_url); remove(e); @@ -248,18 +272,16 @@ void url_fclose(entity e, url_ready_func rdy, entity pass) // call the callback buf_del(e.url_wbuf); e.url_wbuf = -1; - e.url_ready = rdy; - e.url_ready_pass = pass; e.url_id = i; url_fromid[i] = e; // make sure this slot won't be reused quickly even on map change - cvar_set("_urllib_nextslot", ftos(mod(i + 1, NUM_URL_ID))); + cvar_set("_urllib_nextslot", ftos((i + 1) % NUM_URL_ID)); } else { // we have READ all data, just close - rdy(e, pass, URL_READY_CLOSED); + e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED); buf_del(e.url_rbuf); strunzone(e.url_url); remove(e); @@ -267,14 +289,14 @@ void url_fclose(entity e, url_ready_func rdy, entity pass) } else if(e.url_fh == URL_FH_STDOUT) { - rdy(e, pass, URL_READY_CLOSED); // closing creates no reading handle + e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED); // closing creates no reading handle remove(e); } else { // file fclose(e.url_fh); - rdy(e, pass, URL_READY_CLOSED); // closing creates no reading handle + e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED); // closing creates no reading handle remove(e); } } @@ -331,23 +353,31 @@ void url_fputs(entity e, string s) void url_multi_ready(entity fh, entity me, float status) { float n; - if(status == URL_READY_ERROR) + if(status == URL_READY_ERROR || status < 0) { - me.cnt += 1; + if(status == -422) // Unprocessable Entity + { + print("uri_multi_ready: got HTTP error 422, data is in unusable format - not continuing\n"); + me.url_ready(fh, me.url_ready_pass, status); + strunzone(me.url_url); + remove(me); + return; + } + me.url_attempt += 1; n = tokenize_console(me.url_url); - if(n <= me.cnt) + if(n <= me.url_attempt) { me.url_ready(fh, me.url_ready_pass, status); strunzone(me.url_url); remove(me); return; } - url_single_fopen(argv(me.cnt), me.lip, url_multi_ready, me); + url_single_fopen(argv(me.url_attempt), me.url_mode, url_multi_ready, me); return; } me.url_ready(fh, me.url_ready_pass, status); } -void url_multi_fopen(string url, float mode, url_ready_func rdy, entity pass) +void url_multi_fopen(string url, int mode, url_ready_func rdy, entity pass) { float n; n = tokenize_console(url); @@ -362,8 +392,8 @@ void url_multi_fopen(string url, float mode, url_ready_func rdy, entity pass) me = spawn(); me.classname = "url_multi"; me.url_url = strzone(url); - me.cnt = 0; - me.lip = mode; + me.url_attempt = 0; + me.url_mode = mode; me.url_ready = rdy; me.url_ready_pass = pass; url_single_fopen(argv(0), mode, url_multi_ready, me);