Skip to content

Commit fc37c08

Browse files
committed
Fixed logic to get ip and port.
Added tests to verify the logic.
1 parent 1687cfa commit fc37c08

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

src/http_utils.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#else
3131
#include <sys/socket.h>
3232
#include <netdb.h>
33+
#include <arpa/inet.h>
3334
#endif
3435
#include <sstream>
3536
#include <iomanip>
@@ -246,15 +247,15 @@ std::string get_ip_str(
246247

247248
if(sa)
248249
{
249-
int addrlen = sizeof(sockaddr_in);
250+
char to_ret[NI_MAXHOST];
250251
if (AF_INET6 == sa->sa_family)
251252
{
252-
addrlen = sizeof(sockaddr_in6);
253+
inet_ntop(AF_INET6, &(((sockaddr_in6*) sa)->sin6_addr), to_ret, INET6_ADDRSTRLEN);
254+
result = to_ret;
253255
}
254-
255-
char to_ret[NI_MAXHOST];
256-
if (0 == getnameinfo(sa, addrlen, to_ret, NI_MAXHOST, NULL, 0, NI_NUMERICHOST))
256+
else
257257
{
258+
inet_ntop(AF_INET, &(((sockaddr_in*) sa)->sin_addr), to_ret, INET_ADDRSTRLEN);
258259
result = to_ret;
259260
}
260261
}
@@ -269,17 +270,17 @@ unsigned short get_port(const struct sockaddr* sa)
269270
switch(sa->sa_family)
270271
{
271272
case AF_INET:
272-
return ((struct sockaddr_in *)sa)->sin_port;
273+
return ((struct sockaddr_in*) sa)->sin_port;
273274
case AF_INET6:
274-
return ((struct sockaddr_in *)sa)->sin_port;
275+
return ((struct sockaddr_in6*) sa)->sin6_port;
275276
default:
276277
return 0;
277278
}
278279
}
279280
return 0;
280281
}
281282

282-
size_t http_unescape (char *val)
283+
size_t http_unescape(char *val)
283284
{
284285
char *rpos = val;
285286
char *wpos = val;

test/unit/http_utils_test.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,27 @@ LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str)
8787
ip4addr.sin_port = htons(3490);
8888
ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1");
8989

90-
string result = "";
91-
result = http::get_ip_str((struct sockaddr *) &ip4addr);
90+
string result = http::get_ip_str((struct sockaddr*) &ip4addr);
91+
unsigned short port = http::get_port((struct sockaddr*) &ip4addr);
9292

9393
LT_CHECK_EQ(result, "127.0.0.1");
94+
LT_CHECK_EQ(port, htons(3490));
9495
LT_END_AUTO_TEST(ip_to_str)
9596

97+
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str6)
98+
struct sockaddr_in6 ip6addr;
99+
100+
ip6addr.sin6_family = AF_INET6;
101+
ip6addr.sin6_port = htons(3490);
102+
inet_pton(AF_INET6, "2001:db8:8714:3a90::12", &(ip6addr.sin6_addr));
103+
104+
string result = http::get_ip_str((struct sockaddr *) &ip6addr);
105+
unsigned short port = http::get_port((struct sockaddr*) &ip6addr);
106+
107+
LT_CHECK_EQ(result, "2001:db8:8714:3a90::12");
108+
LT_CHECK_EQ(port, htons(3490));
109+
LT_END_AUTO_TEST(ip_to_str6)
110+
96111
LT_BEGIN_AUTO_TEST_ENV()
97112
AUTORUN_TESTS()
98113
LT_END_AUTO_TEST_ENV()

0 commit comments

Comments
 (0)