bool_t PacketHandler::OnRead(serial_t uidx, Session *sess) { bool_t ret = FALSE; int32_t iret = 0; RingBuffer *rbuffer = sess->RecvBuffer(); char_t *context = rbuffer->GetOutPtr(); int32_t context_len = rbuffer->Length(); iret = HttpReqComplete(context, context_len); if(iret == -2) { ECILA_TRACE(); return FALSE; } // request format error if(iret == -1) { return TRUE; } // skip (more context) ret = rbuffer->ForwardOutPtr(context_len); if(!ret) { ECILA_TRACE(); return FALSE; } Buffer *buffer = buff_pool_->Acquire(); if(!buffer) { ECILA_TRACE(); return FALSE; } PacketHeader pkt_header; pkt_header.kind_ = PKT_KIND_USERAPP; pkt_header.cmd_ = PKT_CMD_RECV; pkt_header.size_ = context_len; pkt_header.uidx_ = uidx; ret = buffer->PutBinary((char_t*)&pkt_header, sizeof(pkt_header)); if(!ret) { ECILA_TRACE(); goto _ERROR; } ret = buffer->PutBinary(context, context_len); if(!ret) { ECILA_TRACE(); goto _ERROR; } dispatch_q_->Push(buffer); return TRUE; _ERROR: buff_pool_->Release(buffer); return FALSE; }