|
24 | 24 | #include <stdlib.h> |
25 | 25 | #include <string.h> |
26 | 26 | #include <arpa/inet.h> |
| 27 | +#include <sstream> |
| 28 | +#include <iomanip> |
27 | 29 | //#include <boost/xpressive/xpressive.hpp> |
28 | 30 |
|
| 31 | +using namespace std; |
| 32 | + |
29 | 33 | namespace httpserver { |
30 | 34 | namespace http { |
31 | 35 |
|
@@ -201,6 +205,20 @@ std::string get_ip_str(const struct sockaddr *sa, socklen_t maxlen) |
201 | 205 | return std::string(res); |
202 | 206 | } |
203 | 207 |
|
| 208 | +const struct sockaddr str_to_ip(const std::string& src) |
| 209 | +{ |
| 210 | + struct sockaddr s; |
| 211 | + if(src.find(":") != std::string::npos) |
| 212 | + { |
| 213 | + inet_pton(AF_INET6, src.c_str(), (void*) &s); |
| 214 | + } |
| 215 | + else |
| 216 | + { |
| 217 | + inet_pton(AF_INET, src.c_str(), (void*) &s); |
| 218 | + } |
| 219 | + return s; |
| 220 | +} |
| 221 | + |
204 | 222 | short get_port(const struct sockaddr* sa) |
205 | 223 | { |
206 | 224 | switch(sa->sa_family) |
@@ -252,5 +270,158 @@ size_t http_unescape (char *val) |
252 | 270 | return wpos - val; /* = strlen(val) */ |
253 | 271 | } |
254 | 272 |
|
| 273 | +ip_representation::ip_representation(const struct sockaddr* ip) |
| 274 | +{ |
| 275 | + std::fill(pieces, pieces + 16, 0); |
| 276 | + if(ip->sa_family == AF_INET) |
| 277 | + { |
| 278 | + ip_version = HttpUtils::IPV4; |
| 279 | + for(int i=0;i<4;i++) |
| 280 | + { |
| 281 | + pieces[12+i] = ((u_char*)&(((struct sockaddr_in *)ip)->sin_addr))[i]; |
| 282 | + } |
| 283 | + } |
| 284 | + else |
| 285 | + { |
| 286 | + ip_version = HttpUtils::IPV6; |
| 287 | + for(int i=0;i<32;i+=2) |
| 288 | + { |
| 289 | + pieces[i/2] = ip->sa_data[i] + 16 * ip->sa_data[i+1]; |
| 290 | + } |
| 291 | + } |
| 292 | + std::fill(mask, mask + 16, 1); |
| 293 | +} |
| 294 | + |
| 295 | +ip_representation::ip_representation(const std::string& ip) |
| 296 | +{ |
| 297 | + std::vector<std::string> parts; |
| 298 | + std::fill(mask, mask + 16, 1); |
| 299 | + std::fill(pieces, pieces + 16, 0); |
| 300 | + if(ip.find(':') != std::string::npos) //IPV6 |
| 301 | + { |
| 302 | + ip_version = HttpUtils::IPV6; |
| 303 | + parts = string_utilities::string_split(ip, ':', false); |
| 304 | + int y = 0; |
| 305 | + for(unsigned int i = 0; i < parts.size(); i++) |
| 306 | + { |
| 307 | + if(parts[i] != "*" && parts[i] != "") |
| 308 | + { |
| 309 | + if(parts[i].size() < 4) |
| 310 | + { |
| 311 | + stringstream ss; |
| 312 | + ss << setfill('0') << setw(4) << parts[i]; |
| 313 | + parts[i] = ss.str(); |
| 314 | + } |
| 315 | + if(parts[i].size() == 4) |
| 316 | + { |
| 317 | + pieces[y] = strtol((parts[i].substr(0,2)).c_str(),NULL,16); |
| 318 | + pieces[y+1] = strtol((parts[i].substr(2,2)).c_str(), NULL, 16); |
| 319 | + y += 2; |
| 320 | + } |
| 321 | + else |
| 322 | + { |
| 323 | + if(y != 12) |
| 324 | + { |
| 325 | + //errore |
| 326 | + } |
| 327 | + if(parts[i].find('.') != std::string::npos) |
| 328 | + { |
| 329 | + vector<string> subparts = string_utilities::string_split(parts[i], '.'); |
| 330 | + if(subparts.size() == 4) |
| 331 | + { |
| 332 | + for(unsigned int ii = 0; ii < subparts.size(); ii++) |
| 333 | + { |
| 334 | + if(subparts[ii] != "*") |
| 335 | + { |
| 336 | + pieces[y+ii] = strtol(subparts[ii].c_str(), NULL, 10); |
| 337 | + } |
| 338 | + else |
| 339 | + { |
| 340 | + mask[y+ii] = 0; |
| 341 | + } |
| 342 | + y++; |
| 343 | + } |
| 344 | + } |
| 345 | + else |
| 346 | + { |
| 347 | + //errore |
| 348 | + } |
| 349 | + } |
| 350 | + else |
| 351 | + { |
| 352 | + //errore |
| 353 | + } |
| 354 | + } |
| 355 | + } |
| 356 | + else if(parts[i] == "*") |
| 357 | + { |
| 358 | + mask[y] = 0; |
| 359 | + y++; |
| 360 | + } |
| 361 | + else |
| 362 | + { |
| 363 | + if(parts.size() <= 8) |
| 364 | + { |
| 365 | + int covered_pieces = 1 + (8 - parts.size()); |
| 366 | + if(parts[parts.size() - 1].find('.') != std::string::npos) |
| 367 | + { |
| 368 | + covered_pieces -= 2; |
| 369 | + } |
| 370 | + for(int k = 0; k < covered_pieces; k++) |
| 371 | + { |
| 372 | + pieces[y] = 0; |
| 373 | + y++; |
| 374 | + } |
| 375 | + } |
| 376 | + else |
| 377 | + { |
| 378 | + //errore |
| 379 | + } |
| 380 | + } |
| 381 | + } |
| 382 | + } |
| 383 | + else //IPV4 |
| 384 | + { |
| 385 | + ip_version = HttpUtils::IPV4; |
| 386 | + parts = string_utilities::string_split(ip, '.'); |
| 387 | + if(parts.size() == 4) |
| 388 | + { |
| 389 | + for(unsigned int i = 0; i < parts.size(); i++) |
| 390 | + { |
| 391 | + if(parts[i] != "*") |
| 392 | + { |
| 393 | + pieces[12+i] = strtol(parts[i].c_str(), NULL, 10); |
| 394 | + } |
| 395 | + else |
| 396 | + { |
| 397 | + mask[12+i] = 0; |
| 398 | + } |
| 399 | + } |
| 400 | + } |
| 401 | + else |
| 402 | + { |
| 403 | + //errore |
| 404 | + } |
| 405 | + } |
| 406 | +} |
| 407 | + |
| 408 | +bool ip_representation::operator <(const ip_representation& b) const |
| 409 | +{ |
| 410 | + int VAL = 16; |
| 411 | + if(this->ip_version == HttpUtils::IPV4 && this->ip_version == b.ip_version) |
| 412 | + { |
| 413 | + VAL = this->ip_version; |
| 414 | + } |
| 415 | + for(int i = 16 - VAL; i < 16; i++) |
| 416 | + { |
| 417 | + if(this->mask[i] == 1 && b.mask[i] == 1 && this->pieces[i] < b.pieces[i]) |
| 418 | + { |
| 419 | + return true; |
| 420 | + } |
| 421 | + } |
| 422 | + return false; |
| 423 | +} |
| 424 | + |
| 425 | + |
255 | 426 | }; |
256 | 427 | }; |
0 commit comments