def validate_tiddler_headers(environ, tiddler): """ Check ETAG and last modified information to see if a) the client can use its cached tiddler b) we have edit contention when trying to write. """ request_method = environ['REQUEST_METHOD'] tiddlers_etag = tiddler_etag(environ, tiddler) LOGGER.debug('attempting to validate %s with revision %s', tiddler.title.encode('utf-8'), tiddler.revision) etag = None last_modified = None if request_method == 'GET': incoming_etag = check_incoming_etag(environ, tiddlers_etag) if not incoming_etag: # only check last-modified if no etag last_modified_string = http_date_from_timestamp( tiddler.modified) last_modified = ('Last-Modified', last_modified_string) check_last_modified(environ, last_modified_string) else: incoming_etag = environ.get('HTTP_IF_MATCH', None) LOGGER.debug('attempting to validate incoming etag(PUT):' '%s against %s', incoming_etag, tiddlers_etag) if incoming_etag and not _etag_write_match(incoming_etag, tiddlers_etag): raise HTTP412('Provided ETag does not match. ' 'Server content probably newer.') etag = ('Etag', '%s' % tiddlers_etag) return last_modified, etag
def _validate_tiddler_list(environ, tiddlers): """ Do Etag and Last modified checks on the collection of tiddlers. If ETag testing is done, no last modified handling is done, even if the ETag testing fails. If no 304 is raised, then just return last-modified and ETag for the caller to use in constructing its HTTP response. """ last_modified_string = http_date_from_timestamp(tiddlers.modified) last_modified = ('Last-Modified', last_modified_string) username = environ.get('tiddlyweb.usersign', {}).get('name', '') try: _, mime_type = get_serialize_type(environ) mime_type = mime_type.split(';', 1)[0].strip() except TypeError: mime_type = '' etag_string = '"%s:%s"' % (tiddlers.hexdigest(), sha('%s:%s' % (username.encode('utf-8'), mime_type)).hexdigest()) etag = ('Etag', etag_string) incoming_etag = check_incoming_etag(environ, etag_string) if not incoming_etag: # only check last modified when no etag check_last_modified(environ, last_modified_string) return last_modified, etag
def _validate_tiddler_list(environ, tiddlers): """ Do Etag and Last modified checks on the collection of tiddlers. If ETag testing is done, no last modified handling is done, even if the ETag testing fails. If no 304 is raised, then just return last-modified and ETag for the caller to use in constructing its HTTP response. """ last_modified_string = http_date_from_timestamp(tiddlers.modified) last_modified = ('Last-Modified', last_modified_string) username = environ.get('tiddlyweb.usersign', {}).get('name', '') try: _, mime_type = get_serialize_type(environ) mime_type = mime_type.split(';', 1)[0].strip() except TypeError: mime_type = '' etag_string = '"%s:%s"' % (tiddlers.hexdigest(), sha('%s:%s' % (username, mime_type)).hexdigest()) etag = ('Etag', etag_string) incoming_etag = check_incoming_etag(environ, etag_string, last_modified=last_modified_string) if not incoming_etag: # only check last modified when no etag check_last_modified(environ, last_modified_string, etag=etag_string) return last_modified, etag
def validate_tiddler_headers(environ, tiddler): """ Check ETag and last modified header information to see if a) on ``GET`` the user agent can use its cached tiddler b) on ``PUT`` we have edit contention. """ request_method = environ['REQUEST_METHOD'] this_tiddlers_etag = tiddler_etag(environ, tiddler) LOGGER.debug('attempting to validate %s with revision %s', tiddler.title, tiddler.revision) etag = None last_modified = None if request_method == 'GET': last_modified_string = http_date_from_timestamp(tiddler.modified) last_modified = ('Last-Modified', last_modified_string) cache_header = 'no-cache' if CACHE_CONTROL_FIELD in tiddler.fields: try: cache_header = 'max-age=%s' % int( tiddler.fields[CACHE_CONTROL_FIELD]) except ValueError: pass # if the value is not an int use default header incoming_etag = check_incoming_etag(environ, this_tiddlers_etag, last_modified=last_modified_string, cache_control=cache_header) if not incoming_etag: # only check last-modified if no etag check_last_modified(environ, last_modified_string, etag=this_tiddlers_etag, cache_control=cache_header) else: incoming_etag = environ.get('HTTP_IF_MATCH', None) LOGGER.debug( 'attempting to validate incoming etag(PUT):' '%s against %s', incoming_etag, this_tiddlers_etag) if incoming_etag and not _etag_write_match(incoming_etag, this_tiddlers_etag): raise HTTP412('Provided ETag does not match. ' 'Server content probably newer.') etag = ('ETag', '%s' % this_tiddlers_etag) return last_modified, etag
def validate_tiddler_headers(environ, tiddler): """ Check ETag and last modified header information to see if a) on ``GET`` the user agent can use its cached tiddler b) on ``PUT`` we have edit contention. """ request_method = environ['REQUEST_METHOD'] this_tiddlers_etag = tiddler_etag(environ, tiddler) LOGGER.debug('attempting to validate %s with revision %s', tiddler.title, tiddler.revision) etag = None last_modified = None if request_method == 'GET': last_modified_string = http_date_from_timestamp(tiddler.modified) last_modified = ('Last-Modified', last_modified_string) cache_header = 'no-cache' if CACHE_CONTROL_FIELD in tiddler.fields: try: cache_header = 'max-age=%s' % int( tiddler.fields[CACHE_CONTROL_FIELD]) except ValueError: pass # if the value is not an int use default header incoming_etag = check_incoming_etag(environ, this_tiddlers_etag, last_modified=last_modified_string, cache_control=cache_header) if not incoming_etag: # only check last-modified if no etag check_last_modified(environ, last_modified_string, etag=this_tiddlers_etag, cache_control=cache_header) else: incoming_etag = environ.get('HTTP_IF_MATCH', None) LOGGER.debug('attempting to validate incoming etag(PUT):' '%s against %s', incoming_etag, this_tiddlers_etag) if incoming_etag and not _etag_write_match(incoming_etag, this_tiddlers_etag): raise HTTP412('Provided ETag does not match. ' 'Server content probably newer.') etag = ('ETag', '%s' % this_tiddlers_etag) return last_modified, etag