11 .url_ready_func url_ready;
12 .entity url_ready_pass;
14 #define MIN_URL_ID 128
16 entity url_fromid[NUM_URL_ID];
18 void url_URI_Get_Callback(float id, float status, string data)
31 print(sprintf("WARNING: handle %d (%s) has already received data?!?\n", id + NUM_URL_ID, e.url_url));
39 n = tokenizebyseparator(data, "\n");
40 e.url_rbuf = buf_create();
44 backtrace("buf_create: out of memory");
45 e.url_ready(e, e.url_ready_pass, URL_READY_ERROR);
49 for(i = 0; i < n; ++i)
50 bufstr_set(e.url_rbuf, i, argv(i));
51 e.url_ready(e, e.url_ready_pass, URL_READY_CANREAD);
57 e.url_ready(e, e.url_ready_pass, -status);
64 void url_fopen(string url, float mode, entity pass, url_ready_func ready)
68 if(strstrofs(url, "://", -1))
74 // collect data to a stringbuffer for a POST request
75 // attempts to close will result in a reading handle
77 e.classname = "url_fopen_file";
78 e.url_url = strzone(url);
80 e.url_wbuf = buf_create();
83 backtrace("buf_create: out of memory");
86 ready(world, pass, URL_READY_ERROR);
91 ready(e, pass, URL_READY_CANWRITE);
96 for(i = 0; i < NUM_URL_ID; ++i)
97 if(url_fromid[i] == world)
103 e.classname = "url_fopen_file";
104 e.url_url = strzone(url);
109 if(!uri_get(uri, e.url_id + MIN_URL_ID))
111 backtrace("uri_get: failed");
112 strunzone(e.url_url);
114 ready(world, pass, URL_READY_ERROR);
118 e.url_ready_pass = pass;
125 fh = fopen(url, mode);
131 e.classname = "url_fopen_file";
133 if(mode == FILE_READ)
134 ready(e, pass, URL_READY_CANREAD);
136 ready(e, pass, URL_READY_CANWRITE);
141 void url_fclose(entity e, entity pass, url_ready_func ready)
149 for(i = 0; i < NUM_URL_ID; ++i)
150 if(url_fromid[i] == world)
154 ready(e, pass, URL_READY_ERROR);
156 strunzone(e.url_url);
161 if(!uri_postbuf(uri, e.url_id + MIN_URL_ID, "text/plain", "\n", e.url_wbuf))
163 ready(e, pass, URL_READY_ERROR);
165 strunzone(e.url_url);
173 e.url_ready_pass = pass;
177 // we have READ all data
178 ready(e, pass, URL_READY_CLOSED);
180 strunzone(e.url_url);
188 ready(e, pass, URL_READY_CLOSED); // closing creates no reading handle
194 string url_fgets(entity e)
200 s = bufstr_get(e.url_rbuf, e.url_rbufpos);
207 return fgets(e.url_fh);
212 void url_fputs(entity e, string s)
217 bufstr_set(e.url_wbuf, e.url_wbufpos, s);