Make http server IPv6 ready

This commit is contained in:
BtbN 2013-01-15 03:05:21 +01:00
parent abd5487cc7
commit b08a3c40d7
4 changed files with 43 additions and 12 deletions

View file

@ -247,9 +247,12 @@ void
http_error(http_connection_t *hc, int error)
{
const char *errtxt = http_rc2str(error);
char *addrstr = (char*)malloc(50);
tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrstr, 50);
tvhlog(LOG_ERR, "HTTP", "%s: %s -- %d",
inet_ntoa(hc->hc_peer->sin_addr), hc->hc_url, error);
addrstr, hc->hc_url, error);
free(addrstr);
htsbuf_queue_flush(&hc->hc_reply);
@ -315,10 +318,13 @@ http_access_verify(http_connection_t *hc, int mask)
{
const char *ticket_id = http_arg_get(&hc->hc_req_args, "ticket");
if(!access_ticket_verify(ticket_id, hc->hc_url)) {
if(!access_ticket_verify(ticket_id, hc->hc_url))
{
char *addrstr = (char*)malloc(50);
tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrstr, 50);
tvhlog(LOG_INFO, "HTTP", "%s: using ticket %s for %s",
inet_ntoa(hc->hc_peer->sin_addr), ticket_id,
hc->hc_url);
addrstr, ticket_id, hc->hc_url);
free(addrstr);
return 0;
}
@ -504,11 +510,9 @@ process_request(http_connection_t *hc, htsbuf_queue_t *spill)
if(hc->hc_username != NULL) {
hc->hc_representative = strdup(hc->hc_username);
} else {
hc->hc_representative = malloc(30);
hc->hc_representative = malloc(50);
/* Not threadsafe ? */
snprintf(hc->hc_representative, 30,
"%s", inet_ntoa(hc->hc_peer->sin_addr));
tcp_get_ip_str((struct sockaddr*)hc->hc_peer, hc->hc_representative, 50);
}
switch(hc->hc_version) {
@ -777,8 +781,8 @@ http_serve_requests(http_connection_t *hc, htsbuf_queue_t *spill)
*
*/
static void
http_serve(int fd, void *opaque, struct sockaddr_in *peer,
struct sockaddr_in *self)
http_serve(int fd, void *opaque, struct sockaddr_storage *peer,
struct sockaddr_storage *self)
{
htsbuf_queue_t spill;
http_connection_t hc;

View file

@ -39,8 +39,8 @@ typedef struct http_arg {
typedef struct http_connection {
int hc_fd;
struct sockaddr_in *hc_peer;
struct sockaddr_in *hc_self;
struct sockaddr_storage *hc_peer;
struct sockaddr_storage *hc_self;
char *hc_representative;
char *hc_url;

View file

@ -344,6 +344,31 @@ tcp_read_timeout(int fd, void *buf, size_t len, int timeout)
}
/**
*
*/
char *
tcp_get_ip_str(const struct sockaddr *sa, char *s, size_t maxlen)
{
if(sa == NULL || s == NULL)
return NULL;
switch(sa->sa_family)
{
case AF_INET:
inet_ntop(AF_INET, &(((struct sockaddr_in*)sa)->sin_addr), s, maxlen);
break;
case AF_INET6:
inet_ntop(AF_INET6, &(((struct sockaddr_in6*)sa)->sin6_addr), s, maxlen);
break;
default:
strncpy(s, "Unknown AF", maxlen);
return NULL;
}
return s;
}
/**
*
*/

View file

@ -44,4 +44,6 @@ int tcp_write_queue(int fd, htsbuf_queue_t *q);
int tcp_read_timeout(int fd, void *buf, size_t len, int timeout);
char *tcp_get_ip_str(const struct sockaddr *sa, char *s, size_t maxlen);
#endif /* TCP_H_ */