bool http_servlet::doReply(acl::HttpServletRequest& req, acl::HttpServletResponse& res, const char* info) { // 创建 xml 格式的数据体 acl::xml1 body; body.get_root().add_child("root", true) .add_child("content_type", true) .add_attr("type", (int) req.getRequestType()) .get_parent() .add_child("info", true) .set_text(info) .get_parent() .add_child("params", true) .add_child("param", true) .add_attr("name1", param1_) .get_parent() .add_child("param", true) .add_attr("name2", param2_) .get_parent() .add_child("param", true) .add_attr("name3", param3_) .get_parent() .add_child("files", true) .add_child("file", true) .add_attr("filename", file1_) .add_attr("fsize", fsize1_) .get_parent() .add_child("file", true) .add_attr("filename", file2_) .add_attr("fsize", fsize2_) .get_parent() .add_child("file", true) .add_attr("filename", file3_) .add_attr("fsize", fsize3_); acl::string buf; body.build_xml(buf); logger(">>%s<<", buf.c_str()); return res.write(buf) && res.write(NULL, 0); }
bool http_servlet::doPost(acl::HttpServletRequest& req, acl::HttpServletResponse& res) { res.setContentType("text/xml; charset=gbk") // 设置响应字符集 .setKeepAlive(req.isKeepAlive()) // 设置是否保持长连接 .setContentEncoding(true) // 自动支持压缩传输 .setChunkedTransferEncoding(true); // 采用 chunk 传输方式 // 获得 HTTP 请求的数据类型,正常的参数类型,即 name&value 方式 // 还是 MIME 数据类型,还是数据流类型 acl::http_request_t request_type = req.getRequestType(); if (request_type != acl::HTTP_REQUEST_MULTIPART_FORM) { acl::string buf; buf.format("<root error='should acl::HTTP_REQUEST_MULTIPART_FORM' />\r\n"); (void) res.write(buf); (void) res.write(NULL, 0); return false; } // 先获得 Content-Type 对应的 http_ctype 对象 mime_ = req.getHttpMime(); if (mime_ == NULL) { logger_error("http_mime null"); (void) doReply(req, res, "http_mime null"); return false; } // 获得数据体的长度 content_length_ = req.getContentLength(); if (content_length_ <= 0) { logger_error("body empty"); (void) doReply(req, res, "body empty"); return false; } acl::string filepath; #if defined(_WIN32) || defined(_WIN64) filepath.format("%s\\mime_file", var_cfg_var_path); #else filepath.format("%s/mime_file", var_cfg_var_path); #endif if (fp_.open_write(filepath) == false) { logger_error("open %s error %s", filepath.c_str(), acl::last_serror()); (void) doReply(req, res, "open file error"); return false; } // 设置原始文件存入路径 mime_->set_saved_path(filepath); req_ = &req; res_ = &res; read_body_ = true; // 直接返回,从而触发异步读 HTTP 数据体过程 return true; }