413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
|
var ok = true
if self.aid == 0 or self.who.rights.powers.[pow:asvalue()]() == false then
ok = false
self:complain(403,'insufficient privileges',['you lack the <strong>'..pow:asvalue()..'</strong> power and cannot perform this action'])
end
in ok end
end)
-- CALL ONLY ONCE PER VAR
terra convo:postv(name: rawstring)
if self.varbuf.ptr == nil then
self.varbuf = self.srv.pool:alloc(int8, self.msg.body.len + self.msg.query.len)
self.vbofs = self.varbuf.ptr
end
var o = lib.net.mg_http_get_var(&self.msg.body, name, self.vbofs, self.varbuf.ct - (self.vbofs - self.varbuf.ptr))
if o > 0 then
var r = self.vbofs
self.vbofs = self.vbofs + o + 1
@(self.vbofs - 1) = 0
var norm = lib.str.normalize([lib.mem.ptr(int8)]{ptr = r, ct = o})
return norm.ptr, norm.ct
else return nil, 0 end
end
terra convo:ppostv(name: rawstring)
var s,l = self:postv(name)
return pstring { ptr = s, ct = l }
end
terra convo:getv(name: rawstring)
if self.varbuf.ptr == nil then
self.varbuf = self.srv.pool:alloc(int8, self.msg.query.len + self.msg.body.len)
self.vbofs = self.varbuf.ptr
end
var o = lib.net.mg_http_get_var(&self.msg.query, name, self.vbofs, self.varbuf.ct - (self.vbofs - self.varbuf.ptr))
|
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
|
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
|
var ok = true
if self.aid == 0 or self.who.rights.powers.[pow:asvalue()]() == false then
ok = false
self:complain(403,'insufficient privileges',['you lack the <strong>'..pow:asvalue()..'</strong> power and cannot perform this action'])
end
in ok end
end)
local pstr2mg, mg2pstr
do -- aaaaaaaaaaaaaaaaaaaaaaaa
mgstr = lib.util.find(lib.net.mg_http_message.entries, function(v)
if v.field == 'body' or v[1] == 'body' then return v.type end
end)
terra pstr2mg(p: pstring): mgstr
return mgstr { ptr = p.ptr, len = p.ct }
end
terra mg2pstr(m: mgstr): pstring
return pstring { ptr = m.ptr, ct = m.len }
end
end
-- CALL ONLY ONCE PER VAR
terra convo:postv_next(name: pstring, start: &pstring)
if self.varbuf.ptr == nil then
self.varbuf = self.srv.pool:alloc(int8, self.msg.body.len + self.msg.query.len)
self.vbofs = self.varbuf.ptr
end
var conv = pstr2mg(@start)
var o = lib.net.mg_http_get_var(
&conv,
name.ptr, self.vbofs,
self.varbuf.ct - (self.vbofs - self.varbuf.ptr)
)
if o > 0 then
start:advance(name.ct + o + 2)
var r = self.vbofs
self.vbofs = self.vbofs + o + 1
@(self.vbofs - 1) = 0
var norm = lib.str.normalize([lib.mem.ptr(int8)]{ptr = r, ct = o})
return norm.ptr, norm.ct
else return nil, 0 end
end
terra convo:postv(name: pstring)
var start = mg2pstr(self.msg.body)
return self:postv_next(name, &start)
end
terra convo:ppostv(name: pstring)
var s,l = self:postv(name)
return pstring { ptr = s, ct = l }
end
do
local struct postiter { co: &convo where: pstring name: pstring }
terra convo:eachpostv(name: pstring)
return postiter { co = self, where = mg2pstr(self.msg.body), name = name }
end
postiter.metamethods.__for = function(self, body)
return quote
while true do
var str, len = self.co:postv_next(self.name, &self.where)
if str == nil then break end
[ body(`pstring {str, len}) ]
end
end
end
end
terra convo:getv(name: rawstring)
if self.varbuf.ptr == nil then
self.varbuf = self.srv.pool:alloc(int8, self.msg.query.len + self.msg.body.len)
self.vbofs = self.varbuf.ptr
end
var o = lib.net.mg_http_get_var(&self.msg.query, name, self.vbofs, self.varbuf.ct - (self.vbofs - self.varbuf.ptr))
|