summaryrefslogtreecommitdiff
path: root/src/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket.c')
-rw-r--r--src/socket.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/socket.c b/src/socket.c
index f488c531e5..be60f9458c 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -456,7 +456,7 @@ inline static int wrap_pull_timeout_func(gnutls_transport_ptr_t ptr,
void
socket_open2(socket_st * hd, const char *hostname, const char *service,
- const char *app_proto, int flags, const char *msg, gnutls_datum_t *rdata,
+ const char *app_proto, int flags, const char *msg, gnutls_datum_t *rdata, gnutls_datum_t *edata,
FILE *server_trace, FILE *client_trace)
{
struct addrinfo hints, *res, *ptr;
@@ -479,6 +479,11 @@ socket_open2(socket_st * hd, const char *hostname, const char *service,
hd->rdata.size = rdata->size;
}
+ if (edata) {
+ hd->edata.data = edata->data;
+ hd->edata.size = edata->size;
+ }
+
ret = gnutls_idna_map(hostname, strlen(hostname), &idna, 0);
if (ret < 0) {
fprintf(stderr, "Cannot convert %s to IDNA: %s\n", hostname, gnutls_strerror(ret));
@@ -564,6 +569,13 @@ socket_open2(socket_st * hd, const char *hostname, const char *service,
}
if (hd->session) {
+ if (hd->edata.data) {
+ ret = gnutls_record_send_early_data(hd->session, hd->edata.data, hd->edata.size);
+ if (ret < 0) {
+ fprintf(stderr, "error sending early data\n");
+ exit(1);
+ }
+ }
if (hd->rdata.data) {
gnutls_session_set_data(hd->session, hd->rdata.data, hd->rdata.size);
}
@@ -621,6 +633,8 @@ socket_open2(socket_st * hd, const char *hostname, const char *service,
hd->addr_info = res;
gnutls_free(hd->rdata.data);
hd->rdata.data = NULL;
+ gnutls_free(hd->edata.data);
+ hd->edata.data = NULL;
gnutls_free(idna.data);
return;
}