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