URL field in input API has a max length, but isn't validating it

RESOLVED FIXED

Status

P1
normal
RESOLVED FIXED
4 years ago
2 years ago

People

(Reporter: willkg, Assigned: willkg)

Tracking

Details

(Whiteboard: u=user c=api p=1 s=input.2014q3)

The URL field has a max length (I'm not sure what the exact number is), but it's not validating for the max length when doing an Input API POST. So if you exceed the max length, you get this traceback:

Traceback (most recent call last):

  File "/data/www/input.allizom.org/input/vendor/src/django/django/core/handlers/base.py", line 113, in get_response
    response = callback(request, *callback_args, **callback_kwargs)

  File "/usr/lib64/python2.6/site-packages/newrelic-2.16.0.12/newrelic/hooks/framework_django.py", line 492, in wrapper
    return wrapped(*args, **kwargs)

  File "/data/www/input.allizom.org/input/vendor/src/django/django/views/decorators/csrf.py", line 77, in wrapped_view
    return view_func(*args, **kwargs)

  File "/data/www/input.allizom.org/input/fjord/base/util.py", line 407, in decorated_func
    response = f(request, *args, **kwargs)

  File "/data/www/input.allizom.org/input/fjord/feedback/api_views.py", line 134, in _feedback_api_router
    return post_feedback_api_view(request)

  File "/data/www/input.allizom.org/input/vendor/src/django/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)

  File "/data/www/input.allizom.org/input/vendor/src/django/django/views/decorators/csrf.py", line 77, in wrapped_view
    return view_func(*args, **kwargs)

  File "/data/www/input.allizom.org/input/vendor/src/django-rest-framework/rest_framework/views.py", line 327, in dispatch
    response = self.handle_exception(exc)

  File "/data/www/input.allizom.org/input/vendor/src/django-rest-framework/rest_framework/views.py", line 324, in dispatch
    response = handler(request, *args, **kwargs)

  File "/data/www/input.allizom.org/input/vendor/src/django-rest-framework/rest_framework/generics.py", line 372, in post
    return self.create(request, *args, **kwargs)

  File "/data/www/input.allizom.org/input/vendor/src/django-rest-framework/rest_framework/mixins.py", line 52, in create
    self.object = serializer.save(force_insert=True)

  File "/data/www/input.allizom.org/input/vendor/src/django-rest-framework/rest_framework/serializers.py", line 518, in save
    self.save_object(self.object, **kwargs)

  File "/data/www/input.allizom.org/input/fjord/feedback/models.py", line 661, in save_object
    obj.save(**kwargs)

  File "/data/www/input.allizom.org/input/fjord/feedback/models.py", line 278, in save
    super(Response, self).save(*args, **kwargs)

  File "/data/www/input.allizom.org/input/vendor/src/django/django/db/models/base.py", line 546, in save
    force_update=force_update, update_fields=update_fields)

  File "/data/www/input.allizom.org/input/vendor/src/django/django/db/models/base.py", line 650, in save_base
    result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)

  File "/data/www/input.allizom.org/input/vendor/src/django/django/db/models/manager.py", line 215, in _insert
    return insert_query(self.model, objs, fields, **kwargs)

  File "/data/www/input.allizom.org/input/vendor/src/django/django/db/models/query.py", line 1675, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)

  File "/data/www/input.allizom.org/input/vendor/src/django/django/db/models/sql/compiler.py", line 943, in execute_sql
    cursor.execute(sql, params)

  File "/data/www/input.allizom.org/input/vendor/src/django/django/db/backends/mysql/base.py", line 130, in execute
    six.reraise(utils.DatabaseError, utils.DatabaseError(*tuple(e.args)), sys.exc_info()[2])

  File "/data/www/input.allizom.org/input/vendor/src/django/django/db/backends/mysql/base.py", line 120, in execute
    return self.cursor.execute(query, args)

  File "/usr/lib64/python2.6/site-packages/newrelic-2.16.0.12/newrelic/hooks/database_dbapi2.py", line 21, in execute
    return self.__wrapped__.execute(sql, parameters)

  File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 205, in execute
    self.errorhandler(self, exc, value)

  File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue

DatabaseError: (1406, "Data too long for column 'url' at row 1")
Pushed this to prod just now.
Status: NEW → RESOLVED
Last Resolved: 4 years ago
Resolution: --- → FIXED
Product: Input → Input Graveyard
You need to log in before you can comment on or make changes to this bug.