Improve tus_file_new error reporting

parent 746fa92c
......@@ -16,7 +16,8 @@ TESTS = \
vtc/plain_cors.vtc \
vtc/name_hash.vtc \
vtc/expires.vtc \
vtc/done.vtc
vtc/done.vtc \
vtc/coverage.vtc
# ----------------------------------------
# ext vmods
......
......@@ -887,7 +887,8 @@ tus_name_rnd(struct vsb *vsb)
/* under tus_server mtx to protect tus_files */
struct tus_file_core *
tus_file_new(VRT_CTX, struct VPFX(tus_server) *srv, enum tus_f_type type,
const char *url_path, const char *id, const char *metadata)
const char *url_path, const char *id, const char *metadata,
unsigned *status, const char **reason)
{
struct tus_file_core *fcore;
struct tus_file_disk *fdisk = NULL;
......@@ -898,6 +899,9 @@ tus_file_new(VRT_CTX, struct VPFX(tus_server) *srv, enum tus_f_type type,
int fd;
size_t l;
AN(status);
AN(reason);
if (id != NULL) {
while (*id == '/')
id++;
......@@ -913,6 +917,8 @@ tus_file_new(VRT_CTX, struct VPFX(tus_server) *srv, enum tus_f_type type,
errno = ENAMETOOLONG;
VSLb(ctx->vsl, SLT_Error, "%s: path too long: %s",
tus_server_name(srv), url_path);
*status = 400;
*reason = "Path too long";
return (NULL);
}
......@@ -920,6 +926,8 @@ tus_file_new(VRT_CTX, struct VPFX(tus_server) *srv, enum tus_f_type type,
errno = ENAMETOOLONG;
VSLb(ctx->vsl, SLT_Error, "%s: metadata too long: %s",
tus_server_name(srv), metadata);
*status = 400;
*reason = "Metadata too long";
return (NULL);
}
......@@ -936,6 +944,8 @@ tus_file_new(VRT_CTX, struct VPFX(tus_server) *srv, enum tus_f_type type,
VSLb(ctx->vsl, SLT_Error, "%s: mkostemp(%s) failed: %d (%s)",
tus_server_name(srv), VSB_data(vsb_path),
errno, strerror(errno));
*status = 500;
*reason = "mkostemp failed";
return (NULL);
}
path = VSB_data(vsb_path);
......@@ -945,6 +955,8 @@ tus_file_new(VRT_CTX, struct VPFX(tus_server) *srv, enum tus_f_type type,
VSLb(ctx->vsl, SLT_Error, "%s: fallocate(%s) failed: %d (%s)",
tus_server_name(srv), path,
errno, strerror(errno));
*status = 500;
*reason = "fallocate failed";
goto err;
}
......@@ -959,9 +971,12 @@ tus_file_new(VRT_CTX, struct VPFX(tus_server) *srv, enum tus_f_type type,
fdisk = tus_mmap_header(fd);
if (fdisk == NULL) {
VSLb(ctx->vsl, SLT_Error, "%s: tus_mmap_header(%s) failed: %d (%s)",
VSLb(ctx->vsl, SLT_Error,
"%s: tus_mmap_header(%s) failed: %d (%s)",
tus_server_name(srv), path,
errno, strerror(errno));
*status = 500;
*reason = "mmap failed";
goto err;
}
......@@ -995,6 +1010,9 @@ tus_file_new(VRT_CTX, struct VPFX(tus_server) *srv, enum tus_f_type type,
/* undo. happens for clash with custom id */
AN(id);
*status = 409;
*reason = "custom id clash";
err:
tus_file_disk_del(&fdisk, &fd, path, -1);
return (NULL);
......
......@@ -157,7 +157,8 @@ void tus_file_unlock(struct tus_file_core **);
void tus_file_del(struct tus_file_core **);
void tus_file_exp(struct tus_file_core **);
struct tus_file_core *tus_file_new(VRT_CTX, struct VPFX(tus_server) *,
enum tus_f_type, const char *, const char *, const char *);
enum tus_f_type, const char *, const char *, const char *,
unsigned *, const char **);
struct tus_file_core *tus_file_lookup(struct VPFX(tus_server) *, const char *);
unsigned tus_body_to_file(VRT_CTX, struct tus_file_core *);
void tus_file_mmap(struct tus_file_core *);
......
......@@ -252,6 +252,7 @@ tus_request(VRT_CTX, struct VPFX(tus_server) *tussrv,
VCL_BLOB hash;
AZ(r->s.status);
AZ(r->s.reason);
AZ(r->fcore);
if (http_GetHdr(ctx->http_req, hdr_method, &p)) {
......@@ -317,7 +318,8 @@ tus_request(VRT_CTX, struct VPFX(tus_server) *tussrv,
tus_server_lock(tussrv);
if (m == POST) {
r->fcore = tus_file_new(ctx, tussrv, type, url, id, metadata);
r->fcore = tus_file_new(ctx, tussrv, type, url, id, metadata,
&r->s.status, &r->s.reason);
} else {
r->fcore = tus_file_lookup(tussrv, url);
}
......@@ -390,7 +392,13 @@ tus_request(VRT_CTX, struct VPFX(tus_server) *tussrv,
}
if (r->fcore == NULL) {
r->s.status = (m == POST) ? 409 : 404;
if (m == POST) {
// tus_file_new sets error
AN(r->s.status);
AN(r->s.reason);
} else {
r->s.status = 404;
}
return (0);
}
......
varnishtest "test vmod-tus tus_file_new error reporting"
varnish v1 -vcl+backend {
import tus;
backend proforma none;
sub vcl_init {
new tmp = tus.server("http://localhost", max = 3145B);
}
sub vcl_recv {
if (tmp.recv(id=req.http.id)) {
return (fail);
} else {
return (synth(4200));
}
}
sub vcl_synth {
if (resp.status == 4200) {
tmp.synth();
return (deliver);
}
}
} -start
# dynamic file name complete post
client c1 {
txreq -method POST \
-hdr "Upload-Length: 100" \
-hdr "Tus-Resumable: 1.0.0" \
-hdr "Content-Type: application/offset+octet-stream" \
-hdr "Upload-Metadata: filename 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" \
-bodylen 100
rxresp
expect resp.status == 400
expect resp.reason == "Metadata too long"
expect resp.http.Reason == resp.reason
expect resp.http.Tus-Resumable == "1.0.0"
expect resp.http.Tus-Version == "1.0.0"
expect resp.http.Tus-Extension == "creation,creation-with-upload,expiration,termination,concatenation"
expect resp.http.Tus-Checksum-Algorithm == <undef>
expect resp.http.Tus-Max-Size == 3145
} -run
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment