Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
urllib.qh File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define MIN_URL_ID   URI_GET_URLLIB
#define NUM_URL_ID   (URI_GET_URLLIB_END - URI_GET_URLLIB + 1)

Typedefs

using url_ready_func = void (entity handle, entity pass, float status)

Functions

ERASEABLE void url_fclose (entity e)
ERASEABLE string url_fgets (entity e)
ERASEABLE void url_fputs (entity e, string s)
ERASEABLE void url_multi_fopen (string url, float mode, url_ready_func rdy, entity pass)
ERASEABLE void url_single_fopen (string url, float mode, url_ready_func rdy, entity pass)
ERASEABLE float url_URI_Get_Callback (int id, float status, string data)

Variables

const int URI_GET_CURL = 17
const int URI_GET_CURL_END = 32
const int URI_GET_DISCARD = 0
const int URI_GET_IPBAN = 1
const int URI_GET_IPBAN_END = 16
const int URI_GET_TOS = 34
const int URI_GET_UPDATENOTIFICATION = 33
const int URI_GET_URLLIB = 128
const int URI_GET_URLLIB_END = 191
const float URL_READY_CANREAD = 2
const float URL_READY_CANWRITE = 1
const float URL_READY_CLOSED = 0
const float URL_READY_ERROR = -1

Macro Definition Documentation

◆ MIN_URL_ID

#define MIN_URL_ID   URI_GET_URLLIB

Definition at line 33 of file urllib.qh.

Referenced by url_fclose(), url_single_fopen(), and url_URI_Get_Callback().

◆ NUM_URL_ID

#define NUM_URL_ID   (URI_GET_URLLIB_END - URI_GET_URLLIB + 1)

Definition at line 34 of file urllib.qh.

Referenced by url_fclose(), url_single_fopen(), and url_URI_Get_Callback().

Typedef Documentation

◆ url_ready_func

using url_ready_func = void (entity handle, entity pass, float status)

Definition at line 19 of file urllib.qh.

Function Documentation

◆ url_fclose()

ERASEABLE void url_fclose ( entity e)

Definition at line 205 of file urllib.qc.

206{
207 int i;
208
209 if (e.url_fh == URL_FH_CURL)
210 {
211 if (e.url_rbuf == -1 || e.url_wbuf != -1) // not(post GET/POST request)
212 if (e.url_rbuf != -1 || e.url_wbuf == -1) // not(pre POST request)
213 error("url_fclose: not closable in current state");
214
215 // closing an URL!
216 if (e.url_wbuf >= 0)
217 {
218 // we are closing the write end (HTTP POST request)
219
220 // get slot for HTTP request
221 for (i = autocvar__urllib_nextslot; i < NUM_URL_ID; ++i)
222 if (url_fromid[i] == NULL) break;
223 if (i >= NUM_URL_ID)
224 {
225 for (i = 0; i < autocvar__urllib_nextslot; ++i)
226 if (url_fromid[i] == NULL) break;
228 {
229 LOG_INFO("url_fclose: too many concurrent requests");
230 e.url_ready(e, e.url_ready_pass, URL_READY_ERROR);
231 buf_del(e.url_wbuf);
232 strfree(e.url_url);
233 delete(e);
234 return;
235 }
236 }
237
238 // POST the data
239 if (!crypto_uri_postbuf(e.url_url, i + MIN_URL_ID, e.url_content_type, e.url_verb, e.url_wbuf, 0))
240 {
241 LOG_INFO("url_fclose: failure in crypto_uri_postbuf");
242 e.url_ready(e, e.url_ready_pass, URL_READY_ERROR);
243 buf_del(e.url_wbuf);
244 strfree(e.url_url);
245 delete(e);
246 return;
247 }
248
249 // delete write end. File handle is now in unusable
250 // state. Wait for data to come from the server, then
251 // call the callback
252 buf_del(e.url_wbuf);
253 e.url_wbuf = -1;
254 e.url_id = i;
255 url_fromid[i] = e;
256
257 // make sure this slot won't be reused quickly even on map change
258 cvar_set("_urllib_nextslot", ftos((i + 1) % NUM_URL_ID));
259 }
260 else
261 {
262 // we have READ all data, just close
263 e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED);
264 buf_del(e.url_rbuf);
265 strfree(e.url_url);
266 delete(e);
267 }
268 }
269 else if (e.url_fh == URL_FH_STDOUT)
270 {
271 e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED); // closing creates no reading handle
272 delete(e);
273 }
274 else
275 {
276 // file
277 fclose(e.url_fh);
278 e.url_ready(e, e.url_ready_pass, URL_READY_CLOSED); // closing creates no reading handle
279 delete(e);
280 }
281}
#define LOG_INFO(...)
Definition log.qh:65
void cvar_set(string name, string value)
void fclose(float fhandle)
string ftos(float f)
#define NULL
Definition post.qh:14
#define error
Definition pre.qh:6
#define strfree(this)
Definition string.qh:59
int autocvar__urllib_nextslot
Definition urllib.qc:25
const float URL_FH_CURL
Definition urllib.qc:5
entity url_fromid[NUM_URL_ID]
Definition urllib.qc:24
const float URL_FH_STDOUT
Definition urllib.qc:6
const float URL_READY_CLOSED
Definition urllib.qh:15
const float URL_READY_ERROR
Definition urllib.qh:14
#define MIN_URL_ID
Definition urllib.qh:33
#define NUM_URL_ID
Definition urllib.qh:34

