+#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;
.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;
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;
}
}
}
-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)
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;
}
}
// close a file
void url_fclose(entity e)
{
- float i;
+ int i;
if(e.url_fh == URL_FH_CURL)
{
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
{
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);
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);