MCPcopy Create free account
hub / github.com/apache/trafficserver / state_read_socks5_client_request

Method state_read_socks5_client_request

src/traffic_server/SocksProxy.cc:437–490  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

435}
436
437int
438SocksProxy::state_read_socks5_client_request(int event, [[maybe_unused]] void *data)
439{
440 int64_t n;
441 unsigned char *p;
442
443 ink_assert(state == AUTH_DONE);
444 if (event != VC_EVENT_READ_READY) {
445 ink_assert(!"not reached");
446 return EVENT_CONT;
447 }
448
449 n = reader->block_read_avail();
450 p = (unsigned char *)reader->start();
451
452 /* Socks v5 request:
453 * VER CMD RSV ATYP DST DSTPORT
454 * 1 + 1 + 1 + 1 + ? + 2
455 *
456 * so the minimum length is 6 + 4(IPv4) or 16(IPv6)
457 */
458 if (n <= 6) {
459 return EVENT_CONT;
460 }
461 int req_len;
462 switch (p[3]) {
463 case SOCKS_ATYPE_IPV4:
464 req_len = 10;
465 break;
466 case SOCKS_ATYPE_FQHN:
467 req_len = 7 + p[4];
468 break;
469 case SOCKS_ATYPE_IPV6:
470 req_len = 22;
471 break;
472 default:
473 req_len = INT_MAX;
474 state = SOCKS_ERROR;
475 Dbg(dbg_ctl_SocksProxy, "Illegal address type(%d)", static_cast<int>(p[3]));
476 }
477
478 if (state == SOCKS_ERROR) {
479 return EVENT_DONE;
480 } else if (n < req_len) {
481 return EVENT_CONT;
482 }
483
484 port = p[req_len - 2] * 256 + p[req_len - 1];
485 clientVC->socks_addr.type = p[3];
486 auth_handler = nullptr;
487 reader->consume(req_len);
488
489 return parse_socks_client_request(p);
490}
491
492int
493SocksProxy::parse_socks_client_request(unsigned char *p)

Callers

nothing calls this directly

Calls 3

block_read_availMethod · 0.80
startMethod · 0.45
consumeMethod · 0.45

Tested by

no test coverage detected