Compare commits
	
		
			5 Commits
		
	
	
		
			v4.5
			...
			c060ee5bb6
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						c060ee5bb6
	
				 | 
					
					
						|||
| 
						
						
							
						
						4062883cb3
	
				 | 
					
					
						|||
| 
						
						
							
						
						e0e44e9c26
	
				 | 
					
					
						|||
| 
						
						
							
						
						f0d8a3db4c
	
				 | 
					
					
						|||
| 
						
						
							
						
						557e176d3d
	
				 | 
					
					
						
							
								
								
									
										14
									
								
								src/client.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/client.c
									
									
									
									
									
								
							@@ -561,12 +561,16 @@ int client_request_handler(sock *client, unsigned long client_num, unsigned int
 | 
				
			|||||||
            const http_doc_info *info = http_get_status_info(res.status);
 | 
					            const http_doc_info *info = http_get_status_info(res.status);
 | 
				
			||||||
            const http_status_msg *http_msg = http_get_error_msg(res.status);
 | 
					            const http_status_msg *http_msg = http_get_error_msg(res.status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (res.status->code >= 300 && res.status->code < 400 && msg_content[0] == 0) {
 | 
					            if (msg_content[0] == 0) {
 | 
				
			||||||
                const char *location = http_get_header_field(&res.hdr, "Location");
 | 
					                if (res.status->code >= 300 && res.status->code < 400) {
 | 
				
			||||||
                if (location != NULL) {
 | 
					                    const char *location = http_get_header_field(&res.hdr, "Location");
 | 
				
			||||||
                    snprintf(msg_content, sizeof(msg_content),
 | 
					                    if (location != NULL) {
 | 
				
			||||||
                             "<ul>\n\t<li><a href=\"%1$s\">%1$s</a></li>\n</ul>\n", location);
 | 
					                        snprintf(msg_content, sizeof(msg_content), "<ul>\n\t<li><a href=\"%1$s\">%1$s</a></li>\n</ul>\n", location);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            } else if (strncmp(msg_content, "<!DOCTYPE html>", 15) == 0 || strncmp(msg_content, "<html", 5) == 0) {
 | 
				
			||||||
 | 
					                msg_content[0] = 0;
 | 
				
			||||||
 | 
					                // TODO let relevant information pass?
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            char *rev_proxy_doc = "";
 | 
					            char *rev_proxy_doc = "";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -128,7 +128,7 @@ int rev_proxy_request_header(http_req *req, int enc) {
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int rev_proxy_response_header(http_req *req, http_res *res) {
 | 
					int rev_proxy_response_header(http_req *req, http_res *res, host_config *conf) {
 | 
				
			||||||
    char buf1[256];
 | 
					    char buf1[256];
 | 
				
			||||||
    char buf2[256];
 | 
					    char buf2[256];
 | 
				
			||||||
    int p_len;
 | 
					    int p_len;
 | 
				
			||||||
@@ -151,6 +151,32 @@ int rev_proxy_response_header(http_req *req, http_res *res) {
 | 
				
			|||||||
        http_add_header_field(&res->hdr, "Via", buf2);
 | 
					        http_add_header_field(&res->hdr, "Via", buf2);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    char *location = http_get_header_field(&res->hdr, "Location");
 | 
				
			||||||
 | 
					    if (location != NULL) {
 | 
				
			||||||
 | 
					        char *hostnames[] = {conf->name, conf->rev_proxy.hostname};
 | 
				
			||||||
 | 
					        for (int i = 0; i < sizeof(hostnames) / sizeof(hostnames[0]); i++) {
 | 
				
			||||||
 | 
					            char *hostname = hostnames[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            p_len = snprintf(buf1, sizeof(buf1), "http://%s/", hostname);
 | 
				
			||||||
 | 
					            if (strncmp(location, buf1, p_len) == 0) goto match;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            p_len = snprintf(buf1, sizeof(buf1), "https://%s/", hostname);
 | 
				
			||||||
 | 
					            if (strncmp(location, buf1, p_len) == 0) goto match;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            p_len = snprintf(buf1, sizeof(buf1), "http://%s:%i/", hostname, conf->rev_proxy.port);
 | 
				
			||||||
 | 
					            if (strncmp(location, buf1, p_len) == 0) goto match;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            p_len = snprintf(buf1, sizeof(buf1), "https://%s:%i/", hostname, conf->rev_proxy.port);
 | 
				
			||||||
 | 
					            if (strncmp(location, buf1, p_len) == 0) goto match;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (0) {
 | 
				
			||||||
 | 
					            match:
 | 
				
			||||||
 | 
					            http_remove_header_field(&res->hdr, "Location", HTTP_REMOVE_ALL);
 | 
				
			||||||
 | 
					            http_add_header_field(&res->hdr, "Location", location + p_len - 1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -338,6 +364,7 @@ int rev_proxy_init(http_req *req, http_res *res, http_status_ctx *ctx, host_conf
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        print(ERR_STR "Unable to receive response from server: %s" CLR_STR, sock_strerror(&rev_proxy));
 | 
					        print(ERR_STR "Unable to receive response from server: %s" CLR_STR, sock_strerror(&rev_proxy));
 | 
				
			||||||
        sprintf(err_msg, "Unable to receive response from server: %s.", sock_strerror(&rev_proxy));
 | 
					        sprintf(err_msg, "Unable to receive response from server: %s.", sock_strerror(&rev_proxy));
 | 
				
			||||||
 | 
					        retry = tries < 4;
 | 
				
			||||||
        goto proxy_err;
 | 
					        goto proxy_err;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -412,7 +439,7 @@ int rev_proxy_init(http_req *req, http_res *res, http_status_ctx *ctx, host_conf
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    sock_recv(&rev_proxy, buffer, header_len, 0);
 | 
					    sock_recv(&rev_proxy, buffer, header_len, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = rev_proxy_response_header(req, res);
 | 
					    ret = rev_proxy_response_header(req, res, conf);
 | 
				
			||||||
    if (ret != 0) {
 | 
					    if (ret != 0) {
 | 
				
			||||||
        res->status = http_get_status(500);
 | 
					        res->status = http_get_status(500);
 | 
				
			||||||
        ctx->origin = INTERNAL;
 | 
					        ctx->origin = INTERNAL;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ int rev_proxy_preload();
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
int rev_proxy_request_header(http_req *req, int enc);
 | 
					int rev_proxy_request_header(http_req *req, int enc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int rev_proxy_response_header(http_req *req, http_res *res);
 | 
					int rev_proxy_response_header(http_req *req, http_res *res, host_config *conf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int rev_proxy_init(http_req *req, http_res *res, http_status_ctx *ctx, host_config *conf, sock *client,
 | 
					int rev_proxy_init(http_req *req, http_res *res, http_status_ctx *ctx, host_config *conf, sock *client,
 | 
				
			||||||
                   http_status *custom_status, char *err_msg);
 | 
					                   http_status *custom_status, char *err_msg);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user