copy the request entity to temporary file if the source is stdin and if it is not a regular file
This commit is contained in:
parent
39eb1e4753
commit
eb6ba2a703
|
@ -2082,6 +2082,42 @@ int run(char **uris, int n) {
|
||||||
struct stat data_stat;
|
struct stat data_stat;
|
||||||
|
|
||||||
if (!config.datafile.empty()) {
|
if (!config.datafile.empty()) {
|
||||||
|
if (config.datafile == "-") {
|
||||||
|
if (fstat(0, &data_stat) == 0 &&
|
||||||
|
(data_stat.st_mode & S_IFMT) == S_IFREG) {
|
||||||
|
// use STDIN if it is a regular file
|
||||||
|
data_fd = 0;
|
||||||
|
} else {
|
||||||
|
// copy the contents of STDIN to a temporary file
|
||||||
|
char tempfn[] = "/tmp/nghttp.temp.XXXXXX";
|
||||||
|
data_fd = mkstemp(tempfn);
|
||||||
|
if (data_fd == -1) {
|
||||||
|
std::cerr << "[ERROR] Could not create a temporary file in /tmp"
|
||||||
|
<< std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
while (1) {
|
||||||
|
char buf[1024];
|
||||||
|
ssize_t rret, wret;
|
||||||
|
while ((rret = read(0, buf, sizeof(buf))) == -1 && errno == EINTR)
|
||||||
|
;
|
||||||
|
if (rret == 0)
|
||||||
|
break;
|
||||||
|
if (rret == -1) {
|
||||||
|
std::cerr << "[ERROR] I/O error while reading from STDIN"
|
||||||
|
<< std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
while ((wret = write(data_fd, buf, rret)) == -1 && errno == EINTR)
|
||||||
|
;
|
||||||
|
if (wret != rret) {
|
||||||
|
std::cerr << "[ERROR] I/O error while writing to temporary file"
|
||||||
|
<< std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
data_fd = open(config.datafile.c_str(), O_RDONLY | O_BINARY);
|
data_fd = open(config.datafile.c_str(), O_RDONLY | O_BINARY);
|
||||||
if (data_fd == -1) {
|
if (data_fd == -1) {
|
||||||
std::cerr << "[ERROR] Could not open file " << config.datafile
|
std::cerr << "[ERROR] Could not open file " << config.datafile
|
||||||
|
@ -2094,6 +2130,7 @@ int run(char **uris, int n) {
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
data_prd.source.fd = data_fd;
|
data_prd.source.fd = data_fd;
|
||||||
data_prd.read_callback = file_read_callback;
|
data_prd.read_callback = file_read_callback;
|
||||||
}
|
}
|
||||||
|
@ -2369,7 +2406,7 @@ int main(int argc, char **argv) {
|
||||||
config.stat = true;
|
config.stat = true;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
config.datafile = strcmp("-", optarg) == 0 ? "/dev/stdin" : optarg;
|
config.datafile = optarg;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
config.multiply = strtoul(optarg, nullptr, 10);
|
config.multiply = strtoul(optarg, nullptr, 10);
|
||||||
|
|
Loading…
Reference in New Issue