Skip to content

use CONNECT method if request contains upgrade header #211

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
use CONNECT method if request contains upgrade header
this should allow using websockets or other upgraded connections
on a standard (non-encrypted) proxified HTTP connection.

testcase:
$ telnet localhost 8888
GET / HTTP/1.1
Host: echo.websocket.org:80
Upgrade: websocket
Connection: Upgrade
Origin: http://echo.websocket.org
Sec-WebSocket-Key: 5KNqfsPZ9m/BbeRlVpf7MQ==
Sec-WebSocket-Version: 13
  • Loading branch information
rofl0r committed May 2, 2022
commit 6057ffca8037daf2d148ccfbdf58c8e2e824ac9d
32 changes: 27 additions & 5 deletions src/reqs.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
* connections. The request line is allocated from the heap, but it must
* be freed in another function.
*/
static int read_request_line (struct conn_s *connptr)
static int read_request_line (struct conn_s *connptr, char** lines, size_t* lines_len)
{
ssize_t len;

Expand All @@ -104,6 +104,12 @@ static int read_request_line (struct conn_s *connptr)
return -1;
}

*lines = saferealloc(*lines, *lines_len + len + 1);
if(*lines) {
strcpy(*lines + *lines_len, connptr->request_line);
*lines_len += len;
}

/*
* Strip the new line and carriage return from the string.
*/
Expand Down Expand Up @@ -672,7 +678,7 @@ add_header_to_connection (orderedmap hashofheaders, char *header, size_t len)
/*
* Read all the headers from the stream
*/
static int get_all_headers (int fd, orderedmap hashofheaders)
static int get_all_headers (int fd, orderedmap hashofheaders, char** lines, size_t* lines_len)
{
char *line = NULL;
char *header = NULL;
Expand All @@ -692,6 +698,14 @@ static int get_all_headers (int fd, orderedmap hashofheaders)
return -1;
}

if(lines) {
*lines = saferealloc(*lines, *lines_len + linelen + 1);
if(*lines) {
strcpy(*lines + *lines_len, line);
*lines_len += linelen;
}
}

/*
* If we received a CR LF or a non-continuation line, then add
* the accumulated header field, if any, to the hashmap, and
Expand Down Expand Up @@ -1062,7 +1076,7 @@ static int process_server_headers (struct conn_s *connptr)
/*
* Get all the headers from the remote server in a big hash
*/
if (get_all_headers (connptr->server_fd, hashofheaders) < 0) {
if (get_all_headers (connptr->server_fd, hashofheaders, NULL, NULL) < 0) {
log_message (LOG_WARNING,
"Could not retrieve all the headers from the remote server.");
orderedmap_destroy (hashofheaders);
Expand Down Expand Up @@ -1577,6 +1591,8 @@ void handle_connection (struct conn_s *connptr, union sockaddr_union* addr)

char sock_ipaddr[IP_LENGTH];
char peer_ipaddr[IP_LENGTH];
char *lines = NULL;
size_t lines_len = 0;

getpeer_information (addr, peer_ipaddr, sizeof(peer_ipaddr));

Expand Down Expand Up @@ -1620,7 +1636,7 @@ void handle_connection (struct conn_s *connptr, union sockaddr_union* addr)
HC_FAIL();
}

if (read_request_line (connptr) < 0) {
if (read_request_line (connptr, &lines, &lines_len) < 0) {
update_stats (STAT_BADCONN);
indicate_http_error (connptr, 408, "Timeout",
"detail",
Expand All @@ -1646,7 +1662,7 @@ void handle_connection (struct conn_s *connptr, union sockaddr_union* addr)
/*
* Get all the headers from the client in a big hash.
*/
if (get_all_headers (connptr->client_fd, hashofheaders) < 0) {
if (get_all_headers (connptr->client_fd, hashofheaders, &lines, &lines_len) < 0) {
log_message (LOG_WARNING,
"Could not retrieve all the headers from the client");
indicate_http_error (connptr, 400, "Bad Request",
Expand Down Expand Up @@ -1739,6 +1755,11 @@ void handle_connection (struct conn_s *connptr, union sockaddr_union* addr)
"file descriptor %d.", request->host,
connptr->server_fd);

if(orderedmap_find (hashofheaders, "upgrade")) {
connptr->connect_method = TRUE;
safe_write (connptr->server_fd, lines, lines_len);
}

if (!connptr->connect_method)
establish_http_connection (connptr, request);
}
Expand Down Expand Up @@ -1783,6 +1804,7 @@ void handle_connection (struct conn_s *connptr, union sockaddr_union* addr)
connptr->client_fd, connptr->server_fd);

done:
safefree(lines);
free_request_struct (request);
orderedmap_destroy (hashofheaders);
conn_destroy_contents (connptr);
Expand Down
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy