summaryrefslogtreecommitdiff
path: root/src/tool/client.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/tool/client.cc')
-rw-r--r--src/tool/client.cc18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/tool/client.cc b/src/tool/client.cc
index 57e1b6e6..fa279ae5 100644
--- a/src/tool/client.cc
+++ b/src/tool/client.cc
@@ -122,7 +122,8 @@ static const struct argument kArguments[] = {
},
{
"-early-data", kOptionalArgument, "Enable early data. The argument to "
- "this flag is the early data to send.",
+ "this flag is the early data to send or if it starts with '@', the "
+ "file to read from for early data.",
},
{
"-tls13-variant", kOptionalArgument,
@@ -299,8 +300,19 @@ static bool DoConnection(SSL_CTX *ctx,
}
if (args_map.count("-early-data") != 0 && SSL_in_early_data(ssl.get())) {
- int ed_size = args_map["-early-data"].size();
- int ssl_ret = SSL_write(ssl.get(), args_map["-early-data"].data(), ed_size);
+ std::string early_data = args_map["-early-data"];
+ if (early_data.size() > 0 && early_data[0] == '@') {
+ const char *filename = early_data.c_str() + 1;
+ std::vector<uint8_t> data;
+ ScopedFILE f(fopen(filename, "rb"));
+ if (f == nullptr || !ReadAll(&data, f.get())) {
+ fprintf(stderr, "Error reading %s.\n", filename);
+ return false;
+ }
+ early_data = std::string(data.begin(), data.end());
+ }
+ int ed_size = early_data.size();
+ int ssl_ret = SSL_write(ssl.get(), early_data.data(), ed_size);
if (ssl_ret <= 0) {
int ssl_err = SSL_get_error(ssl.get(), ssl_ret);
fprintf(stderr, "Error while writing: %d\n", ssl_err);