References autocvar__urllib_nextslot, cvar_set(), entity(), error, fclose(), ftos(), LOG_INFO, MIN_URL_ID, NULL, NUM_URL_ID, strfree, URL_FH_CURL, URL_FH_STDOUT, url_fromid, URL_READY_CLOSED, and URL_READY_ERROR.

Referenced by AdditionalServerInfo_OnGet(), MX_JLF_(), MX_Messages_(), MX_Nick_(), MX_Say_(), MX_Sync_(), MX_Typing_(), PlayerStats_GameReport_Handler(), PlayerStats_PlayerBasic_Handler(), PlayerStats_PlayerDetail_Handler(), WeaponStats_ready(), and XonoticToS_OnGet().

◆ url_fgets()

ERASEABLE string url_fgets ( entity e)

Definition at line 285 of file urllib.qc.

286{
287 if (e.url_fh == URL_FH_CURL)
288 {
289 if (e.url_rbuf == -1) error("url_fgets: not readable in current state");
290 // curl
291 string s = bufstr_get(e.url_rbuf, e.url_rbufpos);
292 ++e.url_rbufpos;
293 return s;
294 }
295 else if (e.url_fh == URL_FH_STDOUT)
296 {
297 // stdout
298 return string_null;
299 }
300 else
301 {
302 // file
303 return fgets(e.url_fh);
304 }
305}
string fgets(float fhandle)
string string_null
Definition nil.qh:9

References entity(), error, fgets(), string_null, URL_FH_CURL, and URL_FH_STDOUT.

Referenced by AdditionalServerInfo_OnGet(), MX_Messages_(), MX_Sync_(), PlayerStats_GameReport_Handler(), PlayerStats_PlayerBasic_Handler(), PlayerStats_PlayerDetail_Handler(), WeaponStats_ready(), and XonoticToS_OnGet().

◆ url_fputs()

ERASEABLE void url_fputs ( entity e,
string s )

Definition at line 309 of file urllib.qc.

310{
311 if (e.url_fh == URL_FH_CURL)
312 {
313 if (e.url_wbuf == -1) error("url_fputs: not writable in current state");
314 // curl
315 bufstr_set(e.url_wbuf, e.url_wbufpos, s);
316 ++e.url_wbufpos;
317 }
318 else if (e.url_fh == URL_FH_STDOUT)
319 {
320 // stdout
321 print(s);
322 }
323 else
324 {
325 // file
326 fputs(e.url_fh, s);
327 }
328}
void fputs(float fhandle, string s)
void print(string text,...)

References entity(), error, fputs(), print(), URL_FH_CURL, and URL_FH_STDOUT.

Referenced by MX_JLF_(), MX_Nick_(), MX_Say_(), MX_Typing_(), PlayerStats_GameReport_Handler(), PlayerStats_PlayerBasic_Handler(), PlayerStats_PlayerDetail_Handler(), and WeaponStats_ready().

◆ url_multi_fopen()

ERASEABLE void url_multi_fopen ( string url,
float mode,
url_ready_func rdy,
entity pass )

References entity(), and pass.

◆ url_single_fopen()

ERASEABLE void url_single_fopen ( string url,
float mode,
url_ready_func rdy,
entity pass )

