| 445 | } |
| 446 | |
| 447 | static int |
| 448 | ts_lua_fill_one_result(lua_State *L, ts_lua_fetch_info *fi) |
| 449 | { |
| 450 | const char *name, *value; |
| 451 | int name_len, value_len; |
| 452 | char *dst; |
| 453 | int64_t ravail; |
| 454 | TSMBuffer bufp; |
| 455 | TSMLoc hdrp; |
| 456 | TSMLoc field_loc, next_field_loc; |
| 457 | TSHttpStatus status; |
| 458 | |
| 459 | bufp = TSFetchRespHdrMBufGet(fi->fch); |
| 460 | hdrp = TSFetchRespHdrMLocGet(fi->fch); |
| 461 | |
| 462 | // result table |
| 463 | lua_newtable(L); |
| 464 | |
| 465 | // status code |
| 466 | status = TSHttpHdrStatusGet(bufp, hdrp); |
| 467 | lua_pushlstring(L, "status", sizeof("status") - 1); |
| 468 | lua_pushnumber(L, status); |
| 469 | lua_rawset(L, -3); |
| 470 | |
| 471 | // header |
| 472 | lua_pushlstring(L, "header", sizeof("header") - 1); |
| 473 | lua_newtable(L); |
| 474 | |
| 475 | field_loc = TSMimeHdrFieldGet(bufp, hdrp, 0); |
| 476 | while (field_loc) { |
| 477 | name = TSMimeHdrFieldNameGet(bufp, hdrp, field_loc, &name_len); |
| 478 | value = TSMimeHdrFieldValueStringGet(bufp, hdrp, field_loc, -1, &value_len); |
| 479 | |
| 480 | lua_pushlstring(L, name, name_len); |
| 481 | lua_pushlstring(L, value, value_len); |
| 482 | lua_rawset(L, -3); |
| 483 | |
| 484 | next_field_loc = TSMimeHdrFieldNext(bufp, hdrp, field_loc); |
| 485 | TSHandleMLocRelease(bufp, hdrp, field_loc); |
| 486 | field_loc = next_field_loc; |
| 487 | } |
| 488 | lua_rawset(L, -3); |
| 489 | |
| 490 | // body |
| 491 | ravail = TSIOBufferReaderAvail(fi->reader); |
| 492 | if (ravail > 0) { |
| 493 | lua_pushlstring(L, "body", sizeof("body") - 1); |
| 494 | |
| 495 | dst = (char *)TSmalloc(ravail); |
| 496 | IOBufferReaderCopy(fi->reader, dst, ravail); |
| 497 | lua_pushlstring(L, (char *)dst, ravail); |
| 498 | |
| 499 | lua_rawset(L, -3); |
| 500 | TSfree(dst); |
| 501 | } |
| 502 | |
| 503 | // truncated |
| 504 | lua_pushlstring(L, "truncated", sizeof("truncated") - 1); |
no test coverage detected