kbus_http_test.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. package kbus_http
  2. import (
  3. "encoding/json"
  4. "io"
  5. "net/http"
  6. "os"
  7. "strings"
  8. "testing"
  9. . "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_pub"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_serve"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_sub"
  13. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_unsub"
  14. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  15. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
  16. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_serve"
  17. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_local"
  18. )
  19. type tester struct {
  20. t *testing.T
  21. handSub *mock_hand_sub_local.MockHandlerSub
  22. handServ *mock_hand_serve.MockHandlerServe
  23. }
  24. func TestKernelBusHttp(t *testing.T) {
  25. sf := &tester{
  26. t: t,
  27. handSub: mock_hand_sub_local.NewMockHandlerSub("topic_sub", "http://localhost:18200/bus/pub"),
  28. handServ: mock_hand_serve.NewMockHandlerServe("topic_serv", "name_serv"),
  29. }
  30. ctx := kctx.GetKernelCtx().Hassert("TestKernelBusHttp()")
  31. ctx.Set("monolitName", "test_monolit", "comment").Hassert("TestKernelBusHttp()")
  32. sf.get()
  33. sf.req()
  34. sf.sub()
  35. sf.pub()
  36. sf.unsub()
  37. }
  38. // Запрос на отписку.
  39. func (sf *tester) unsub() {
  40. sf.t.Log("unsub")
  41. sf.unsubBad1()
  42. sf.unsubBad2()
  43. sf.unsubGood1()
  44. sf.unsubBad3()
  45. sf.unsubGood2()
  46. }
  47. func (sf *tester) unsubGood2() {
  48. sf.t.Log("unsubGood2")
  49. res := Bus_.Subscribe(sf.handSub)
  50. if res.IsErr() {
  51. sf.t.Fatalf("unsubGood1(): err=%v", res.Err())
  52. }
  53. req := &msg_unsub.UnsubReq{
  54. Name_: sf.handSub.Name_,
  55. Uuid_: "test_uuid",
  56. }
  57. binReq, _ := json.MarshalIndent(req, "", " ")
  58. body := strings.NewReader(string(binReq))
  59. resServ := kserv_http.GetKernelServHttp()
  60. fibApp := resServ.Hassert("unsubGood2").Fiber()
  61. hReq, err := http.NewRequest(http.MethodPost, "/bus/unsub", body)
  62. if err != nil {
  63. sf.t.Fatalf("unsubGood2(): err=%v", err)
  64. }
  65. hReq.Header.Add("Content-Type", "application/json")
  66. _resp, err := fibApp.Test(hReq)
  67. if err != nil {
  68. sf.t.Fatalf("unsubGood2(): after request, err=%v", err)
  69. }
  70. defer func() {
  71. _ = _resp.Body.Close()
  72. }()
  73. if _resp.StatusCode != http.StatusOK {
  74. sf.t.Fatalf("unsubGood2(): statusCode(%v)!=200", _resp.StatusCode)
  75. }
  76. binBody, _ := io.ReadAll(_resp.Body)
  77. resp := &msg_unsub.UnsubResp{}
  78. err = json.Unmarshal(binBody, resp)
  79. if err != nil {
  80. sf.t.Fatalf("unsubGood2(): err=%v", err)
  81. }
  82. if resp.Status_ != "ok" {
  83. sf.t.Fatalf("unsubGood2(): resp(%v)!='ok'", resp.Status_)
  84. }
  85. }
  86. // Кривой запрос.
  87. func (sf *tester) unsubBad3() {
  88. sf.t.Log("unsubBad3")
  89. req := "tra-la-la"
  90. binReq, _ := json.MarshalIndent(req, "", " ")
  91. body := strings.NewReader(string(binReq))
  92. resServ := kserv_http.GetKernelServHttp()
  93. fibApp := resServ.Hassert("unsubBad3").Fiber()
  94. hReq, err := http.NewRequest(http.MethodPost, "/bus/unsub", body)
  95. hReq.Header.Add("Content-Type", "application/json")
  96. if err != nil {
  97. sf.t.Fatalf("unsubBad3(): err=%v", err)
  98. }
  99. _resp, err := fibApp.Test(hReq)
  100. if err != nil {
  101. sf.t.Fatalf("unsubBad3(): after request, err=%v", err)
  102. }
  103. defer func() {
  104. _ = _resp.Body.Close()
  105. }()
  106. if _resp.StatusCode == http.StatusOK {
  107. sf.t.Fatalf("unsubBad3(): statusCode(%v)==200", _resp.StatusCode)
  108. }
  109. }
  110. func (sf *tester) unsubGood1() {
  111. sf.t.Log("unsubGood1")
  112. res := Bus_.Subscribe(sf.handSub)
  113. if res.IsErr() {
  114. sf.t.Fatalf("unsubGood1(): err=%v", res.Err())
  115. }
  116. count := 0
  117. for count < 100 {
  118. SleepMs()
  119. count++
  120. }
  121. req := &msg_unsub.UnsubReq{
  122. Name_: sf.handSub.Name_,
  123. Uuid_: "test_uuid",
  124. }
  125. resp := Bus_.processUnsubRequest(req)
  126. if resp.Status_ != "ok" {
  127. sf.t.Fatalf("unsubGood1(): status(%v)!='ok'", resp.Status_)
  128. }
  129. }
  130. // Все поля на месте, нет подписчика.
  131. func (sf *tester) unsubBad2() {
  132. sf.t.Log("unsubBad2")
  133. Bus_.Unsubscribe(sf.handSub)
  134. count := 0
  135. for count < 100 {
  136. SleepMs()
  137. count++
  138. }
  139. req := &msg_unsub.UnsubReq{
  140. Name_: sf.handSub.Name_,
  141. Uuid_: "test_uuid",
  142. }
  143. resp := Bus_.processUnsubRequest(req)
  144. if resp.Status_ == "ok" {
  145. sf.t.Fatalf("unsubBad2(): status(%v)=='ok'", resp.Status_)
  146. }
  147. }
  148. // Нет полей для процесса отписки.
  149. func (sf *tester) unsubBad1() {
  150. sf.t.Log("unsubBad1")
  151. defer func() {
  152. if _panic := recover(); _panic == nil {
  153. sf.t.Fatalf("unsubBad1(): panic==nil")
  154. }
  155. }()
  156. req := &msg_unsub.UnsubReq{}
  157. _ = Bus_.processUnsubRequest(req)
  158. }
  159. // Запрос на публикацию.
  160. func (sf *tester) pub() {
  161. sf.t.Log("pub")
  162. sf.pubBad1()
  163. sf.pubGood1()
  164. sf.pubBad2()
  165. sf.pubBad3()
  166. sf.pubGood2()
  167. }
  168. func (sf *tester) pubGood2() {
  169. sf.t.Log("pubGood2")
  170. req := &msg_pub.PublishReq{
  171. Topic_: "topic_sub",
  172. Uuid_: "test_uuid",
  173. BinMsg_: []byte("http_pub"),
  174. }
  175. binReq, _ := json.MarshalIndent(req, "", " ")
  176. body := strings.NewReader(string(binReq))
  177. resServ := kserv_http.GetKernelServHttp()
  178. fibApp := resServ.Hassert("pubGood2").Fiber()
  179. hReq, err := http.NewRequest(http.MethodPost, "/bus/pub", body)
  180. hReq.Header.Add("Content-Type", "application/json")
  181. if err != nil {
  182. sf.t.Fatalf("pubGood2(): err=%v", err)
  183. }
  184. _resp, err := fibApp.Test(hReq)
  185. if err != nil {
  186. sf.t.Fatalf("pubGood2(): after request, err=%v", err)
  187. }
  188. defer func() {
  189. _ = _resp.Body.Close()
  190. }()
  191. if _resp.StatusCode != http.StatusOK {
  192. sf.t.Fatalf("pubGood2(): statusCode(%v)!=200", _resp.StatusCode)
  193. }
  194. binBody, _ := io.ReadAll(_resp.Body)
  195. resp := &msg_pub.PublishResp{}
  196. err = json.Unmarshal(binBody, resp)
  197. if err != nil {
  198. sf.t.Fatalf("pubGood2(): err=%v", err)
  199. }
  200. if resp.Status_ != "ok" {
  201. sf.t.Fatalf("pubGood2(): resp(%v)!='ok'", resp.Status_)
  202. }
  203. }
  204. // Кривой запрос.
  205. func (sf *tester) pubBad3() {
  206. sf.t.Log("pubBad3")
  207. req := "tra-la-la"
  208. binReq, _ := json.MarshalIndent(req, "", " ")
  209. body := strings.NewReader(string(binReq))
  210. resServ := kserv_http.GetKernelServHttp()
  211. fibApp := resServ.Hassert("pubBad3").Fiber()
  212. hReq, err := http.NewRequest(http.MethodPost, "/bus/pub", body)
  213. hReq.Header.Add("Content-Type", "application/json")
  214. if err != nil {
  215. sf.t.Fatalf("pubBad3(): err=%v", err)
  216. }
  217. _resp, err := fibApp.Test(hReq)
  218. if err != nil {
  219. sf.t.Fatalf("pubBad3(): after request, err=%v", err)
  220. }
  221. defer func() {
  222. _ = _resp.Body.Close()
  223. }()
  224. if _resp.StatusCode == http.StatusOK {
  225. sf.t.Fatalf("pubBad3(): statusCode(%v)==200", _resp.StatusCode)
  226. }
  227. }
  228. // Что-то случилось внутри шины.
  229. func (sf *tester) pubBad2() {
  230. sf.t.Log("pubBad2")
  231. Bus_.IsWork_.Reset()
  232. defer Bus_.IsWork_.Set()
  233. req := &msg_pub.PublishReq{
  234. Topic_: "topic_sub",
  235. Uuid_: "test_uuid",
  236. BinMsg_: []byte("test_pub"),
  237. }
  238. resp := Bus_.processPublish(req)
  239. if resp.Status_ == "ok" {
  240. sf.t.Fatalf("pubBad2(): status(%v)=='ok'", resp.Status_)
  241. }
  242. }
  243. // Все поля на месте.
  244. func (sf *tester) pubGood1() {
  245. sf.t.Log("pubGood1")
  246. res := Bus_.Subscribe(sf.handSub)
  247. if res.IsErr() {
  248. sf.t.Fatalf("pubGood1(): err=%v", res.Err())
  249. }
  250. req := &msg_pub.PublishReq{
  251. Topic_: "topic_sub",
  252. Uuid_: "test_uuid",
  253. BinMsg_: []byte("test_pub"),
  254. }
  255. _ = Bus_.processPublish(req)
  256. for {
  257. SleepMs()
  258. msg := sf.handSub.Msg()
  259. if msg != "" {
  260. break
  261. }
  262. }
  263. msg := sf.handSub.Msg()
  264. if msg != "test_pub" {
  265. sf.t.Fatalf("pubGood1(): msg(%v)!='test_pub'", msg)
  266. }
  267. }
  268. // Нет полей для процесса публикации.
  269. func (sf *tester) pubBad1() {
  270. sf.t.Log("pubBad1")
  271. defer func() {
  272. if _panic := recover(); _panic == nil {
  273. sf.t.Fatalf("pubBad1(): panic==nil")
  274. }
  275. }()
  276. req := &msg_pub.PublishReq{}
  277. _ = Bus_.processPublish(req)
  278. }
  279. // Запрос подписки на топик.
  280. func (sf *tester) sub() {
  281. sf.t.Log("sub")
  282. sf.subBad1()
  283. sf.subBad2()
  284. sf.subGood1()
  285. sf.subBad3()
  286. sf.subGood2()
  287. }
  288. // Полный процесс подписки.
  289. func (sf *tester) subGood2() {
  290. sf.t.Log("subGood2")
  291. req := &msg_sub.SubscribeReq{
  292. Topic_: "topic_serv",
  293. Uuid_: "test_uuid",
  294. WebHook_: "http://localhost:18200/bus/pub/",
  295. }
  296. binReq, _ := json.MarshalIndent(req, "", " ")
  297. body := strings.NewReader(string(binReq))
  298. resServ := kserv_http.GetKernelServHttp()
  299. fibApp := resServ.Hassert("subGood2").Fiber()
  300. hReq, err := http.NewRequest(http.MethodPost, "/bus/sub", body)
  301. hReq.Header.Add("Content-Type", "application/json")
  302. if err != nil {
  303. sf.t.Fatalf("subBad1(): err=%v", err)
  304. }
  305. _resp, err := fibApp.Test(hReq)
  306. if err != nil {
  307. sf.t.Fatalf("subBad1(): after request, err=%v", err)
  308. }
  309. defer func() {
  310. _ = _resp.Body.Close()
  311. }()
  312. if _resp.StatusCode != http.StatusOK {
  313. sf.t.Fatalf("subBad1(): statusCode(%v)!=200", _resp.StatusCode)
  314. }
  315. binBody, _ := io.ReadAll(_resp.Body)
  316. resp := &msg_sub.SubscribeResp{}
  317. err = json.Unmarshal(binBody, resp)
  318. if err != nil {
  319. sf.t.Fatalf("subBad1(): err=%v", err)
  320. }
  321. if resp.Status_ != "ok" {
  322. sf.t.Fatalf("subBad1(): resp(%v)!='ok'", resp.Status_)
  323. }
  324. }
  325. // Отключена базовая шина.
  326. func (sf *tester) subBad3() {
  327. sf.t.Log("subBad3")
  328. req := &msg_sub.SubscribeReq{
  329. Topic_: "topic_serv",
  330. Uuid_: "test_uuid",
  331. WebHook_: "http://localhost:18200/bus/pub/",
  332. }
  333. defer func() {
  334. if _panic := recover(); _panic != nil {
  335. sf.t.Fatalf("subBad3(): panic!=nil")
  336. }
  337. }()
  338. // _bus := kernel_bus_base.GetKernelBusBase()
  339. Bus_.IsWork_.Reset()
  340. defer Bus_.IsWork_.Set()
  341. resp := Bus_.processSubscribe(req)
  342. if resp.Status_ == "ok" {
  343. sf.t.Fatalf("subBad3(): resp==ok")
  344. }
  345. }
  346. // Проверка полей запроса в процессе подписки.
  347. func (sf *tester) subGood1() {
  348. sf.t.Log("subGood1")
  349. req := &msg_sub.SubscribeReq{
  350. Topic_: "topic_serv",
  351. Uuid_: "test_uuid",
  352. WebHook_: "http://localhost:18200/bus/",
  353. }
  354. defer func() {
  355. if _panic := recover(); _panic != nil {
  356. sf.t.Fatalf("subGood1(): panic!=nil")
  357. }
  358. }()
  359. _ = Bus_.processSubscribe(req)
  360. }
  361. // Проверка кривых полей запроса в процессе подписки.
  362. func (sf *tester) subBad2() {
  363. sf.t.Log("subBad2")
  364. req := &msg_sub.SubscribeReq{
  365. Topic_: "",
  366. }
  367. defer func() {
  368. if _panic := recover(); _panic == nil {
  369. sf.t.Fatalf("subBad2(): panic==nil")
  370. }
  371. }()
  372. _ = Bus_.processSubscribe(req)
  373. }
  374. // Кривой запрос.
  375. func (sf *tester) subBad1() {
  376. sf.t.Log("subBad1")
  377. req := "tra-ta-ta"
  378. binReq, _ := json.MarshalIndent(req, "", " ")
  379. body := strings.NewReader(string(binReq))
  380. resServ := kserv_http.GetKernelServHttp()
  381. fibApp := resServ.Hassert("subBad1").Fiber()
  382. hReq, err := http.NewRequest(http.MethodPost, "/bus/sub", body)
  383. hReq.Header.Add("Content-Type", "application/json")
  384. if err != nil {
  385. sf.t.Fatalf("subBad1(): err=%v", err)
  386. }
  387. _resp, err := fibApp.Test(hReq)
  388. if err != nil {
  389. sf.t.Fatalf("subBad1(): after request, err=%v", err)
  390. }
  391. defer func() {
  392. _ = _resp.Body.Close()
  393. }()
  394. if _resp.StatusCode != http.StatusBadRequest {
  395. sf.t.Fatalf("subBad1(): statusCode(%v)!=400", _resp.StatusCode)
  396. }
  397. }
  398. // Входящий запрос.
  399. func (sf *tester) req() {
  400. sf.t.Log("req")
  401. sf.reqBad1()
  402. sf.reqBad2()
  403. sf.reqBad3()
  404. sf.reqGood1()
  405. sf.reqBad4()
  406. }
  407. // Что-то с обработчиком.
  408. func (sf *tester) reqBad4() {
  409. sf.t.Log("reqBad4")
  410. sf.handServ.IsBad_.Set()
  411. defer sf.handServ.IsBad_.Reset()
  412. req := &msg_serve.ServeReq{
  413. Topic_: sf.handServ.Topic_,
  414. Uuid_: "test_uuid",
  415. BinReq_: []byte("test_msg"),
  416. }
  417. binReq, _ := json.MarshalIndent(req, "", " ")
  418. body := strings.NewReader(string(binReq))
  419. resServ := kserv_http.GetKernelServHttp()
  420. fibApp := resServ.Hassert("reqBad4").Fiber()
  421. hReq, err := http.NewRequest(http.MethodPost, "/bus/request", body)
  422. hReq.Header.Add("Content-Type", "application/json")
  423. if err != nil {
  424. sf.t.Fatalf("reqBad4(): err=%v", err)
  425. }
  426. _resp, err := fibApp.Test(hReq)
  427. if err != nil {
  428. sf.t.Fatalf("reqBad4(): after request, err=%v", err)
  429. }
  430. defer func() {
  431. _ = _resp.Body.Close()
  432. }()
  433. if _resp.StatusCode != http.StatusOK {
  434. sf.t.Fatalf("reqBad4(): statusCode(%v)!=200", _resp.StatusCode)
  435. }
  436. binBody, _ := io.ReadAll(_resp.Body)
  437. resp := &msg_serve.ServeResp{}
  438. err = json.Unmarshal(binBody, resp)
  439. if err != nil {
  440. sf.t.Fatalf("reqBad4(): err=%v", err)
  441. }
  442. if resp.Status_ == "ok" {
  443. sf.t.Fatalf("reqBad4(): status(%v)=='ok'", resp.Status_)
  444. }
  445. }
  446. func (sf *tester) reqGood1() {
  447. sf.t.Log("reqGood1")
  448. req := &msg_serve.ServeReq{
  449. Topic_: sf.handServ.Topic_,
  450. Uuid_: "test_uuid",
  451. BinReq_: []byte("test_msg"),
  452. }
  453. binReq, _ := json.MarshalIndent(req, "", " ")
  454. body := strings.NewReader(string(binReq))
  455. resServ := kserv_http.GetKernelServHttp()
  456. fibApp := resServ.Hassert("reqGood1").Fiber()
  457. hReq, err := http.NewRequest(http.MethodPost, "/bus/request", body)
  458. hReq.Header.Add("Content-Type", "application/json")
  459. if err != nil {
  460. sf.t.Fatalf("reqGood1(): err=%v", err)
  461. }
  462. _resp, err := fibApp.Test(hReq)
  463. if err != nil {
  464. sf.t.Fatalf("reqGood1(): after request, err=%v", err)
  465. }
  466. if _resp.StatusCode != http.StatusOK {
  467. sf.t.Fatalf("reqGood1(): statusCode(%v)!=200", _resp.StatusCode)
  468. }
  469. defer func() {
  470. _ = _resp.Body.Close()
  471. }()
  472. binBody, _ := io.ReadAll(_resp.Body)
  473. resp := &msg_serve.ServeResp{}
  474. err = json.Unmarshal(binBody, resp)
  475. if err != nil {
  476. sf.t.Fatalf("reqGood1(): err=%v", err)
  477. }
  478. if string(resp.BinResp_) != "test_msg" {
  479. sf.t.Fatalf("reqGood1(): resp(%v)!='test_msg'", string(resp.BinResp_))
  480. }
  481. }
  482. // Нет такого топика для запросов.
  483. func (sf *tester) reqBad3() {
  484. sf.t.Log("reqBad3")
  485. req := &msg_serve.ServeReq{
  486. Topic_: "bad_topic",
  487. Uuid_: "test_uuid",
  488. BinReq_: []byte("test_msg"),
  489. }
  490. binReq, _ := json.MarshalIndent(req, "", " ")
  491. body := strings.NewReader(string(binReq))
  492. resServ := kserv_http.GetKernelServHttp()
  493. fibApp := resServ.Hassert("reqBad3").Fiber()
  494. hReq, err := http.NewRequest(http.MethodPost, "/bus/request", body)
  495. if err != nil {
  496. sf.t.Fatalf("reqBad3(): err=%v", err)
  497. }
  498. resp, err := fibApp.Test(hReq)
  499. if err != nil {
  500. sf.t.Fatalf("reqBad3(): after request, err=%v", err)
  501. }
  502. defer func() {
  503. _ = resp.Body.Close()
  504. }()
  505. if resp.StatusCode != http.StatusBadRequest {
  506. sf.t.Fatalf("reqBad3(): statusCode(%v)!=400", resp.StatusCode)
  507. }
  508. }
  509. // Нет тела запроса.
  510. func (sf *tester) reqBad2() {
  511. sf.t.Log("reqBad1")
  512. body := strings.NewReader("test_msg")
  513. resServ := kserv_http.GetKernelServHttp()
  514. fibApp := resServ.Hassert("reqBad2").Fiber()
  515. hReq, err := http.NewRequest(http.MethodPost, "/bus/request", body)
  516. if err != nil {
  517. sf.t.Fatalf("reqBad1(): err=%v", err)
  518. }
  519. resp, err := fibApp.Test(hReq)
  520. if err != nil {
  521. sf.t.Fatalf("reqBad1(): after request, err=%v", err)
  522. }
  523. defer func() {
  524. _ = resp.Body.Close()
  525. }()
  526. if resp.StatusCode != http.StatusBadRequest {
  527. sf.t.Fatalf("reqBad1(): statusCode(%v)!=400", resp.StatusCode)
  528. }
  529. }
  530. // Отсутствуют поля в запросе.
  531. func (sf *tester) reqBad1() {
  532. sf.t.Log("reqBad1")
  533. defer func() {
  534. if _panic := recover(); _panic == nil {
  535. sf.t.Fatalf("reqBad1(): panic==nil")
  536. }
  537. }()
  538. Bus_.processSendRequest(nil)
  539. }
  540. // Получает локальную шину.
  541. func (sf *tester) get() {
  542. sf.t.Log("get")
  543. _ = MakeEnv()
  544. _ = os.Unsetenv("LOCAL_HTTP_URL")
  545. _ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18312/")
  546. _ = GetKernelBusHttp()
  547. if Bus_ == nil {
  548. sf.t.Fatalf("get(): bus==nil")
  549. }
  550. _ = GetKernelBusHttp()
  551. Bus_.RegisterServe(sf.handServ).Hassert("get()")
  552. }