mirror of
https://github.com/lammertb/libhttp.git
synced 2026-01-12 21:36:04 +03:00
Reorder mg_upload
This commit is contained in:
@@ -5560,15 +5560,6 @@ int mg_upload(struct mg_connection *conn, const char *destination_dir)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Move data to the beginning of the buffer */
|
||||
assert(len >= headers_len);
|
||||
memmove(buf, &buf[headers_len], len - headers_len);
|
||||
len -= headers_len;
|
||||
|
||||
/* We open the file with exclusive lock held. This guarantee us
|
||||
there is no other thread can save into the same file
|
||||
simultaneously. */
|
||||
fp = NULL;
|
||||
/* Construct destination file name. Do not allow paths to have
|
||||
slashes. */
|
||||
if ((s = strrchr(fname, '/')) == NULL &&
|
||||
@@ -5578,16 +5569,27 @@ int mg_upload(struct mg_connection *conn, const char *destination_dir)
|
||||
s++;
|
||||
}
|
||||
|
||||
/* Open file in binary mode. */
|
||||
/* There data is written to a temporary file first. */
|
||||
/* Different users should use a different destination_dir. */
|
||||
snprintf(path, sizeof(path)-1, "%s/%s", destination_dir, s);
|
||||
strcpy(tmp_path, path);
|
||||
strcat(tmp_path, "~");
|
||||
|
||||
/* We open the file with exclusive lock held. This guarantee us
|
||||
there is no other thread can save into the same file
|
||||
simultaneously. */
|
||||
fp = NULL;
|
||||
/* Open file in binary mode. */
|
||||
if ((fp = fopen(tmp_path, "wb")) == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* Move data to the beginning of the buffer */
|
||||
/* part_request_info is no longer valid after this operation */
|
||||
assert(len >= headers_len);
|
||||
memmove(buf, &buf[headers_len], len - headers_len);
|
||||
len -= headers_len;
|
||||
|
||||
/* Read POST data, write into file until boundary is found. */
|
||||
eof = n = 0;
|
||||
do {
|
||||
@@ -5611,14 +5613,14 @@ int mg_upload(struct mg_connection *conn, const char *destination_dir)
|
||||
} while (!eof && (n = mg_read(conn, buf + len, sizeof(buf) - len)) > 0);
|
||||
fclose(fp);
|
||||
if (eof) {
|
||||
remove(path);
|
||||
remove(path);
|
||||
rename(tmp_path, path);
|
||||
num_uploaded_files++;
|
||||
if (conn->ctx->callbacks.upload != NULL) {
|
||||
conn->ctx->callbacks.upload(conn, path);
|
||||
}
|
||||
} else {
|
||||
remove(tmp_path);
|
||||
} else {
|
||||
remove(tmp_path);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5978,6 +5980,7 @@ static int set_ports_option(struct mg_context *ctx)
|
||||
union usa usa;
|
||||
socklen_t len;
|
||||
|
||||
memset(&so, 0, sizeof(so));
|
||||
memset(&usa, 0, sizeof(usa));
|
||||
len = sizeof(usa);
|
||||
|
||||
@@ -6512,19 +6515,19 @@ static int is_valid_uri(const char *uri)
|
||||
static int getreq(struct mg_connection *conn, char *ebuf, size_t ebuf_len, int timeout)
|
||||
{
|
||||
const char *cl;
|
||||
struct pollfd pfd;
|
||||
|
||||
reset_per_request_attributes(conn);
|
||||
if (timeout >= 0) {
|
||||
pfd.fd = conn->client.sock;
|
||||
switch (poll(&pfd, 1, timeout)) {
|
||||
case 0:
|
||||
snprintf(ebuf, ebuf_len, "%s", "Timed out");
|
||||
return 0;
|
||||
case -1:
|
||||
snprintf(ebuf, ebuf_len, "%s", "Interrupted");
|
||||
return 0;
|
||||
}
|
||||
struct pollfd pfd;
|
||||
|
||||
reset_per_request_attributes(conn);
|
||||
if (timeout >= 0) {
|
||||
pfd.fd = conn->client.sock;
|
||||
switch (poll(&pfd, 1, timeout)) {
|
||||
case 0:
|
||||
snprintf(ebuf, ebuf_len, "%s", "Timed out");
|
||||
return 0;
|
||||
case -1:
|
||||
snprintf(ebuf, ebuf_len, "%s", "Interrupted");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ebuf[0] = '\0';
|
||||
|
||||
Reference in New Issue
Block a user