Message sendMessage(const Message &msg) override { if (msg.type == "put") { return doPut(msg.params); } else if (msg.type == "get") { return doGet(msg.params); } else { return Message("error", {"Unknown command"}); } }
void Game::doAction(const Actions action) { switch (action) { case GO: doGo(); break; case QUIT: doQuit(); break; case PICK: doPick(); break; case DROP: doDrop(); break; case READ: doRead(); break; case BREAK: doBreak(); break; case SEE: doSee(); break; case OPEN: doOpen(); break; case FILL: doFill(); break; case USE: doUse(); break; case PUT: doPut(); break; case NOACTION: doNothing(); break; default: doNothing(); } }
void Game::doPut() { if (object != verb) { Item toPut = player->getItem(object); if (toPut.first != "NOITEM") { if (checkAction(toPut, PUT)) { cout << "Where do you want to put the " << object << " in?" << endl; cout << ">"; getline(cin, object); Item result = room_list[current_room]->getItem(object); if (checkAction(result, PUT)) { room_list[current_room]->changeState(toPut.first); cout << "You put the " << toPut.first << " in the " << object << endl; if (toPut.first.compare("water") == 0) { player->removeItem("water"); player->pickItem(Item("bottle", { PICK, DROP, FILL })); } } else { cout << "You can't put the " << toPut.first << " in the " << object << endl; return; } } else cout << "You can't put a " << toPut.first << endl; } else cout << "You don't have a " << object << endl; } else { cout << "What do you want to put?" << endl; cout << ">"; getline(cin, object); doPut(); } }
bool HttpServlet::start() { socket_stream* in; socket_stream* out; bool cgi_mode; bool first = first_; if (first_) first_ = false; if (stream_ == NULL) { // 数据流为空,则当 CGI 模式处理,将标准输入输出 // 作为数据流 in = NEW socket_stream(); in->open(ACL_VSTREAM_IN); out = NEW socket_stream(); out->open(ACL_VSTREAM_OUT); cgi_mode = true; } else { in = out = stream_; cgi_mode = false; } // 在 HTTP 长连接重复请求情况下,以防万一,需要首先删除请求/响应对象 delete req_; delete res_; res_ = NEW HttpServletResponse(*out); req_ = NEW HttpServletRequest(*res_, *session_, *in, local_charset_, parse_body_enable_, parse_body_limit_); // 设置 HttpServletRequest 对象 res_->setHttpServletRequest(req_); if (rw_timeout_ >= 0) req_->setRwTimeout(rw_timeout_); res_->setCgiMode(cgi_mode); string method_s(32); http_method_t method = req_->getMethod(&method_s); // 根据请求的值自动设定是否需要保持长连接 if (!cgi_mode) res_->setKeepAlive(req_->isKeepAlive()); bool ret; switch (method) { case HTTP_METHOD_GET: if (upgradeWebsocket(*req_, *res_)) { if (res_->sendHeader() == false) { logger_error("sendHeader error!"); return false; } ret = doWebsocket(*req_, *res_); } else ret = doGet(*req_, *res_); break; case HTTP_METHOD_POST: ret = doPost(*req_, *res_); break; case HTTP_METHOD_PUT: ret = doPut(*req_, *res_); break; case HTTP_METHOD_CONNECT: ret = doConnect(*req_, *res_); break; case HTTP_METHOD_PURGE: ret = doPurge(*req_, *res_); break; case HTTP_METHOD_DELETE: ret = doDelete(*req_, *res_); break; case HTTP_METHOD_HEAD: ret = doHead(*req_, *res_); break; case HTTP_METHOD_OPTION: ret = doOptions(*req_, *res_); break; case HTTP_METHOD_PROPFIND: ret = doPropfind(*req_, *res_); break; case HTTP_METHOD_OTHER: ret = doOther(*req_, *res_, method_s.c_str()); break; default: ret = false; // 有可能是IO失败或未知方法 if (req_->getLastError() == HTTP_REQ_ERR_METHOD) doUnknown(*req_, *res_); else if (first) doError(*req_, *res_); break; } if (in != out) { // 如果是标准输入输出流,则需要先将数据流与标准输入输出解绑, // 然后才能释放数据流对象,数据流内部会自动判断流句柄合法性 // 这样可以保证与客户端保持长连接 in->unbind(); out->unbind(); delete in; delete out; } return ret; }
bool HttpServlet::doRun(dbuf_pool* dbuf) { socket_stream* in; socket_stream* out; bool cgi_mode; bool first = first_; if (first_) first_ = false; if (stream_ == NULL) { // 数据流为空,则当 CGI 模式处理,将标准输入输出 // 作为数据流 in = NEW socket_stream(); in->open(ACL_VSTREAM_IN); out = NEW socket_stream(); out->open(ACL_VSTREAM_OUT); cgi_mode = true; } else { in = out = stream_; cgi_mode = false; } // req/res 采用栈变量,减少内存分配次数 HttpServletResponse res(*out, dbuf); HttpServletRequest req(res, *session_, *in, local_charset_, parse_body_enable_, parse_body_limit_, dbuf); // 设置 HttpServletRequest 对象 res.setHttpServletRequest(&req); if (rw_timeout_ >= 0) req.setRwTimeout(rw_timeout_); res.setCgiMode(cgi_mode); string method_s(32); http_method_t method = req.getMethod(&method_s); // 根据请求的值自动设定是否需要保持长连接 if (!cgi_mode) res.setKeepAlive(req.isKeepAlive()); bool ret; switch (method) { case HTTP_METHOD_GET: ret = doGet(req, res); break; case HTTP_METHOD_POST: ret = doPost(req, res); break; case HTTP_METHOD_PUT: ret = doPut(req, res); break; case HTTP_METHOD_CONNECT: ret = doConnect(req, res); break; case HTTP_METHOD_PURGE: ret = doPurge(req, res); break; case HTTP_METHOD_DELETE: ret = doDelete(req, res); break; case HTTP_METHOD_HEAD: ret = doHead(req, res); break; case HTTP_METHOD_OPTION: ret = doOptions(req, res); break; case HTTP_METHOD_PROPFIND: ret = doPropfind(req, res); break; case HTTP_METHOD_OTHER: ret = doOther(req, res, method_s.c_str()); break; default: ret = false; // 有可能是IO失败或未知方法 if (req.getLastError() == HTTP_REQ_ERR_METHOD) doUnknown(req, res); else if (first) doError(req, res); break; } if (in != out) { // 如果是标准输入输出流,则需要先将数据流与标准输入输出解绑, // 然后才能释放数据流对象,数据流内部会自动判断流句柄合法性 // 这样可以保证与客户端保持长连接 in->unbind(); out->unbind(); delete in; delete out; } // 返回给上层调用者:true 表示继续保持长连接,否则表示需断开连接 return ret && req.isKeepAlive() && res.getHttpHeader().get_keep_alive(); }
bool HttpServlet::doRun(session& session, socket_stream* stream /* = NULL */, bool body_parse /* = true */, int body_limit /* = 102400 */) { socket_stream* in; socket_stream* out; bool cgi_mode; if (stream == NULL) { // 数据流为空,则当 CGI 模式处理,将标准输入输出 // 作为数据流 stream = NEW socket_stream(); (void) stream->open(ACL_VSTREAM_IN); in = stream; stream = NEW socket_stream(); (void) stream->open(ACL_VSTREAM_OUT); out = stream; cgi_mode = true; } else { in = out = stream; cgi_mode = false; } // req/res 采用栈变量,减少内存分配次数 HttpServletResponse res(*out); HttpServletRequest req(res, session, *in, local_charset_, body_parse, body_limit); if (rw_timeout_ >= 0) req.setRwTimeout(rw_timeout_); res.setCgiMode(cgi_mode); bool ret; http_method_t method = req.getMethod(); if (method == HTTP_METHOD_GET) ret = doGet(req, res); else if (method == HTTP_METHOD_POST) ret = doPost(req, res); else if (method == HTTP_METHOD_PUT) ret = doPut(req, res); else if (method == HTTP_METHOD_CONNECT) ret = doConnect(req, res); else if (method == HTTP_METHOD_PURGE) ret = doPurge(req, res); else { ret = false; // 有可能是IO失败或未知方法 http_request_error_t n = req.getLastError(); if (n == HTTP_REQ_ERR_METHOD) doUnknown(req, res); else doError(req, res); } if (in != out) { // 如果是标准输入输出流,则需要先将数据流与标准输入输出解绑, // 然后才能释放数据流对象,数据流内部会自动判断流句柄合法性 // 这样可以保证与客户端保持长连接 in->unbind(); out->unbind(); delete in; delete out; } return ret; }
bool HttpServlet::doRun(session& session, socket_stream* stream /* = NULL */) { socket_stream* in; socket_stream* out; bool cgi_mode; if (stream == NULL) { // 数据流为空,则当 CGI 模式处理,将标准输入输出 // 作为数据流 stream = NEW socket_stream(); (void) stream->open(ACL_VSTREAM_IN); in = stream; stream = NEW socket_stream(); (void) stream->open(ACL_VSTREAM_OUT); out = stream; cgi_mode = true; } else { in = out = stream; cgi_mode = false; } // req/res 采用栈变量,减少内存分配次数 HttpServletResponse res(*out); HttpServletRequest req(res, session, *in, local_charset_, parse_body_enable_, parse_body_limit_); if (rw_timeout_ >= 0) req.setRwTimeout(rw_timeout_); res.setCgiMode(cgi_mode); bool ret; http_method_t method = req.getMethod(); switch (method) { case HTTP_METHOD_GET: ret = doGet(req, res); break; case HTTP_METHOD_POST: ret = doPost(req, res); break; case HTTP_METHOD_PUT: ret = doPut(req, res); break; case HTTP_METHOD_CONNECT: ret = doConnect(req, res); break; case HTTP_METHOD_PURGE: ret = doPurge(req, res); break; case HTTP_METHOD_DELETE: ret = doDelete(req, res); break; case HTTP_METHOD_HEAD: ret = doHead(req, res); break; case HTTP_METHOD_OPTION: ret = doOption(req, res); break; default: ret = false; // 有可能是IO失败或未知方法 if (req.getLastError() == HTTP_REQ_ERR_METHOD) doUnknown(req, res); else doError(req, res); break; } if (in != out) { // 如果是标准输入输出流,则需要先将数据流与标准输入输出解绑, // 然后才能释放数据流对象,数据流内部会自动判断流句柄合法性 // 这样可以保证与客户端保持长连接 in->unbind(); out->unbind(); delete in; delete out; } return ret; }