sprinfall / webcc

Lightweight C++ HTTP client and server library based on Asio for embedding purpose.
GNU Lesser General Public License v3.0
270 stars 61 forks source link

centos gcc 4.8.5 ? #15

Closed fujianhai closed 4 years ago

fujianhai commented 4 years ago

是否可以修改vs2013_compatible 在gcc 4.8.5上编译?

fujianhai commented 4 years ago

erase 函数编译出错,提示没有匹配的类型。

sprinfall commented 4 years ago

稍等一下,我正准备看这个问题。希望在两三天之内解决,主要是我得搞一个 gcc 4.8.5 环境。

sprinfall commented 4 years ago

是这个地方的 erase 吗?

void ClientPool::Remove(const Key& key) {
  clients_.erase(key);  // ?
  ...
}

以及,CentOS 版本?

fujianhai commented 4 years ago

好的,谢谢, 我们的环境是centos 7.0 , gcc 4.8.5 g++ 4.8.5 , 一共有三个问题: 1、url.cc 343 line

void UrlQuery::Remove(const std::string &key) {
  parameters_.erase(it)
}

第二: utility.cc 文件 std::string GetTimestamps() 函数 std::put_time () 这里

第三: common.cc 文件 codecvt 这个头文件不能用, std::codecvt_utf8 需要用c++11对应的替换掉。

同时还有一个问题: example例子中 上传数据很慢,比如pdf文件, 速度很慢, 请问是什么问题?

fujianhai commented 4 years ago

是这个地方的 erase 吗?

void ClientPool::Remove(const Key& key) {
  clients_.erase(key);  // ?
  ...
}

以及,CentOS 版本?

7.0 当然 ubuntu的也可以,问题是一样的,一共上述3个问题,还是本地测试例子存在问题。

fujianhai commented 4 years ago

上传数据很慢,比如pdf文件, 速度很慢, 请问是什么问题? 同样大小的图片就很快 ?

sprinfall commented 4 years ago

上传数据很慢,比如pdf文件, 速度很慢, 请问是什么问题? 同样大小的图片就很快 ?

PDF 有多大?用 form 方式上传是没有串流的,能不能考虑改用直接的 POST/PUT?(book client 上传图书照片用了单独的 PUT),当然,如果你的 server 只有 form 方式上传那就没办法了。

其他几个编译问题改差不多了。

Edited: 一个 PDF 大概有几兆,发送前全部读到内存,然后 socket 没有分批写,这边有很大问题,需要串流分段读取文件分段发送。你不急的话,我回头研究一下。

void FormPart::Prepare(Payload* payload) {
  using boost::asio::buffer;

  if (data_.empty() && !path_.empty()) {
    if (!utility::ReadFile(path_, &data_)) {
      throw Error{ Error::kFileError, "Cannot read the file" };
    }
  }

方便的话,给我发邮件吧 (chunting.gu@outlook.com),我想了解一下你具体是怎么用的:server 的接口是什么形式?REST 还是 ?以及你现在是怎么集成到项目里的,是源代码集成还是先编译成静态库?

最后,编译错误初步改完了。Branch vs2013_compatible 也改名为更恰当的 legacy。

fujianhai commented 4 years ago

上传数据很慢,比如pdf文件, 速度很慢, 请问是什么问题? 同样大小的图片就很快 ?

PDF 有多大?用 form 方式上传是没有串流的,能不能考虑改用直接的 POST/PUT?(book client 上传图书照片用了单独的 PUT),当然,如果你的 server 只有 form 方式上传那就没办法了。

其他几个编译问题改差不多了。

Edited: 一个 PDF 大概有几兆,发送前全部读到内存,然后 socket 没有分批写,这边有很大问题,需要串流分段读取文件分段发送。你不急的话,我回头研究一下。

void FormPart::Prepare(Payload* payload) {
  using boost::asio::buffer;

  if (data_.empty() && !path_.empty()) {
    if (!utility::ReadFile(path_, &data_)) {
      throw Error{ Error::kFileError, "Cannot read the file" };
    }
  }

PDF文件小的1M,最大的20M, 好的, book server例子您能跑吗? 在gcc 4.8.5 ,我们这里跑提示\\d+ 这个正则表达式有问题。您是否可以在gcc4.8.5上验证一下book的例子,我们试了一个1.2M的模型,就很慢了。 用的是 form_client的例子。 好的,辛苦您研究一下。

sprinfall commented 4 years ago

刚刚解决了你说的 regex 的问题,原因是 GCC 4.8 还没有完整支持 std::regex,所以我替换成了 boost::regex。 如果你还没有编译 boost::regex,需要先编译一下。然后 book server/client 跑起来就没有问题了。

运行 book_server:

$ ./book_server 9000 <path/to/upload>

<path/to/upload> 比如我用的是主目录:/home/adam,book_server 收到上传的照片时,会创建一个子目录 books,图片会放在这个子目录。

运行 book_client:

$ ./book_client http://localhost:9000 <path/to/photo>

<path/to/photo> 比如我用的是 /home/adam/proj/webcc_legacy/examples/book_client/photo

因为这是示例程序,照片都是固定的。

上传照片的代码见:

bool BookClient::SetPhoto(const std::string& id, const bfs::path& path) {
  try {
    if (!CheckPhoto(path)) {
      return false;
    }

    auto r = session_.Send(WEBCC_PUT(url_).
                           Path("books").Path(id).Path("photo").
                           File(path)());

    if (!CheckStatus(r, webcc::Status::kOK)) {
      return false;
    }

    return true;

  } catch (const webcc::Error& error) {
    std::cerr << error << std::endl;
    return false;
  }
}

这个函数往 URL /books/1/photo PUT 了一张照片,指定的是照片的路径。其中 File(path) 第三个参数 chunk_size 指定了串流时每一次处理的数据大小,缺省为 1024 字节,如果文件较大或内存无所谓,可以设大一点,比如 1M 或更多。

最后,我更改了 examples, unittest 等输出目录统一到 <build dir>/bin