ZnockBase.class.st 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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 : #accessing }
  20. ZnockBase >> baseUrl [
  21. ^ baseUrl
  22. ]
  23. { #category : #accessing }
  24. ZnockBase >> baseUrl: aZnUrl [
  25. baseUrl := aZnUrl
  26. ]
  27. { #category : #building }
  28. ZnockBase >> closeState: aSymbol [
  29. "self shouldBeImplemented."
  30. ]
  31. { #category : #building }
  32. ZnockBase >> doesNotUnderstand: aMessage [
  33. self forwardedSelectors keysAndValuesDo: [ :handler :candidates |
  34. (candidates includes: aMessage selector)
  35. ifTrue: [ ^ self perform: handler with: aMessage ] ].
  36. ^ super doesNotUnderstand: aMessage
  37. ]
  38. { #category : #building }
  39. ZnockBase >> forwardedSelectors [
  40. ^ {
  41. #handleClientMessage: ->
  42. #(addPath: addPathSegment: delete get head host: http https method: options patch path: port: post put #username:password:).
  43. #handleResponseCreationMessage: ->
  44. #(accepted noContent notModified ok: redirect: #redirect:entity: serverError: serverErrorWithEntity: statusCode: statusLine: unauthorized unauthorized: #unauthorized:entity:).
  45. #handleResponseCreationFromRequestMessage: ->
  46. #(#badRequest: badRequest:entity: methodNotAllowed: methodNotAllowed:entity:).
  47. #handleResponseCreationFromUrlMessage: ->
  48. #(#created: created:entity: notFound: notFound:entity: redirect: redirect:entity:).
  49. #handleResponseMessage: ->
  50. #(addCookie: entity: headers: resetEntity: setLocation: setWWWAuthenticate: statusLine:).
  51. } asDictionary
  52. ]
  53. { #category : #building }
  54. ZnockBase >> handleClientMessage: aMessage [
  55. self request.
  56. ^ aMessage sendTo: builtClient
  57. ]
  58. { #category : #building }
  59. ZnockBase >> handleResponseCreationFromRequestMessage: aMessage [
  60. aMessage argument ifNotNil: [ ^ self handleResponseCreationMessage: aMessage ].
  61. self response: self newCleanResponse.
  62. builtClient customizeResponseBlock: [ :req :res |
  63. aMessage argument: req.
  64. res customizeFrom: (aMessage sendTo: ZnResponse) ]
  65. ]
  66. { #category : #building }
  67. ZnockBase >> handleResponseCreationFromUrlMessage: aMessage [
  68. aMessage argument ifNotNil: [ ^ self handleResponseCreationMessage: aMessage ].
  69. self response: self newCleanResponse.
  70. builtClient customizeResponseBlock: [ :req :res |
  71. aMessage argument: req url.
  72. res customizeFrom: (aMessage sendTo: ZnResponse) ]
  73. ]
  74. { #category : #building }
  75. ZnockBase >> handleResponseCreationMessage: aMessage [
  76. ^ self response: (aMessage sendTo: ZnResponse)
  77. ]
  78. { #category : #building }
  79. ZnockBase >> handleResponseMessage: aMessage [
  80. self response.
  81. ^ aMessage sendTo: builtClient response
  82. ]
  83. { #category : #building }
  84. ZnockBase >> newCleanResponse [
  85. ^ ZnResponse statusLine: ZnStatusLine ok
  86. ]
  87. { #category : #building }
  88. ZnockBase >> openState: aSymbol [
  89. aSymbol == #request ifTrue: [
  90. builtClient := ZnockExpectation new.
  91. builtClient url: baseUrl.
  92. builtClient request url scheme: baseUrl scheme ].
  93. aSymbol == #response ifTrue: [ self owner addExpectation: builtClient ]
  94. ]
  95. { #category : #accessing }
  96. ZnockBase >> owner [
  97. ^ owner
  98. ]
  99. { #category : #accessing }
  100. ZnockBase >> owner: anObject [
  101. owner := anObject
  102. ]
  103. { #category : #building }
  104. ZnockBase >> request [
  105. self state: #request.
  106. ^ builtClient
  107. ]
  108. { #category : #building }
  109. ZnockBase >> resetState [
  110. self state: nil
  111. ]
  112. { #category : #building }
  113. ZnockBase >> response [
  114. self state: #response.
  115. ^ builtClient response
  116. ]
  117. { #category : #building }
  118. ZnockBase >> response: response [
  119. self response ifNotNil: [ self error: 'Response already created' ].
  120. builtClient response: response
  121. ]
  122. { #category : #building }
  123. ZnockBase >> state: aSymbol [
  124. state == aSymbol ifTrue: [ ^ self ].
  125. self closeState: state.
  126. state := aSymbol.
  127. self openState: state
  128. ]
  129. { #category : #public }
  130. ZnockBase >> url: anObject [
  131. | scheme |
  132. self request.
  133. scheme := builtClient request url scheme.
  134. builtClient url: anObject.
  135. builtClient request url scheme: scheme
  136. ]
  137. { #category : #public }
  138. ZnockBase >> waitFor: aDuration [
  139. self response.
  140. builtClient delay: aDuration
  141. ]
  142. { #category : #public }
  143. ZnockBase >> willError: aString [
  144. self response: self newCleanResponse.
  145. builtClient customizeResponseBlock: [ :req :res | self error: aString ]
  146. ]