ZnockBase.class.st 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. Class {
  2. #name : #ZnockBase,
  3. #superclass : #Object,
  4. #instVars : [
  5. 'owner',
  6. 'state',
  7. 'builtClient',
  8. 'baseUrl'
  9. ],
  10. #category : #Znock
  11. }
  12. { #category : #'instance creation' }
  13. ZnockBase class >> in: aZnock url: aZnUrl [
  14. ^ super new
  15. baseUrl: aZnUrl;
  16. owner: aZnock;
  17. yourself
  18. ]
  19. { #category : #public }
  20. ZnockBase >> at: keyString put: valueString [
  21. self response.
  22. ^ builtClient response headers at: keyString put: valueString
  23. ]
  24. { #category : #accessing }
  25. ZnockBase >> baseUrl [
  26. ^ baseUrl
  27. ]
  28. { #category : #accessing }
  29. ZnockBase >> baseUrl: aZnUrl [
  30. baseUrl := aZnUrl
  31. ]
  32. { #category : #public }
  33. ZnockBase >> beOptional [
  34. self request.
  35. builtClient beOptional
  36. ]
  37. { #category : #building }
  38. ZnockBase >> closeState: aSymbol [
  39. "self shouldBeImplemented."
  40. ]
  41. { #category : #building }
  42. ZnockBase >> doesNotUnderstand: aMessage [
  43. self forwardedSelectors keysAndValuesDo: [ :handler :candidates |
  44. (candidates includes: aMessage selector)
  45. ifTrue: [ ^ self perform: handler with: aMessage ] ].
  46. ^ super doesNotUnderstand: aMessage
  47. ]
  48. { #category : #building }
  49. ZnockBase >> forwardedSelectors [
  50. ^ {
  51. #handleClientMessage: ->
  52. #(addPath: addPathSegment: delete get head host: http https method: options patch path: port: post put #username:password:).
  53. #handleResponseCreationMessage: ->
  54. #(accepted noContent notModified ok: redirect: #redirect:entity: serverError: serverErrorWithEntity: statusCode: statusLine: unauthorized unauthorized: #unauthorized:entity:).
  55. #handleResponseCreationFromRequestMessage: ->
  56. #(#badRequest: badRequest:entity: methodNotAllowed: methodNotAllowed:entity:).
  57. #handleResponseCreationFromUrlMessage: ->
  58. #(#created: created:entity: notFound: notFound:entity: redirect: redirect:entity:).
  59. #handleResponseMessage: ->
  60. #(addCookie: entity: headers: resetEntity: setLocation: setWWWAuthenticate: statusLine:).
  61. #handleResponseHeadersMessage: ->
  62. #(addAll: at:add: at:put: at:put:ifPresentMerge:).
  63. } asDictionary
  64. ]
  65. { #category : #building }
  66. ZnockBase >> handleClientMessage: aMessage [
  67. self request.
  68. ^ aMessage sendTo: builtClient
  69. ]
  70. { #category : #building }
  71. ZnockBase >> handleResponseCreationFromRequestMessage: aMessage [
  72. aMessage argument ifNotNil: [ ^ self handleResponseCreationMessage: aMessage ].
  73. self will: [ :req :res |
  74. aMessage argument: req.
  75. res customizeFrom: (aMessage sendTo: ZnResponse) ]
  76. ]
  77. { #category : #building }
  78. ZnockBase >> handleResponseCreationFromUrlMessage: aMessage [
  79. aMessage argument ifNotNil: [ ^ self handleResponseCreationMessage: aMessage ].
  80. self will: [ :req :res |
  81. aMessage argument: req url.
  82. res customizeFrom: (aMessage sendTo: ZnResponse) ]
  83. ]
  84. { #category : #building }
  85. ZnockBase >> handleResponseCreationMessage: aMessage [
  86. ^ self response: (aMessage sendTo: ZnResponse)
  87. ]
  88. { #category : #building }
  89. ZnockBase >> handleResponseHeadersMessage: aMessage [
  90. self response.
  91. ^ aMessage sendTo: builtClient response headers
  92. ]
  93. { #category : #building }
  94. ZnockBase >> handleResponseMessage: aMessage [
  95. self response.
  96. ^ aMessage sendTo: builtClient response
  97. ]
  98. { #category : #building }
  99. ZnockBase >> newCleanResponse [
  100. ^ ZnResponse statusLine: ZnStatusLine ok
  101. ]
  102. { #category : #building }
  103. ZnockBase >> openState: aSymbol [
  104. aSymbol == #request ifTrue: [
  105. builtClient := ZnockExpectation new.
  106. builtClient url: baseUrl.
  107. builtClient request url scheme: baseUrl scheme ].
  108. aSymbol == #response ifTrue: [ self owner addExpectation: builtClient ]
  109. ]
  110. { #category : #accessing }
  111. ZnockBase >> owner [
  112. ^ owner
  113. ]
  114. { #category : #accessing }
  115. ZnockBase >> owner: anObject [
  116. owner := anObject
  117. ]
  118. { #category : #building }
  119. ZnockBase >> request [
  120. self state: #request.
  121. ^ builtClient
  122. ]
  123. { #category : #building }
  124. ZnockBase >> resetState [
  125. self state: nil
  126. ]
  127. { #category : #building }
  128. ZnockBase >> response [
  129. self state: #response.
  130. ^ builtClient response
  131. ]
  132. { #category : #building }
  133. ZnockBase >> response: response [
  134. self response ifNotNil: [ self error: 'Response already created' ].
  135. builtClient response: response
  136. ]
  137. { #category : #building }
  138. ZnockBase >> state: aSymbol [
  139. state == aSymbol ifTrue: [ ^ self ].
  140. self closeState: state.
  141. state := aSymbol.
  142. self openState: state
  143. ]
  144. { #category : #public }
  145. ZnockBase >> url: anObject [
  146. | scheme |
  147. self request.
  148. scheme := builtClient request url scheme.
  149. builtClient url: anObject.
  150. builtClient request url scheme: scheme
  151. ]
  152. { #category : #public }
  153. ZnockBase >> waitFor: aDuration [
  154. self response.
  155. builtClient delay: aDuration
  156. ]
  157. { #category : #public }
  158. ZnockBase >> will: aBlock [
  159. self response: self newCleanResponse.
  160. builtClient customizeResponseBlock: aBlock
  161. ]
  162. { #category : #public }
  163. ZnockBase >> willError: aString [
  164. self will: [ :req :res | self error: aString ]
  165. ]