Revert "Revert "Upgrade to 2.1.8-stable (2017-01-22)." and "Probably Mac build fix?""

This reverts commit 83a0c9c65a60a92d3ea5542596b3ba56db492c37.

Bug: 64543673
Test: make checkbuild
Test: Manual tombstoned test
Change-Id: I84bb128d1dec433195f2cbdbf70236ba17fa9955
diff --git a/sample/http-connect.c b/sample/http-connect.c
new file mode 100644
index 0000000..a44d001
--- /dev/null
+++ b/sample/http-connect.c
@@ -0,0 +1,117 @@
+#include "event2/event-config.h"
+
+#include <event2/event.h>
+#include <event2/http.h>
+#include <event2/http_struct.h>
+#include <event2/buffer.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+
+#define VERIFY(cond) do {                       \
+	if (!(cond)) {                              \
+		fprintf(stderr, "[error] %s\n", #cond); \
+	}                                           \
+} while (0);                                    \
+
+#define URL_MAX 4096
+
+struct connect_base
+{
+	struct evhttp_connection *evcon;
+	struct evhttp_uri *location;
+};
+
+static void get_cb(struct evhttp_request *req, void *arg)
+{
+	ev_ssize_t len;
+	struct evbuffer *evbuf;
+
+	VERIFY(req);
+
+	evbuf = evhttp_request_get_input_buffer(req);
+	len = evbuffer_get_length(evbuf);
+	fwrite(evbuffer_pullup(evbuf, len), len, 1, stdout);
+	evbuffer_drain(evbuf, len);
+}
+
+static void connect_cb(struct evhttp_request *proxy_req, void *arg)
+{
+	char buffer[URL_MAX];
+
+	struct connect_base *base = arg;
+	struct evhttp_connection *evcon = base->evcon;
+	struct evhttp_uri *location = base->location;
+
+	VERIFY(proxy_req);
+	if (evcon) {
+		struct evhttp_request *req = evhttp_request_new(get_cb, NULL);
+		evhttp_add_header(req->output_headers, "Connection", "close");
+		VERIFY(!evhttp_make_request(evcon, req, EVHTTP_REQ_GET,
+			evhttp_uri_join(location, buffer, URL_MAX)));
+	}
+}
+
+int main(int argc, const char **argv)
+{
+	char buffer[URL_MAX];
+
+	struct evhttp_uri *host_port;
+	struct evhttp_uri *location;
+	struct evhttp_uri *proxy;
+
+	struct event_base *base;
+	struct evhttp_connection *evcon;
+	struct evhttp_request *req;
+
+	struct connect_base connect_base;
+
+	if (argc != 3) {
+		printf("Usage: %s proxy url\n", argv[0]);
+		return 1;
+	}
+
+	{
+		proxy = evhttp_uri_parse(argv[1]);
+		VERIFY(evhttp_uri_get_host(proxy));
+		VERIFY(evhttp_uri_get_port(proxy) > 0);
+	}
+	{
+		host_port = evhttp_uri_parse(argv[2]);
+		evhttp_uri_set_scheme(host_port, NULL);
+		evhttp_uri_set_userinfo(host_port, NULL);
+		evhttp_uri_set_path(host_port, NULL);
+		evhttp_uri_set_query(host_port, NULL);
+		evhttp_uri_set_fragment(host_port, NULL);
+		VERIFY(evhttp_uri_get_host(host_port));
+		VERIFY(evhttp_uri_get_port(host_port) > 0);
+	}
+	{
+		location = evhttp_uri_parse(argv[2]);
+		evhttp_uri_set_scheme(location, NULL);
+		evhttp_uri_set_userinfo(location, 0);
+		evhttp_uri_set_host(location, NULL);
+		evhttp_uri_set_port(location, -1);
+	}
+
+	VERIFY(base = event_base_new());
+	VERIFY(evcon = evhttp_connection_base_new(base, NULL,
+		evhttp_uri_get_host(proxy), evhttp_uri_get_port(proxy)));
+	connect_base.evcon = evcon;
+	connect_base.location = location;
+	VERIFY(req = evhttp_request_new(connect_cb, &connect_base));
+
+	evhttp_add_header(req->output_headers, "Connection", "keep-alive");
+	evhttp_add_header(req->output_headers, "Proxy-Connection", "keep-alive");
+	evutil_snprintf(buffer, URL_MAX, "%s:%d",
+		evhttp_uri_get_host(host_port), evhttp_uri_get_port(host_port));
+	evhttp_make_request(evcon, req, EVHTTP_REQ_CONNECT, buffer);
+
+	event_base_dispatch(base);
+	evhttp_connection_free(evcon);
+	event_base_free(base);
+	evhttp_uri_free(proxy);
+	evhttp_uri_free(host_port);
+	evhttp_uri_free(location);
+	return 0;
+}