From 5811ad21b4b61eb9d1307187647a599837ab6a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Ortiz=20Pe=C3=B1aloza?= Date: Thu, 24 Jan 2019 21:37:26 -0300 Subject: [PATCH 1/3] Added a fix --- ...sOriginResourceSharingAfterFilter.class.st | 38 +++++++++++++++++++ ...nResourceSharingPreflightHandler.class.st} | 10 ++--- .../HTTPBasedRESTfulAPI.class.st | 30 +++++++-------- .../Stargate-Model/RouteConfigurator.class.st | 2 +- 4 files changed, 58 insertions(+), 22 deletions(-) create mode 100644 source/Stargate-Model/CrossOriginResourceSharingAfterFilter.class.st rename source/Stargate-Model/{CrossOriginResourceSharingHandler.class.st => CrossOriginResourceSharingPreflightHandler.class.st} (64%) diff --git a/source/Stargate-Model/CrossOriginResourceSharingAfterFilter.class.st b/source/Stargate-Model/CrossOriginResourceSharingAfterFilter.class.st new file mode 100644 index 0000000..f01f96a --- /dev/null +++ b/source/Stargate-Model/CrossOriginResourceSharingAfterFilter.class.st @@ -0,0 +1,38 @@ +Class { + #name : #CrossOriginResourceSharingAfterFilter, + #superclass : #Object, + #instVars : [ + 'allowedOrigins' + ], + #category : #'Stargate-Model-CORS' +} + +{ #category : #'instance creation' } +CrossOriginResourceSharingAfterFilter class >> allowing: origins [ + + ^ self new initializeAllowing: origins +] + +{ #category : #initialization } +CrossOriginResourceSharingAfterFilter >> initializeAllowing: origins [ + + allowedOrigins := origins +] + +{ #category : #'tea action' } +CrossOriginResourceSharingAfterFilter >> teaEvalActionOnRequest: request response: response [ + + | requestOrigin requestOriginUrl | + + requestOrigin := request headers at: 'Origin'. + requestOriginUrl := requestOrigin asUrl. + + allowedOrigins + detect: [ :origin | origin = requestOriginUrl ] + ifFound: [ :allowedOrigin | + response headers + at: 'Access-Control-Allow-Origin' put: requestOrigin; + at: 'Vary' put: 'Origin' ]. + + ^ response +] diff --git a/source/Stargate-Model/CrossOriginResourceSharingHandler.class.st b/source/Stargate-Model/CrossOriginResourceSharingPreflightHandler.class.st similarity index 64% rename from source/Stargate-Model/CrossOriginResourceSharingHandler.class.st rename to source/Stargate-Model/CrossOriginResourceSharingPreflightHandler.class.st index 6597ab5..5e15afa 100644 --- a/source/Stargate-Model/CrossOriginResourceSharingHandler.class.st +++ b/source/Stargate-Model/CrossOriginResourceSharingPreflightHandler.class.st @@ -1,5 +1,5 @@ Class { - #name : #CrossOriginResourceSharingHandler, + #name : #CrossOriginResourceSharingPreflightHandler, #superclass : #Object, #instVars : [ 'httpMethods' @@ -8,25 +8,25 @@ Class { } { #category : #'instance creation' } -CrossOriginResourceSharingHandler class >> allowing: anHttpMethodsCollection [ +CrossOriginResourceSharingPreflightHandler class >> allowing: anHttpMethodsCollection [ ^ self new initializeAllowing: anHttpMethodsCollection ] { #category : #'private - accessing' } -CrossOriginResourceSharingHandler >> commaSeparatedHttpMethods [ +CrossOriginResourceSharingPreflightHandler >> commaSeparatedHttpMethods [ ^ (CollectionFormatter separatingWith: ', ') format: httpMethods ] { #category : #initialization } -CrossOriginResourceSharingHandler >> initializeAllowing: anHttpMethodsCollection [ +CrossOriginResourceSharingPreflightHandler >> initializeAllowing: anHttpMethodsCollection [ httpMethods := anHttpMethodsCollection ] { #category : #evaluating } -CrossOriginResourceSharingHandler >> teaEvalActionOnRequest: aRequest [ +CrossOriginResourceSharingPreflightHandler >> teaEvalActionOnRequest: aRequest [ | response | diff --git a/source/Stargate-Model/HTTPBasedRESTfulAPI.class.st b/source/Stargate-Model/HTTPBasedRESTfulAPI.class.st index 5703bb2..4e10a19 100644 --- a/source/Stargate-Model/HTTPBasedRESTfulAPI.class.st +++ b/source/Stargate-Model/HTTPBasedRESTfulAPI.class.st @@ -23,20 +23,7 @@ HTTPBasedRESTfulAPI class >> configuredBy: configuration installing: aRESTfulCon HTTPBasedRESTfulAPI >> beCORSAwareAllowing: origins [ teapotServer - after: - '/*' - -> [ :request :response | - | requestOrigin requestOriginUrl | - - requestOrigin := request headers at: 'Origin'. - requestOriginUrl := requestOrigin asUrl. - origins - detect: [ :origin | origin = requestOriginUrl ] - ifFound: [ :allowedOrigin | - response headers - at: 'Access-Control-Allow-Origin' put: requestOrigin; - at: 'Vary' put: 'Origin' ]. - response ]; + after: '/*' -> (CrossOriginResourceSharingAfterFilter allowing: origins); when: [ :request | request headers includesKey: 'Origin' ] ] @@ -55,19 +42,30 @@ HTTPBasedRESTfulAPI >> configureRoutes [ controllers do: [ :controller | configurator addRoutesOf: controller ] ] +{ #category : #configuring } +HTTPBasedRESTfulAPI >> crossOriginResourceSharingAfterFilterHandlerAllowing: origins [ + + ^ CrossOriginResourceSharingAfterFilter allowing: origins +] + { #category : #initialization } HTTPBasedRESTfulAPI >> initializeConfiguredBy: configuration installing: aRESTfulControllerCollection [ - teapotServer := Teapot - configure: configuration , {(#notFoundHandlerClass -> Tea405AwareNotFoundHandler)}. + teapotServer := Teapot configure: configuration , {(#notFoundHandlerClass -> Tea405AwareNotFoundHandler)}. controllers := aRESTfulControllerCollection. errorHandlers := OrderedCollection new. + self on: HTTPClientError addErrorHandler: [ :clientError :request | | json | + json := NeoJSONWriter toStringPretty: clientError. (ZnResponse statusCode: clientError code) + headers: + (ZnHeaders defaultResponseHeaders + at: 'Access-Control-Allow-Origin' put: '*'; + yourself); entity: (ZnEntity json: json); yourself ] ] diff --git a/source/Stargate-Model/RouteConfigurator.class.st b/source/Stargate-Model/RouteConfigurator.class.st index d58d446..b5fe4e5 100644 --- a/source/Stargate-Model/RouteConfigurator.class.st +++ b/source/Stargate-Model/RouteConfigurator.class.st @@ -43,7 +43,7 @@ RouteConfigurator >> configureCrossOriginSharingRoutes [ teapot OPTIONS: resourceLocation - -> (CrossOriginResourceSharingHandler allowing: (routesAllowingCors at: resourceLocation)) ] + -> (CrossOriginResourceSharingPreflightHandler allowing: (routesAllowingCors at: resourceLocation)) ] ] { #category : #'private - configuring' } From 138e77533ce6c9f3c5bb477ad176eaccd3d67dde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Ortiz=20Pe=C3=B1aloza?= Date: Thu, 24 Jan 2019 22:20:38 -0300 Subject: [PATCH 2/3] Fixed and renamed test --- ...CrossOriginResourceSharingPreflightHandlerTest.class.st} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename source/Stargate-Model-Tests/{CrossOriginResourceSharingHandlerTest.class.st => CrossOriginResourceSharingPreflightHandlerTest.class.st} (73%) diff --git a/source/Stargate-Model-Tests/CrossOriginResourceSharingHandlerTest.class.st b/source/Stargate-Model-Tests/CrossOriginResourceSharingPreflightHandlerTest.class.st similarity index 73% rename from source/Stargate-Model-Tests/CrossOriginResourceSharingHandlerTest.class.st rename to source/Stargate-Model-Tests/CrossOriginResourceSharingPreflightHandlerTest.class.st index e2d2578..f3d9518 100644 --- a/source/Stargate-Model-Tests/CrossOriginResourceSharingHandlerTest.class.st +++ b/source/Stargate-Model-Tests/CrossOriginResourceSharingPreflightHandlerTest.class.st @@ -2,17 +2,17 @@ I'm a test case for CrossOriginResourceSharingHandler " Class { - #name : #CrossOriginResourceSharingHandlerTest, + #name : #CrossOriginResourceSharingPreflightHandlerTest, #superclass : #TestCase, #category : #'Stargate-Model-Tests-CORS' } { #category : #tests } -CrossOriginResourceSharingHandlerTest >> testEvaluationOnRequest [ +CrossOriginResourceSharingPreflightHandlerTest >> testEvaluationOnRequest [ | handler response | - handler := CrossOriginResourceSharingHandler allowing: #('GET' 'POST'). + handler := CrossOriginResourceSharingPreflightHandler allowing: #('GET' 'POST'). response := handler teaEvalActionOnRequest: (ZnRequest options: 'url'). self From 4985e4cda4ee0a30f988d1ceb877529e597b1328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Ortiz=20Pe=C3=B1aloza?= Date: Thu, 24 Jan 2019 22:30:07 -0300 Subject: [PATCH 3/3] Deleted messega without senders --- source/Stargate-Model/HTTPBasedRESTfulAPI.class.st | 6 ------ 1 file changed, 6 deletions(-) diff --git a/source/Stargate-Model/HTTPBasedRESTfulAPI.class.st b/source/Stargate-Model/HTTPBasedRESTfulAPI.class.st index 4e10a19..03fdfd8 100644 --- a/source/Stargate-Model/HTTPBasedRESTfulAPI.class.st +++ b/source/Stargate-Model/HTTPBasedRESTfulAPI.class.st @@ -42,12 +42,6 @@ HTTPBasedRESTfulAPI >> configureRoutes [ controllers do: [ :controller | configurator addRoutesOf: controller ] ] -{ #category : #configuring } -HTTPBasedRESTfulAPI >> crossOriginResourceSharingAfterFilterHandlerAllowing: origins [ - - ^ CrossOriginResourceSharingAfterFilter allowing: origins -] - { #category : #initialization } HTTPBasedRESTfulAPI >> initializeConfiguredBy: configuration installing: aRESTfulControllerCollection [