Make http server IPv6 ready
This commit is contained in:
parent
abd5487cc7
commit
b08a3c40d7
4 changed files with 43 additions and 12 deletions
24
src/http.c
24
src/http.c
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
25
src/tcp.c
25
src/tcp.c
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -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_ */
|
||||
|
|
Loading…
Add table
Reference in a new issue