(krb5_sendto_kdc, send_and_recv_http): Add support for using proxy.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4548 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -113,6 +113,7 @@ send_and_recv_tcp(int fd, | |||||||
| static int | static int | ||||||
| send_and_recv_http(int fd,  | send_and_recv_http(int fd,  | ||||||
| 		   time_t tmout, | 		   time_t tmout, | ||||||
|  | 		   const char *prefix, | ||||||
| 		   const krb5_data *send, | 		   const krb5_data *send, | ||||||
| 		   krb5_data *recv) | 		   krb5_data *recv) | ||||||
| { | { | ||||||
| @@ -123,7 +124,7 @@ send_and_recv_http(int fd, | |||||||
|     int len = base64_encode(send->data, send->length, &str); |     int len = base64_encode(send->data, send->length, &str); | ||||||
|     if(len < 0) |     if(len < 0) | ||||||
| 	return -1; | 	return -1; | ||||||
|     asprintf(&request, "GET %s HTTP/1.1\r\n\r\n", str); |     asprintf(&request, "GET %s%s HTTP/1.0\r\n\r\n", prefix, str); | ||||||
|     free(str); |     free(str); | ||||||
|     r.data = request; |     r.data = request; | ||||||
|     r.length = strlen(request); |     r.length = strlen(request); | ||||||
| @@ -136,12 +137,18 @@ send_and_recv_http(int fd, | |||||||
| 	s = realloc(recv->data, recv->length + 1); | 	s = realloc(recv->data, recv->length + 1); | ||||||
| 	s[recv->length] = 0; | 	s[recv->length] = 0; | ||||||
| 	p = strstr(s, "\r\n\r\n"); | 	p = strstr(s, "\r\n\r\n"); | ||||||
| 	if(p == NULL) | 	if(p == NULL) { | ||||||
|  | 	    free(s); | ||||||
| 	    return -1; | 	    return -1; | ||||||
|  | 	} | ||||||
| 	p += 4; | 	p += 4; | ||||||
| 	recv->data = s; | 	recv->data = s; | ||||||
| 	recv->length -= p - s; | 	recv->length -= p - s; | ||||||
| 	memmove(recv->data, p, recv->length); | 	if(recv->length < 4) { /* remove length */ | ||||||
|  | 	    free(s); | ||||||
|  | 	    return -1; | ||||||
|  | 	} | ||||||
|  | 	memmove(recv->data, p + 4, recv->length - 4); | ||||||
|     } |     } | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| @@ -210,6 +217,50 @@ krb5_sendto_kdc (krb5_context context, | |||||||
| 	     } else if(strncmp(p, "udp/", 4) == 0) { | 	     } else if(strncmp(p, "udp/", 4) == 0) { | ||||||
| 		 p += 4; | 		 p += 4; | ||||||
| 	     } | 	     } | ||||||
|  | 	     if(http_flag && context->http_proxy) { | ||||||
|  | 		 char *proxy = strdup(context->http_proxy); | ||||||
|  | 		 char *prefix; | ||||||
|  | 		 struct hostent *hp; | ||||||
|  | 		  | ||||||
|  | 		 colon = strchr(proxy, ':'); | ||||||
|  | 		 if(colon) { | ||||||
|  | 		     *colon = '\0'; | ||||||
|  | 		 } | ||||||
|  | 		 hp = roken_gethostbyname(proxy); | ||||||
|  | 		 if(colon) | ||||||
|  | 		     *colon++ = ':'; | ||||||
|  | 		 if(hp == NULL) { | ||||||
|  | 		     free(proxy); | ||||||
|  | 		     continue; | ||||||
|  | 		 } | ||||||
|  | 		 ret = krb5_h_addr2sockaddr (hp->h_addrtype, | ||||||
|  | 					     hp->h_addr, | ||||||
|  | 					     sa, | ||||||
|  | 					     &sa_size, | ||||||
|  | 					     init_port(colon, htons(80))); | ||||||
|  | 		 free(proxy); | ||||||
|  | 		 if(ret) | ||||||
|  | 		     continue; | ||||||
|  | 		 fd = socket(hp->h_addrtype, SOCK_STREAM, 0); | ||||||
|  | 		 if(fd < 0)  | ||||||
|  | 		     continue; | ||||||
|  | 		 if(connect(fd, sa, sa_size) < 0) { | ||||||
|  | 		     close(fd); | ||||||
|  | 		     continue; | ||||||
|  | 		 } | ||||||
|  | 		 asprintf(&prefix, "http://%s/", p); | ||||||
|  | 		 if(prefix == NULL) { | ||||||
|  | 		     close(fd); | ||||||
|  | 		     continue; | ||||||
|  | 		 } | ||||||
|  | 		 ret = send_and_recv_http(fd, context->kdc_timeout, | ||||||
|  | 					  prefix, send, receive); | ||||||
|  | 		 close (fd); | ||||||
|  | 		 free(prefix); | ||||||
|  | 		 if(ret == 0 && receive->length != 0) | ||||||
|  | 		     goto out; | ||||||
|  | 		 continue; | ||||||
|  | 	     } | ||||||
| 	     colon = strchr (p, ':'); | 	     colon = strchr (p, ':'); | ||||||
| 	     if (colon) | 	     if (colon) | ||||||
| 		 *colon = '\0'; | 		 *colon = '\0'; | ||||||
| @@ -251,7 +302,7 @@ krb5_sendto_kdc (krb5_context context, | |||||||
| 		     | 		     | ||||||
| 		 if(http_flag) | 		 if(http_flag) | ||||||
| 		     ret = send_and_recv_http(fd, context->kdc_timeout, | 		     ret = send_and_recv_http(fd, context->kdc_timeout, | ||||||
| 					      send, receive); | 					      "", send, receive); | ||||||
| 		 else if(tcp_flag) | 		 else if(tcp_flag) | ||||||
| 			 | 			 | ||||||
| 		     ret = send_and_recv_tcp (fd, context->kdc_timeout, | 		     ret = send_and_recv_tcp (fd, context->kdc_timeout, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson