Skip to content
This repository has been archived by the owner on Apr 9, 2023. It is now read-only.

Commit

Permalink
Merge pull request #61 from plone/guess-resp
Browse files Browse the repository at this point in the history
Fix issue where correct aiohttp response would not be generated always
  • Loading branch information
vangheem committed Jan 31, 2017
2 parents 6da6314 + f50db8c commit 9536aad
Show file tree
Hide file tree
Showing 8 changed files with 35 additions and 28 deletions.
3 changes: 3 additions & 0 deletions src/plone.server/CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@

New features:

- Fix issue where correct aiohttp response would not be generated always
[vangheem]

- be able provide your own database factories by providing named utilities for
the IDatabaseConfigurationFactory interface
[vangheem]
Expand Down
23 changes: 12 additions & 11 deletions src/plone.server/plone/server/contentnegotiation.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- encoding: utf-8 -*-
from plone.server import app_settings
from plone.server.interfaces import IContentNegotiation
from plone.server.interfaces import IDownloadView
from plone.server.interfaces import IDownloadView, IRendererFormatRaw
from zope.component import getUtility
from zope.interface import implementer

Expand Down Expand Up @@ -508,9 +508,7 @@ def _list_acceptable(self, weights, content_types=None, languages=None, encoding
for v5 in vals5:
ap = AcceptParameters(v1, v2, v3, v4, v5)
unsorted.append((ap, wq))

sorted = self._sort_by_q(unsorted, 0.0)
return sorted
return self._sort_by_q(unsorted, 0.0)

def _analyse_packaging(self, accept):
if accept is None:
Expand Down Expand Up @@ -809,17 +807,20 @@ def content_type_negotiation(request, resource, view):
if 'ACCEPT' in request.headers:
accept = request.headers['ACCEPT']

if IDownloadView.providedBy(view) or accept is None:
# Its going to be binary
# No content negotiation right now
accept = app_settings['renderers']['*/*']
return accept
if IDownloadView.providedBy(view) or accept in (None, '*/*'):
# if download view, we want to render raw immediately
# or if no or */* accept header provided
return IRendererFormatRaw

np = getUtility(IContentNegotiation, 'content_type')
ap = np.negotiate(accept=accept)
# We need to check for the accept
accept = app_settings['renderers'][str(ap.content_type)]
return accept
if str(ap.content_type) in app_settings['renderers']:
return app_settings['renderers'][str(ap.content_type)]
else:
log.info('Could not find content type {} renderer'.format(
str(ap.content_type)))
return IRendererFormatRaw


def language_negotiation(request):
Expand Down
12 changes: 7 additions & 5 deletions src/plone.server/plone/server/factory/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,13 @@ def load_application(module, root, settings):
"HEAD": interfaces.IHEAD,
"CONNECT": interfaces.ICONNECT
},
"renderers": collections.OrderedDict({
"application/json": interfaces.IRendererFormatJson,
"text/html": interfaces.IRendererFormatHtml,
"*/*": interfaces.IRendererFormatRaw
}),
# pass in tuple to force ordering for default provided renderers here
# XXX ordering is *required* for some views to work as if no accept
# header is provided, it'll default to the first type provided
"renderers": collections.OrderedDict((
("application/json", interfaces.IRendererFormatJson),
("text/html", interfaces.IRendererFormatHtml)
)),
"languages": {
"en": languages.IEN,
"en-us": languages.IENUS,
Expand Down
3 changes: 1 addition & 2 deletions src/plone.server/plone/server/json/serialize_schema.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
from plone.server import configure
from plone.server.interfaces import IRequest
from plone.server.interfaces import IFactorySerializeToJson
from plone.server.interfaces import IRequest
from plone.server.interfaces import ISchemaFieldSerializeToJson
from plone.server.interfaces import ISchemaSerializeToJson
from zope.component import getMultiAdapter
Expand Down Expand Up @@ -46,7 +46,6 @@ def __call__(self):

# Behavior serialization
for schema in factory.behaviors or ():

schema_serializer = getMultiAdapter(
(schema, self.request), ISchemaSerializeToJson)

Expand Down
15 changes: 11 additions & 4 deletions src/plone.server/plone/server/json/serialize_schema_field.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
from plone.server import configure
from plone.server.interfaces import ICloudFileField
from plone.server.interfaces import IFileField
from plone.server.interfaces import IJSONField
from plone.server.interfaces import IRichText
from plone.server.interfaces import ISchemaFieldSerializeToJson
from plone.server.interfaces import ISchemaSerializeToJson
from plone.server.interfaces import IValueToJson
from zope.component import getMultiAdapter
from zope.interface import implementedBy
Expand All @@ -19,9 +23,6 @@
from zope.schema.interfaces import IText
from zope.schema.interfaces import ITextLine
from zope.schema.interfaces import ITime
from plone.server.interfaces import IJSONField
from plone.server.interfaces import IFileField
from plone.server.interfaces import ICloudFileField


@configure.adapter(
Expand Down Expand Up @@ -101,7 +102,12 @@ def __call__(self):
result[attribute_name] = text

if result['type'] == 'object':
result['properties'] = self.field.schema
if isinstance(self.field.schema, dict):
result['properties'] = self.field.schema
else:
schema_serializer = getMultiAdapter((self.field.schema, self.request),
ISchemaSerializeToJson)
result['properties'] = schema_serializer()
return result

@property
Expand Down Expand Up @@ -149,6 +155,7 @@ class DefaultJSONFieldSerializer(DefaultSchemaFieldSerializer):
def field_type(self):
return 'object'


@configure.adapter(
for_=(ITextLine, Interface, Interface),
provides=ISchemaFieldSerializeToJson)
Expand Down
4 changes: 1 addition & 3 deletions src/plone.server/plone/server/renderers.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,6 @@ def guess_response(self, value):

async def __call__(self, value):
resp = value
if (hasattr(value, '__class__') and
issubclass(value.__class__, Response) and
'Content-Type' not in value.headers):
if isinstance(value, Response):
resp = self.guess_response(value)
return resp
1 change: 0 additions & 1 deletion src/plone.server/plone/server/tests/test_dynamic_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ def test_set_dynamic_behavior(self):
resp.json()['plone.server.behaviors.attachment.IAttachment']['file']['filename'], # noqa
'plone.png')


def test_create_delete_dynamic_behavior(self):
"""Create and delete a content type."""
resp = self.layer.requester(
Expand Down
2 changes: 0 additions & 2 deletions src/plone.server/plone/server/traversal.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
from zope.component import getUtility
from zope.component import queryMultiAdapter
from zope.component.interfaces import ISite
from zope.i18nmessageid import MessageFactory
from zope.interface import alsoProvides
from zope.security.checker import getCheckerForInstancesOf
from zope.security.interfaces import IInteraction
Expand All @@ -49,7 +48,6 @@
import aiohttp
import asyncio
import json
import logging
import traceback
import uuid

Expand Down

0 comments on commit 9536aad

Please sign in to comment.