Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
pygeoip
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
pygeoip
Commits
b7ac752f
Commit
b7ac752f
authored
Sep 28, 2012
by
William Tisäter
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add IPv6 support to country_name_by_*
parent
55d3de43
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
32 additions
and
19 deletions
+32
-19
pygeoip/__init__.py
+16
-18
pygeoip/const.py
+1
-0
tests/test_country.py
+15
-1
No files found.
pygeoip/__init__.py
View file @
b7ac752f
...
@@ -365,6 +365,18 @@ class GeoIP(GeoIPBase):
...
@@ -365,6 +365,18 @@ class GeoIP(GeoIPBase):
return
record
return
record
def
_gethostbyname
(
self
,
hostname
):
if
self
.
_databaseType
in
const
.
IPV6_EDITIONS
:
try
:
response
=
socket
.
getaddrinfo
(
hostname
,
0
,
socket
.
AF_INET6
)
except
socket
.
gaierror
:
return
''
family
,
socktype
,
proto
,
canonname
,
sockaddr
=
response
[
0
]
address
,
port
,
flow
,
scope
=
sockaddr
return
address
else
:
return
socket
.
gethostbyname
(
hostname
)
def
id_by_addr
(
self
,
addr
):
def
id_by_addr
(
self
,
addr
):
"""
"""
Get the country index.
Get the country index.
...
@@ -427,24 +439,9 @@ class GeoIP(GeoIPBase):
...
@@ -427,24 +439,9 @@ class GeoIP(GeoIPBase):
@return: 2-letter country code
@return: 2-letter country code
@rtype: str
@rtype: str
"""
"""
if
self
.
_databaseType
==
const
.
COUNTRY_EDITION_V6
:
addr
=
self
.
_gethostbyname
(
hostname
)
return
self
.
_country_code_by_name_v6
(
hostname
)
else
:
return
self
.
_country_code_by_name_v4
(
hostname
)
def
_country_code_by_name_v4
(
self
,
hostname
):
addr
=
socket
.
gethostbyname
(
hostname
)
return
self
.
country_code_by_addr
(
addr
)
return
self
.
country_code_by_addr
(
addr
)
def
_country_code_by_name_v6
(
self
,
hostname
):
try
:
response
=
socket
.
getaddrinfo
(
hostname
,
0
,
socket
.
AF_INET6
)
except
socket
.
gaierror
:
return
''
family
,
socktype
,
proto
,
canonname
,
sockaddr
=
response
[
0
]
address
,
port
,
flow
,
scope
=
sockaddr
return
self
.
country_code_by_addr
(
address
)
def
country_name_by_addr
(
self
,
addr
):
def
country_name_by_addr
(
self
,
addr
):
"""
"""
Returns full country name for specified IP address.
Returns full country name for specified IP address.
...
@@ -456,7 +453,8 @@ class GeoIP(GeoIPBase):
...
@@ -456,7 +453,8 @@ class GeoIP(GeoIPBase):
@rtype: str
@rtype: str
"""
"""
try
:
try
:
if
self
.
_databaseType
==
const
.
COUNTRY_EDITION
:
COUNTRY_EDITIONS
=
(
const
.
COUNTRY_EDITION
,
const
.
COUNTRY_EDITION_V6
)
if
self
.
_databaseType
in
COUNTRY_EDITIONS
:
return
const
.
COUNTRY_NAMES
[
self
.
id_by_addr
(
addr
)]
return
const
.
COUNTRY_NAMES
[
self
.
id_by_addr
(
addr
)]
elif
self
.
_databaseType
in
const
.
CITY_EDITIONS
:
elif
self
.
_databaseType
in
const
.
CITY_EDITIONS
:
return
self
.
record_by_addr
(
addr
)[
'country_name'
]
return
self
.
record_by_addr
(
addr
)[
'country_name'
]
...
@@ -476,7 +474,7 @@ class GeoIP(GeoIPBase):
...
@@ -476,7 +474,7 @@ class GeoIP(GeoIPBase):
@return: country name
@return: country name
@rtype: str
@rtype: str
"""
"""
addr
=
s
ocket
.
gethostbyname
(
hostname
)
addr
=
s
elf
.
_
gethostbyname
(
hostname
)
return
self
.
country_name_by_addr
(
addr
)
return
self
.
country_name_by_addr
(
addr
)
def
org_by_addr
(
self
,
addr
):
def
org_by_addr
(
self
,
addr
):
...
...
pygeoip/const.py
View file @
b7ac752f
...
@@ -369,6 +369,7 @@ NETSPEED_EDITION = 11
...
@@ -369,6 +369,7 @@ NETSPEED_EDITION = 11
COUNTRY_EDITION_V6
=
12
COUNTRY_EDITION_V6
=
12
# Collection of databases
# Collection of databases
IPV6_EDITIONS
=
(
COUNTRY_EDITION_V6
,)
CITY_EDITIONS
=
(
CITY_EDITION_REV0
,
CITY_EDITION_REV1
)
CITY_EDITIONS
=
(
CITY_EDITION_REV0
,
CITY_EDITION_REV1
)
REGION_EDITIONS
=
(
REGION_EDITION_REV0
,
REGION_EDITION_REV1
)
REGION_EDITIONS
=
(
REGION_EDITION_REV0
,
REGION_EDITION_REV1
)
REGION_CITY_EDITIONS
=
REGION_EDITIONS
+
CITY_EDITIONS
REGION_CITY_EDITIONS
=
REGION_EDITIONS
+
CITY_EDITIONS
...
...
tests/test_country.py
View file @
b7ac752f
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
import
unittest
import
unittest
import
pygeoip
import
pygeoip
from
tests.config
import
COUNTRY_DB_PATH
from
tests.config
import
COUNTRY_DB_PATH
,
COUNTRY_V6_DB_PATH
class
TestGeoIPCountryFunctions
(
unittest
.
TestCase
):
class
TestGeoIPCountryFunctions
(
unittest
.
TestCase
):
...
@@ -13,38 +13,52 @@ class TestGeoIPCountryFunctions(unittest.TestCase):
...
@@ -13,38 +13,52 @@ class TestGeoIPCountryFunctions(unittest.TestCase):
self
.
us_ip
=
'64.233.161.99'
self
.
us_ip
=
'64.233.161.99'
self
.
gb_ip
=
'212.58.253.68'
self
.
gb_ip
=
'212.58.253.68'
self
.
ie6_hostname
=
'google.com'
self
.
ie6_ip
=
'2a00:1450:400f:800::1002'
self
.
ie_code
=
'IE'
self
.
us_code
=
'US'
self
.
us_code
=
'US'
self
.
gb_code
=
'GB'
self
.
gb_code
=
'GB'
self
.
ie_name
=
'Ireland'
self
.
us_name
=
'United States'
self
.
us_name
=
'United States'
self
.
gb_name
=
'United Kingdom'
self
.
gb_name
=
'United Kingdom'
self
.
gi
=
pygeoip
.
GeoIP
(
COUNTRY_DB_PATH
)
self
.
gi
=
pygeoip
.
GeoIP
(
COUNTRY_DB_PATH
)
self
.
gi6
=
pygeoip
.
GeoIP
(
COUNTRY_V6_DB_PATH
)
def
testCountryCodeByName
(
self
):
def
testCountryCodeByName
(
self
):
us_code
=
self
.
gi
.
country_code_by_name
(
self
.
us_hostname
)
us_code
=
self
.
gi
.
country_code_by_name
(
self
.
us_hostname
)
gb_code
=
self
.
gi
.
country_code_by_name
(
self
.
gb_hostname
)
gb_code
=
self
.
gi
.
country_code_by_name
(
self
.
gb_hostname
)
ie6_code
=
self
.
gi6
.
country_code_by_name
(
self
.
ie6_hostname
)
self
.
assertEqual
(
us_code
,
self
.
us_code
)
self
.
assertEqual
(
us_code
,
self
.
us_code
)
self
.
assertEqual
(
gb_code
,
self
.
gb_code
)
self
.
assertEqual
(
gb_code
,
self
.
gb_code
)
self
.
assertEqual
(
ie6_code
,
self
.
ie_code
)
def
testCountryCodeByAddr
(
self
):
def
testCountryCodeByAddr
(
self
):
us_code
=
self
.
gi
.
country_code_by_addr
(
self
.
us_ip
)
us_code
=
self
.
gi
.
country_code_by_addr
(
self
.
us_ip
)
gb_code
=
self
.
gi
.
country_code_by_addr
(
self
.
gb_ip
)
gb_code
=
self
.
gi
.
country_code_by_addr
(
self
.
gb_ip
)
ie6_code
=
self
.
gi6
.
country_code_by_addr
(
self
.
ie6_ip
)
self
.
assertEqual
(
us_code
,
self
.
us_code
)
self
.
assertEqual
(
us_code
,
self
.
us_code
)
self
.
assertEqual
(
gb_code
,
self
.
gb_code
)
self
.
assertEqual
(
gb_code
,
self
.
gb_code
)
self
.
assertEqual
(
ie6_code
,
self
.
ie_code
)
def
testCountryNameByName
(
self
):
def
testCountryNameByName
(
self
):
us_name
=
self
.
gi
.
country_name_by_name
(
self
.
us_hostname
)
us_name
=
self
.
gi
.
country_name_by_name
(
self
.
us_hostname
)
gb_name
=
self
.
gi
.
country_name_by_name
(
self
.
gb_hostname
)
gb_name
=
self
.
gi
.
country_name_by_name
(
self
.
gb_hostname
)
ie6_name
=
self
.
gi6
.
country_name_by_name
(
self
.
ie6_hostname
)
self
.
assertEqual
(
us_name
,
self
.
us_name
)
self
.
assertEqual
(
us_name
,
self
.
us_name
)
self
.
assertEqual
(
gb_name
,
self
.
gb_name
)
self
.
assertEqual
(
gb_name
,
self
.
gb_name
)
self
.
assertEqual
(
ie6_name
,
self
.
ie_name
)
def
testCountryNameByAddr
(
self
):
def
testCountryNameByAddr
(
self
):
us_name
=
self
.
gi
.
country_name_by_addr
(
self
.
us_ip
)
us_name
=
self
.
gi
.
country_name_by_addr
(
self
.
us_ip
)
gb_name
=
self
.
gi
.
country_name_by_addr
(
self
.
gb_ip
)
gb_name
=
self
.
gi
.
country_name_by_addr
(
self
.
gb_ip
)
ie6_name
=
self
.
gi6
.
country_name_by_addr
(
self
.
ie6_ip
)
self
.
assertEqual
(
us_name
,
self
.
us_name
)
self
.
assertEqual
(
us_name
,
self
.
us_name
)
self
.
assertEqual
(
gb_name
,
self
.
gb_name
)
self
.
assertEqual
(
gb_name
,
self
.
gb_name
)
self
.
assertEqual
(
ie6_name
,
self
.
ie_name
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment