improve url exists detection for new comment threads
This commit is contained in:
parent
30fa254023
commit
52f64dd26f
@ -32,12 +32,23 @@ class IssoEncoder(json.JSONEncoder):
|
|||||||
return json.JSONEncoder.default(self, obj)
|
return json.JSONEncoder.default(self, obj)
|
||||||
|
|
||||||
|
|
||||||
def urlexists(host, path):
|
def normalize(host):
|
||||||
|
|
||||||
|
if not host.startswith(('http://', 'https://')):
|
||||||
|
host = 'https://' + host
|
||||||
|
|
||||||
rv = urlparse(host)
|
rv = urlparse(host)
|
||||||
http = httplib.HTTPSConnection if rv.scheme == 'https' else httplib.HTTPConnection
|
if rv.scheme == 'https':
|
||||||
|
return (rv.netloc, 443)
|
||||||
|
return (rv.netloc.rsplit(':')[0], rv.port or 80)
|
||||||
|
|
||||||
with closing(http(rv.netloc, rv.port, timeout=3)) as con:
|
|
||||||
|
def urlexists(host, path):
|
||||||
|
|
||||||
|
host, port = normalize(host)
|
||||||
|
http = httplib.HTTPSConnection if port == 443 else httplib.HTTPConnection
|
||||||
|
|
||||||
|
with closing(http(host, port, timeout=3)) as con:
|
||||||
try:
|
try:
|
||||||
con.request('HEAD', path)
|
con.request('HEAD', path)
|
||||||
except (httplib.HTTPException, socket.error):
|
except (httplib.HTTPException, socket.error):
|
||||||
@ -49,10 +60,10 @@ def heading(host, path):
|
|||||||
"""Connect to `host`, GET path and start from #isso-thread to search for
|
"""Connect to `host`, GET path and start from #isso-thread to search for
|
||||||
a possible heading (h1). Returns `None` if nothing found."""
|
a possible heading (h1). Returns `None` if nothing found."""
|
||||||
|
|
||||||
rv = urlparse(host)
|
host, port = normalize(host)
|
||||||
http = httplib.HTTPSConnection if rv.scheme == 'https' else httplib.HTTPConnection
|
http = httplib.HTTPSConnection if port == 443 else httplib.HTTPConnection
|
||||||
|
|
||||||
with closing(http(rv.netloc, rv.port, timeout=15)) as con:
|
with closing(http(host, port, timeout=15)) as con:
|
||||||
con.request('GET', path)
|
con.request('GET', path)
|
||||||
html = html5lib.parse(con.getresponse().read(), treebuilder="dom")
|
html = html5lib.parse(con.getresponse().read(), treebuilder="dom")
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ class requires:
|
|||||||
@requires(str, 'uri')
|
@requires(str, 'uri')
|
||||||
def create(app, environ, request, uri):
|
def create(app, environ, request, uri):
|
||||||
|
|
||||||
if not utils.urlexists(app.ORIGIN, uri):
|
if app.db.threads.get(uri) is None and not utils.urlexists(app.ORIGIN, uri):
|
||||||
return Response('URI does not exist', 404)
|
return Response('URI does not exist', 404)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -70,13 +70,12 @@ def create(app, environ, request, uri):
|
|||||||
|
|
||||||
hash=hashlib.md5(hash).hexdigest())
|
hash=hashlib.md5(hash).hexdigest())
|
||||||
|
|
||||||
try:
|
|
||||||
title = app.db.threads.get(uri)
|
title = app.db.threads.get(uri)
|
||||||
except KeyError:
|
if title is None:
|
||||||
title = app.db.threads.add(uri, utils.heading(app.ORIGIN, uri))
|
title = app.db.threads.add(uri, utils.heading(app.ORIGIN, uri))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rv = app.db.add(uri, comment, utils.anonymize(unicode(request.remote_addr)))
|
rv = app.db.add(uri, comment, request.remote_addr)
|
||||||
except sqlite3.Error:
|
except sqlite3.Error:
|
||||||
logging.exception('uncaught SQLite3 exception')
|
logging.exception('uncaught SQLite3 exception')
|
||||||
abort(400)
|
abort(400)
|
||||||
|
Loading…
Reference in New Issue
Block a user