ZnockBase.class.st 3.6 KB

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