X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Furllib.qc;h=1bc06502734f66719fd81fabb14b17bb7bd14b3e;hb=c6c371883dde697e1f237d498c08e09788b6af6b;hp=3d12c20e470a93436bb489c5f97072fe92c47fdf;hpb=3870d3c201dc9e1b27ecf4fd7fa3d8231f5dba44;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/urllib.qc b/qcsrc/common/urllib.qc index 3d12c20e4..1bc065027 100644 --- a/qcsrc/common/urllib.qc +++ b/qcsrc/common/urllib.qc @@ -78,7 +78,7 @@ float url_URI_Get_Callback(float id, float status, string data) } } -void url_fopen(string url, float mode, url_ready_func rdy, entity pass) +void url_single_fopen(string url, float mode, url_ready_func rdy, entity pass) { entity e; float i; @@ -93,13 +93,13 @@ void url_fopen(string url, float mode, url_ready_func rdy, entity pass) // create a writing end that does nothing yet e = spawn(); - e.classname = "url_fopen_file"; + e.classname = "url_single_fopen_file"; e.url_url = strzone(url); e.url_fh = URL_FH_CURL; e.url_wbuf = buf_create(); if(e.url_wbuf < 0) { - print("url_fopen: out of memory in buf_create\n"); + print("url_single_fopen: out of memory in buf_create\n"); rdy(e, pass, URL_READY_ERROR); strunzone(e.url_url); remove(e); @@ -107,6 +107,8 @@ void url_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; @@ -124,7 +126,7 @@ void url_fopen(string url, float mode, url_ready_func rdy, entity pass) break; if(i >= autocvar__urllib_nextslot) { - print("url_fopen: too many concurrent requests\n"); + print("url_single_fopen: too many concurrent requests\n"); rdy(world, pass, URL_READY_ERROR); return; } @@ -133,7 +135,7 @@ void url_fopen(string url, float mode, url_ready_func rdy, entity pass) // GET the data if(!crypto_uri_postbuf(url, i + MIN_URL_ID, string_null, string_null, -1, 0)) { - print("url_fopen: failure in crypto_uri_postbuf\n"); + print("url_single_fopen: failure in crypto_uri_postbuf\n"); rdy(world, pass, URL_READY_ERROR); return; } @@ -142,7 +144,7 @@ void url_fopen(string url, float mode, url_ready_func rdy, entity pass) // all). Wait for data to come from the // server, then call the callback e = spawn(); - e.classname = "url_fopen_file"; + e.classname = "url_single_fopen_file"; e.url_url = strzone(url); e.url_fh = URL_FH_CURL; e.url_rbuf = -1; @@ -164,12 +166,14 @@ void url_fopen(string url, float mode, url_ready_func rdy, entity pass) case FILE_WRITE: case FILE_APPEND: e = spawn(); - e.classname = "url_fopen_stdout"; + 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: - print("url_fopen: cannot open '-' for reading\n"); + print("url_single_fopen: cannot open '-' for reading\n"); rdy(world, pass, URL_READY_ERROR); break; } @@ -186,8 +190,10 @@ void url_fopen(string url, float mode, url_ready_func rdy, entity pass) else { e = spawn(); - e.classname = "url_fopen_file"; + 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,7 +203,7 @@ void url_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; @@ -224,7 +230,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 +242,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,8 +254,6 @@ 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; @@ -259,7 +263,7 @@ void url_fclose(entity e, url_ready_func rdy, entity pass) 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 +271,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,8 +335,16 @@ 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) { + 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.cnt += 1; n = tokenize_console(me.url_url); if(n <= me.cnt) @@ -342,7 +354,7 @@ void url_multi_ready(entity fh, entity me, float status) remove(me); return; } - url_fopen(argv(me.cnt), me.lip, url_multi_ready, me); + url_single_fopen(argv(me.cnt), me.lip, url_multi_ready, me); return; } me.url_ready(fh, me.url_ready_pass, status); @@ -366,5 +378,5 @@ void url_multi_fopen(string url, float mode, url_ready_func rdy, entity pass) me.lip = mode; me.url_ready = rdy; me.url_ready_pass = pass; - url_fopen(argv(0), mode, url_multi_ready, me); + url_single_fopen(argv(0), mode, url_multi_ready, me); }