References entity(), ERASEABLE, and pass.

◆ url_URI_Get_Callback()

ERASEABLE float url_URI_Get_Callback ( int id,
float status,
string data )

Definition at line 28 of file urllib.qc.

29{
30 if (id < MIN_URL_ID) return 0;
31 id -= MIN_URL_ID;
32 if (id >= NUM_URL_ID) return 0;
33 entity e = url_fromid[id];
34 if (!e) return 0;
35 if (e.url_rbuf >= 0 || e.url_wbuf >= 0)
36 {
37 LOG_INFOF("WARNING: handle %d (%s) has already received data?!?", id + NUM_URL_ID, e.url_url);
38 return 0;
39 }
40
41 // whatever happens, we will remove the URL from the list of IDs
42 url_fromid[id] = NULL;
43
44 // if we get here, we MUST have both buffers cleared
45 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");
46
47 if (status == 0)
48 {
49 // WE GOT DATA!
50 float n, i;
51 n = tokenizebyseparator(data, "\n");
52 e.url_rbuf = buf_create();
53 if (e.url_rbuf < 0)
54 {
55 LOG_INFO("url_URI_Get_Callback: out of memory in buf_create");
56 e.url_ready(e, e.url_ready_pass, URL_READY_ERROR);
57 strfree(e.url_url);
58 delete(e);
59 return 1;
60 }
61 e.url_rbufpos = 0;
62 if (e.url_rbuf < 0)
63 {
64 LOG_INFO("url_URI_Get_Callback: out of memory in buf_create");
65 e.url_ready(e, e.url_ready_pass, URL_READY_ERROR);
66 strfree(e.url_url);
67 delete(e);
68 return 1;
69 }
70 for (i = 0; i < n; ++i)
71 bufstr_set(e.url_rbuf, i, argv(i));
72 e.url_ready(e, e.url_ready_pass, URL_READY_CANREAD);
73 return 1;
74 }
75 else
76 {
77 // an ERROR
78 e.url_ready(e, e.url_ready_pass, -fabs(status));
79 strfree(e.url_url);
80 delete(e);
81 return 1;
82 }
83}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define tokenizebyseparator
#define buf_create
#define LOG_INFOF(...)
Definition log.qh:66
float fabs(float f)
string argv(float n)
const float URL_READY_CANREAD
Definition urllib.qh:17

References argv(), buf_create, entity(), error, fabs(), LOG_INFO, LOG_INFOF, MIN_URL_ID, NULL, NUM_URL_ID, strfree, tokenizebyseparator, URL_FH_CURL, url_fromid, URL_READY_CANREAD, and URL_READY_ERROR.

Referenced by URI_Get_Callback(), and URI_Get_Callback().

Variable Documentation

◆ URI_GET_CURL

const int URI_GET_CURL = 17

◆ URI_GET_CURL_END

const int URI_GET_CURL_END = 32

Definition at line 8 of file urllib.qh.

Referenced by GenericCommand_qc_curl(), URI_Get_Callback(), and URI_Get_Callback().

◆ URI_GET_DISCARD

const int URI_GET_DISCARD = 0

◆ URI_GET_IPBAN

const int URI_GET_IPBAN = 1

Definition at line 5 of file urllib.qh.

Referenced by OnlineBanList_Think(), OnlineBanList_URI_Get_Callback(), and URI_Get_Callback().

◆ URI_GET_IPBAN_END

const int URI_GET_IPBAN_END = 16

Definition at line 6 of file urllib.qh.

Referenced by URI_Get_Callback().

◆ URI_GET_TOS

const int URI_GET_TOS = 34

Definition at line 10 of file urllib.qh.

◆ URI_GET_UPDATENOTIFICATION

const int URI_GET_UPDATENOTIFICATION = 33

Definition at line 9 of file urllib.qh.

Referenced by updateCheck(), and URI_Get_Callback().

◆ URI_GET_URLLIB

const int URI_GET_URLLIB = 128

Definition at line 11 of file urllib.qh.

◆ URI_GET_URLLIB_END

const int URI_GET_URLLIB_END = 191

Definition at line 12 of file urllib.qh.

◆ URL_READY_CANREAD

◆ URL_READY_CANWRITE

◆ URL_READY_CLOSED

◆ URL_READY_ERROR