-
Notifications
You must be signed in to change notification settings - Fork 225
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add upload link and download link API #683
Conversation
server/access-file.c
Outdated
@@ -1170,13 +1169,13 @@ access_zip_cb (evhtp_request_t *req, void *arg) | |||
int error_code; | |||
|
|||
char **parts = g_strsplit (req->uri->path->full + 1, "/", 0); | |||
if (g_strv_length (parts) != 2) { | |||
if (g_strv_length (parts) != 4) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这个 access_zip_cb 不能改的吧,改了就不兼容原有的下载 zip 的方式了。新增的 url 的 cb 应该跟现在的独立,内部可以共用一些代码逻辑。
server/access-file.c
Outdated
int | ||
access_file_init (evhtp_t *htp) | ||
{ | ||
evhtp_set_regex_cb (htp, "^/files/.*", access_cb, NULL); | ||
evhtp_set_regex_cb (htp, "^/blks/.*", access_blks_cb, NULL); | ||
evhtp_set_regex_cb (htp, "^/zip/.*", access_zip_cb, NULL); | ||
evhtp_set_regex_cb (htp, "^/zip/.*", access_zip_link_cb, NULL); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这个原来的 /zip/{token} URL 应该只想原来的 access_zip_cb。这个不要改。
server/access-file.c
Outdated
int | ||
access_file_init (evhtp_t *htp) | ||
{ | ||
evhtp_set_regex_cb (htp, "^/files/.*", access_cb, NULL); | ||
evhtp_set_regex_cb (htp, "^/blks/.*", access_blks_cb, NULL); | ||
evhtp_set_regex_cb (htp, "^/zip/.*", access_zip_cb, NULL); | ||
evhtp_set_regex_cb (htp, "^/zip/.*", access_zip_link_cb, NULL); | ||
evhtp_set_regex_cb (htp, "^/repos/[\\da-z]{8}-[\\da-z]{4}-[\\da-z]{4}-[\\da-z]{4}-[\\da-z]{12}/zip/.*", access_zip_cb, NULL); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这个属于登录后下载目录的 URL,目前先不用实现,代码先删掉吧。
server/access-file.c
Outdated
evhtp_set_regex_cb (htp, "^/zip/.*", access_zip_link_cb, NULL); | ||
evhtp_set_regex_cb (htp, "^/repos/[\\da-z]{8}-[\\da-z]{4}-[\\da-z]{4}-[\\da-z]{4}-[\\da-z]{12}/zip/.*", access_zip_cb, NULL); | ||
evhtp_set_regex_cb (htp, "^/f/.*", access_link_cb, NULL); | ||
evhtp_set_regex_cb (htp, "^/d/.*", access_dir_link_cb, NULL); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
目前就先实现这文件外链的 URL 就好了。其中 /d/ 的 URL 先注释掉吧,暂时不用对外提供。
server/access-file.c
Outdated
goto out; | ||
} | ||
|
||
info = http_tx_manager_query_access_token (token, "dir"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
感觉你应该搞错需求了吧。你现在把原来的 /zip/{token} 的 URL 交给了这个 cb 处理。而实际上应该保持原有的 URL 的处理逻辑不变才对。
server/pack-dir.h
Outdated
@@ -10,6 +10,7 @@ typedef struct Progress { | |||
int zipped; | |||
int total; | |||
char *zip_file_path; | |||
char *zip_file_name; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这些和 zip 相关的新增改动都先注释掉吧。
@@ -2641,6 +2647,154 @@ upload_headers_cb (evhtp_request_t *req, evhtp_headers_t *hdr, void *arg) | |||
return EVHTP_RES_OK; | |||
} | |||
|
|||
static evhtp_res |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
新的上传外链处理代码也先注释掉吧。
fileserver/fileserver.go
Outdated
r.Handle("/u/{.*}", appHandler(uploadLinkCB)) | ||
r.Handle("/f/{.*}", appHandler(accessLinkCB)) | ||
r.Handle("/d/{.*}", appHandler(accessDirLinkCB)) | ||
r.Handle("/repos/{repoid:[\\da-z]{8}-[\\da-z]{4}-[\\da-z]{4}-[\\da-z]{4}-[\\da-z]{12}}/zip/{.*}", appHandler(accessZipCB)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
go 不分做和 C 部分相同的处理,不用的代码先注释掉。
if info.FilePath == "" { | ||
msg := "Invalid file_path\n" | ||
return &appError{nil, msg, http.StatusBadRequest} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
内部数据格式有问题应该返回 500。
fileserver/fileop.go
Outdated
|
||
now := time.Now() | ||
rsp.Header().Set("Last-Modified", now.Format("Mon, 2 Jan 2006 15:04:05 GMT")) | ||
rsp.Header().Set("Cache-Control", "max-age=3600") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Last-Modified 应该设置为文件的最后修改时间吧。
如果请求设置了 If-Modified-Since 头部或者 If-None-Match 头部,那么需要检查文件是否有被更新。参考 https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching#validation 。同时我们应该设置 Cache-Control: no-cache,让客户端先检查缓存是否已经过期。
这些检查和头部设置应该都在获取到文件元信息之后才能做的吧。C 部分也需要相应改动。
fileserver/fileop.go
Outdated
if seahubPK == "" { | ||
err := fmt.Errorf("no seahub private key is configured") | ||
return &appError{err, "", http.StatusNotFound} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这个改动去掉吧。以后代码提交之后最好自己看一下,有时一些明显不必要的改动就去掉。
fileserver/fileop.go
Outdated
fileName := filepath.Base(filePath) | ||
op := "download-link" | ||
|
||
if _, ok := r.Header["If-Modified-Since"]; ok { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
应该不用处理这个头部吧,现在只要设置了这个头部就返回没变动,也是不对的。
return &appError{nil, msg, http.StatusBadRequest} | ||
} | ||
|
||
etag := r.Header.Get("If-None-Match") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里应该注释一下缓存相关的逻辑是怎样的。包括通过 If-None-Match 头部来检查文件是否有改动,设置 no-cache 来让客户端在使用缓存之前检查文件是否有变化。
fileserver/fileop.go
Outdated
} | ||
|
||
rsp.Header().Set("ETag", fileID) | ||
rsp.Header().Set("Cache-Control", "no-chche") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no-cache 写错了。这个代码应该没有测试过吧,开发完应该自己先测试一下。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这部分测试了。可能是浏览器使用了默认的Cache-Control。
error_code = EVHTP_RES_OK; | ||
goto out; | ||
} | ||
set_etag (req, file_id); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里没有设置 no-cache。
} | ||
} | ||
|
||
static GList * |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
下面这两个辅助函数也注释一下吧。
No description provided.