魔改Mongoose源文件,支持一次上传文件大于3M

2 篇文章 0 订阅

修改read_conn文件

static long read_conn(struct mg_connection *c) {
  long n = -1;
  // if (c->recv.len >= MG_MAX_RECV_BUF_SIZE) {
  //   mg_error(c, "max_recv_buf_size reached");
  // } else 
  if (c->recv.size - c->recv.len < MG_IO_SIZE &&
             !mg_iobuf_resize(&c->recv, c->recv.size + MG_IO_SIZE)) {
    mg_error(c, "oom");
  } else {
    char *buf = (char *) &c->recv.buf[c->recv.len];
    size_t len = c->recv.size - c->recv.len;
    n = c->is_tls ? mg_tls_recv(c, buf, len) : mg_sock_recv(c, buf, len);
    LOG(n > 0 ? LL_VERBOSE_DEBUG : LL_DEBUG,
        ("%-3lu %d%d%d%d%d%d%d%d%d%d%d%d%d%d %7ld %ld/%ld err %d", c->id,
         c->is_listening, c->is_client, c->is_accepted, c->is_resolving,
         c->is_connecting, c->is_tls, c->is_tls_hs, c->is_udp, c->is_websocket,
         c->is_hexdumping, c->is_draining, c->is_closing, c->is_readable,
         c->is_writable, (long) c->recv.len, n, (long) len, MG_SOCK_ERRNO));
    if (n == 0) {
      // Do nothing
    } else if (n < 0) {
      c->is_closing = 1;  // Error, or normal termination
    } else if (n > 0) {
      struct mg_str evd = mg_str_n(buf, (size_t) n);
      if (c->is_hexdumping) {
        char *s = mg_hexdump(buf, (size_t) n);
        LOG(LL_INFO, ("\n-- %lu %s %s %ld\n%s", c->id, c->label, "<-", n, s));
        free(s);
      }
      c->recv.len += (size_t) n;
      mg_call(c, MG_EV_READ, &evd);
    }
  }
  return n;
}

修改mg_http_upload文件:

int mg_http_upload(struct mg_connection *c, struct mg_http_message *hm,
                   const char *dir) {
  char offset[40] = "", name[200] = "", path[256];
  // mg_http_get_var(&hm->query, "offset", offset, sizeof(offset));
  // mg_http_get_var(&hm->query, "name", name, sizeof(name));
  struct mg_http_part part;
  size_t oft = 0;
  while((oft = mg_http_next_multipart(hm->body, oft, &part)) > 0) {
    strncpy(name, part.filename.ptr, strlen(part.filename.ptr) - strlen(strchr(part.filename.ptr, '\"')));
    if (name[0] == '\0') {
      mg_http_reply(c, 400, "", "%s", "name required");
      return -1;
    } else {
      FILE *fp;
      snprintf(path, sizeof(path), "%s%c%s", dir, MG_DIRSEP, name);
      LOG(LL_DEBUG,
          ("%p %d bytes @ %d [%s]", c->fd, (int) part.body.len, (int) oft, name));
      if ((fp = fopen(path, oft == 0 ? "wb" : "ab")) == NULL) {
        mg_http_reply(c, 400, "", "fopen(%s): %d", name, errno);
        return -2;
      } else {
        fwrite(part.body.ptr, 1, part.body.len, fp);
        fclose(fp);
        mg_http_reply(c, 200, "", "");
        return (int) part.body.len;
      }
    }
  }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值