X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Furllib.qc;h=2ad7bda2464b6842daa52fb70b2889c1835ab02c;hb=5d24750ce0e47b80c4ad26a9fa8a5a1020d969d2;hp=9648b2080f5abb0cae734a96d3a220dcd93ae5c2;hpb=c89dfaa4d0342b98c320621557973a65114fbdf4;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/urllib.qc b/qcsrc/lib/urllib.qc index 9648b2080..2ad7bda24 100644 --- a/qcsrc/lib/urllib.qc +++ b/qcsrc/lib/urllib.qc @@ -7,6 +7,8 @@ const float URL_FH_STDOUT = -2; // URLs .string url_url; +.string url_content_type; +.string url_verb; .float url_wbuf; .float url_wbufpos; .float url_rbuf; @@ -22,20 +24,18 @@ const float URL_FH_STDOUT = -2; entity url_fromid[NUM_URL_ID]; int autocvar__urllib_nextslot; +ERASEABLE float url_URI_Get_Callback(int id, float status, string data) { - if(id < MIN_URL_ID) - return 0; + if (id < MIN_URL_ID) return 0; id -= MIN_URL_ID; - if(id >= NUM_URL_ID) - return 0; + if (id >= NUM_URL_ID) return 0; entity e; e = url_fromid[id]; - if(!e) - return 0; - if(e.url_rbuf >= 0 || e.url_wbuf >= 0) + if (!e) return 0; + if (e.url_rbuf >= 0 || e.url_wbuf >= 0) { - LOG_INFOF("WARNING: handle %d (%s) has already received data?!?\n", id + NUM_URL_ID, e.url_url); + LOG_INFOF("WARNING: handle %d (%s) has already received data?!?", id + NUM_URL_ID, e.url_url); return 0; } @@ -43,33 +43,32 @@ float url_URI_Get_Callback(int id, float status, string data) url_fromid[id] = NULL; // if we get here, we MUST have both buffers cleared - if(e.url_rbuf != -1 || e.url_wbuf != -1 || e.url_fh != URL_FH_CURL) - error("url_URI_Get_Callback: not a request waiting for data"); + if (e.url_rbuf != -1 || e.url_wbuf != -1 || e.url_fh != URL_FH_CURL) error("url_URI_Get_Callback: not a request waiting for data"); - if(status == 0) + if (status == 0) { // WE GOT DATA! float n, i; n = tokenizebyseparator(data, "\n"); e.url_rbuf = buf_create(); - if(e.url_rbuf < 0) + if (e.url_rbuf < 0) { - LOG_INFO("url_URI_Get_Callback: out of memory in buf_create\n"); + LOG_INFO("url_URI_Get_Callback: out of memory in buf_create"); e.url_ready(e, e.url_ready_pass, URL_READY_ERROR); - strunzone(e.url_url); - remove(e); + strfree(e.url_url); + delete(e); return 1; } e.url_rbufpos = 0; - if(e.url_rbuf < 0) + if (e.url_rbuf < 0) { - LOG_INFO("url_URI_Get_Callback: out of memory in buf_create\n"); + LOG_INFO("url_URI_Get_Callback: out of memory in buf_create"); e.url_ready(e, e.url_ready_pass, URL_READY_ERROR); - strunzone(e.url_url); - remove(e); + strfree(e.url_url); + delete(e); return 1; } - for(i = 0; i < n; ++i) + for (i = 0; i < n; ++i) bufstr_set(e.url_rbuf, i, argv(i)); e.url_ready(e, e.url_ready_pass, URL_READY_CANREAD); return 1; @@ -78,19 +77,20 @@ float url_URI_Get_Callback(int id, float status, string data) { // an ERROR e.url_ready(e, e.url_ready_pass, -fabs(status)); - strunzone(e.url_url); - remove(e); + strfree(e.url_url); + delete(e); return 1; } } +ERASEABLE void url_single_fopen(string url, int mode, url_ready_func rdy, entity pass) { entity e; int i; - if(strstrofs(url, "://", 0) >= 0) + if (strstrofs(url, "://", 0) >= 0) { - switch(mode) + switch (mode) { case FILE_WRITE: case FILE_APPEND: @@ -98,17 +98,18 @@ void url_single_fopen(string url, int mode, url_ready_func rdy, entity pass) // attempts to close will result in a reading handle // create a writing end that does nothing yet - e = spawn(); - e.classname = "url_single_fopen_file"; + e = new_pure(url_single_fopen_file); e.url_url = strzone(url); + e.url_content_type = "text/plain"; + e.url_verb = ""; e.url_fh = URL_FH_CURL; e.url_wbuf = buf_create(); - if(e.url_wbuf < 0) + if (e.url_wbuf < 0) { - LOG_INFO("url_single_fopen: out of memory in buf_create\n"); + LOG_INFO("url_single_fopen: out of memory in buf_create"); rdy(e, pass, URL_READY_ERROR); - strunzone(e.url_url); - remove(e); + strfree(e.url_url); + delete(e); return; } e.url_wbufpos = 0; @@ -122,26 +123,24 @@ void url_single_fopen(string url, int mode, url_ready_func rdy, entity pass) // read data only // get slot for HTTP request - for(i = autocvar__urllib_nextslot; i < NUM_URL_ID; ++i) - if(url_fromid[i] == NULL) - break; - if(i >= NUM_URL_ID) + for (i = autocvar__urllib_nextslot; i < NUM_URL_ID; ++i) + if (url_fromid[i] == NULL) break; + if (i >= NUM_URL_ID) { - for(i = 0; i < autocvar__urllib_nextslot; ++i) - if(url_fromid[i] == NULL) - break; - if(i >= autocvar__urllib_nextslot) + for (i = 0; i < autocvar__urllib_nextslot; ++i) + if (url_fromid[i] == NULL) break; + if (i >= autocvar__urllib_nextslot) { - LOG_INFO("url_single_fopen: too many concurrent requests\n"); + LOG_INFO("url_single_fopen: too many concurrent requests"); rdy(NULL, pass, URL_READY_ERROR); return; } } // GET the data - if(!crypto_uri_postbuf(url, i + MIN_URL_ID, string_null, string_null, -1, 0)) + if (!crypto_uri_postbuf(url, i + MIN_URL_ID, string_null, string_null, -1, 0)) { - LOG_INFO("url_single_fopen: failure in crypto_uri_postbuf\n"); + LOG_INFO("url_single_fopen: failure in crypto_uri_postbuf"); rdy(NULL, pass, URL_READY_ERROR); return; } @@ -149,8 +148,7 @@ void url_single_fopen(string url, int mode, url_ready_func rdy, entity pass) // Make a dummy handle object (no buffers at // all). Wait for data to come from the // server, then call the callback - e = spawn(); - e.classname = "url_single_fopen_file"; + e = new_pure(url_single_fopen_file); e.url_url = strzone(url); e.url_fh = URL_FH_CURL; e.url_rbuf = -1; @@ -165,21 +163,20 @@ void url_single_fopen(string url, int mode, url_ready_func rdy, entity pass) break; } } - else if(url == "-") + else if (url == "-") { - switch(mode) + switch (mode) { case FILE_WRITE: case FILE_APPEND: - e = spawn(); - e.classname = "url_single_fopen_stdout"; + e = new_pure(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: - LOG_INFO("url_single_fopen: cannot open '-' for reading\n"); + LOG_INFO("url_single_fopen: cannot open '-' for reading"); rdy(NULL, pass, URL_READY_ERROR); break; } @@ -188,70 +185,66 @@ void url_single_fopen(string url, int mode, url_ready_func rdy, entity pass) { float fh; fh = fopen(url, mode); - if(fh < 0) + if (fh < 0) { rdy(NULL, pass, URL_READY_ERROR); return; } else { - e = spawn(); - e.classname = "url_single_fopen_file"; + e = new_pure(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 - rdy(e, pass, URL_READY_CANWRITE); + if (mode == FILE_READ) rdy(e, pass, URL_READY_CANREAD); + else rdy(e, pass, URL_READY_CANWRITE); } } } // close a file +ERASEABLE void url_fclose(entity e) { int i; - if(e.url_fh == URL_FH_CURL) + if (e.url_fh == URL_FH_CURL) { - if(e.url_rbuf == -1 || e.url_wbuf != -1) // not(post GET/POST request) - if(e.url_rbuf != -1 || e.url_wbuf == -1) // not(pre POST request) - error("url_fclose: not closable in current state"); + if (e.url_rbuf == -1 || e.url_wbuf != -1) // not(post GET/POST request) + if (e.url_rbuf != -1 || e.url_wbuf == -1) // not(pre POST request) + error("url_fclose: not closable in current state"); // closing an URL! - if(e.url_wbuf >= 0) + if (e.url_wbuf >= 0) { // we are closing the write end (HTTP POST request) // get slot for HTTP request - for(i = autocvar__urllib_nextslot; i < NUM_URL_ID; ++i) - if(url_fromid[i] == NULL) - break; - if(i >= NUM_URL_ID) + for (i = autocvar__urllib_nextslot; i < NUM_URL_ID; ++i) + if (url_fromid[i] == NULL) break; + if (i >= NUM_URL_ID) { - for(i = 0; i < autocvar__urllib_nextslot; ++i) - if(url_fromid[i] == NULL) - break; - if(i >= autocvar__urllib_nextslot) + for (i = 0; i < autocvar__urllib_nextslot; ++i) + if (url_fromid[i] == NULL) break; + if (i >= autocvar__urllib_nextslot) { - LOG_INFO("url_fclose: too many concurrent requests\n"); - e.url_ready(e,e.url_ready_pass, URL_READY_ERROR); + LOG_INFO("url_fclose: too many concurrent requests"); + e.url_ready(e, e.url_ready_pass, URL_READY_ERROR); buf_del(e.url_wbuf); - strunzone(e.url_url); - remove(e); + strfree(e.url_url); + delete(e); return; } } // POST the data - if(!crypto_uri_postbuf(e.url_url, i + MIN_URL_ID, "text/plain", "", e.url_wbuf, 0)) + if (!crypto_uri_postbuf(e.url_url, i + MIN_URL_ID, e.url_content_type, e.url_verb, e.url_wbuf, 0)) { - LOG_INFO("url_fclose: failure in crypto_uri_postbuf\n"); + LOG_INFO("url_fclose: failure in crypto_uri_postbuf"); e.url_ready(e, e.url_ready_pass, URL_READY_ERROR); buf_del(e.url_wbuf); - strunzone(e.url_url); - remove(e); + strfree(e.url_url); + delete(e); return; } @@ -271,38 +264,38 @@ void url_fclose(entity e) // we have READ all data, just close e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED); buf_del(e.url_rbuf); - strunzone(e.url_url); - remove(e); + strfree(e.url_url); + delete(e); } } - else if(e.url_fh == URL_FH_STDOUT) + else if (e.url_fh == URL_FH_STDOUT) { - e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED); // closing creates no reading handle - remove(e); + e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED); // closing creates no reading handle + delete(e); } else { // file fclose(e.url_fh); - e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED); // closing creates no reading handle - remove(e); + e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED); // closing creates no reading handle + delete(e); } } // with \n (blame FRIK_FILE) +ERASEABLE string url_fgets(entity e) { - if(e.url_fh == URL_FH_CURL) + if (e.url_fh == URL_FH_CURL) { - if(e.url_rbuf == -1) - error("url_fgets: not readable in current state"); + if (e.url_rbuf == -1) error("url_fgets: not readable in current state"); // curl string s; s = bufstr_get(e.url_rbuf, e.url_rbufpos); e.url_rbufpos += 1; return s; } - else if(e.url_fh == URL_FH_STDOUT) + else if (e.url_fh == URL_FH_STDOUT) { // stdout return string_null; @@ -315,20 +308,20 @@ string url_fgets(entity e) } // without \n (blame FRIK_FILE) +ERASEABLE void url_fputs(entity e, string s) { - if(e.url_fh == URL_FH_CURL) + if (e.url_fh == URL_FH_CURL) { - if(e.url_wbuf == -1) - error("url_fputs: not writable in current state"); + if (e.url_wbuf == -1) error("url_fputs: not writable in current state"); // curl bufstr_set(e.url_wbuf, e.url_wbufpos, s); e.url_wbufpos += 1; } - else if(e.url_fh == URL_FH_STDOUT) + else if (e.url_fh == URL_FH_STDOUT) { // stdout - LOG_INFO(s); + print(s); } else { @@ -338,26 +331,27 @@ void url_fputs(entity e, string s) } // multi URL object, tries URLs separated by space in sequence +ERASEABLE void url_multi_ready(entity fh, entity me, float status) { float n; - if(status == URL_READY_ERROR || status < 0) + if (status == URL_READY_ERROR || status < 0) { - if(status == -422) // Unprocessable Entity + if (status == -422) // Unprocessable Entity { - LOG_INFO("uri_multi_ready: got HTTP error 422, data is in unusable format - not continuing\n"); + LOG_INFO("uri_multi_ready: got HTTP error 422, data is in unusable format - not continuing"); me.url_ready(fh, me.url_ready_pass, status); - strunzone(me.url_url); - remove(me); + strfree(me.url_url); + delete(me); return; } me.url_attempt += 1; n = tokenize_console(me.url_url); - if(n <= me.url_attempt) + if (n <= me.url_attempt) { me.url_ready(fh, me.url_ready_pass, status); - strunzone(me.url_url); - remove(me); + strfree(me.url_url); + delete(me); return; } url_single_fopen(argv(me.url_attempt), me.url_mode, url_multi_ready, me); @@ -365,20 +359,20 @@ void url_multi_ready(entity fh, entity me, float status) } me.url_ready(fh, me.url_ready_pass, status); } + +ERASEABLE void url_multi_fopen(string url, int mode, url_ready_func rdy, entity pass) { float n; n = tokenize_console(url); - if(n <= 0) + if (n <= 0) { - LOG_INFO("url_multi_fopen: need at least one URL\n"); + LOG_INFO("url_multi_fopen: need at least one URL"); rdy(NULL, pass, URL_READY_ERROR); return; } - entity me; - me = spawn(); - me.classname = "url_multi"; + entity me = new_pure(url_multi); me.url_url = strzone(url); me.url_attempt = 0; me.url_mode = mode;