Files
thrift/test/php/protocols.php
Volodymyr Panivko f69b418f1f THRIFT-6023: Add HTTP transport support to PHP cross-tests (#3515)
Client: php

PHP was the only major-language entry stuck on buffered/framed sockets
while Python, Go, Node, C++, Java, Lua, Dart, JS, D, and Haskell already
declared http in their cross-test transports.

Server (test/php/TestServer.php + HttpRouter.php + HttpServer.php):
- On --transport=http, TestServer pcntl_exec()s into 'php -S' with
  HttpRouter.php as the router. The chameleon HttpRouter dispatches on
  PHP_SAPI: cli launches php -S with itself as the per-request handler;
  cli-server invokes HttpServer.
- HttpServer reads php://input via TMemoryBuffer, peeks the message
  type, and for ONEWAY sends an empty HTTP 200 immediately while
  forking the handler so strict clients (Java) measure fast oneway
  latency. Sync path echoes the processor's response bytes.
- protocols.php centralises the protocol-name -> TProtocolFactory
  dispatch, shared between the socket entry point and the cli-server
  router.

Client (test/php/TestClient.php):
- Adds an http branch that uses TPsrHttpClient (THRIFT-6010) against
  http://127.0.0.1:$port/. Drops the duplicate makeProtocol() helper
  in favour of thrift_test_protocol_factory()->getProtocol(), removes
  the unused $host argv parsing, and normalises the file to PSR-12.

composer.json: adds guzzlehttp/guzzle ^7.8 to require-dev so PSR-18
discovery resolves a real client at cross-test time.

test/tests.json: adds 'http' to PHP server and client transports.

test/known_failures_Linux.json: lists php-cpp_*_http-ip (cpp THttpClient
does not handle Connection: close between calls — tracked as
THRIFT-6060) and nodejs-php_*_http-ip (Node http server mounts /test,
not /, matching the existing cpp-/d-/go-nodejs known failures).

Generated-by: Claude Opus 4.7
2026-06-02 08:22:23 +02:00

50 lines
1.8 KiB
PHP

<?php
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Build a protocol factory by cross-test protocol name. Shared between the
* socket-server CLI entry point (TestServer.php) and the cli-server HTTP
* router (HttpRouter.php).
*
* Uses error_log() rather than STDERR because the constant is undefined in
* the cli-server SAPI.
*/
function thrift_test_protocol_factory(string $protocol): \Thrift\Factory\TProtocolFactory
{
switch ($protocol) {
case 'binary':
return new \Thrift\Factory\TBinaryProtocolFactory(false, true);
case 'accel':
if (!function_exists('thrift_protocol_write_binary')) {
error_log('Acceleration extension is not loaded');
exit(1);
}
return new \Thrift\Factory\TBinaryProtocolAcceleratedFactory();
case 'compact':
return new \Thrift\Factory\TCompactProtocolFactory();
case 'json':
return new \Thrift\Factory\TJSONProtocolFactory();
default:
error_log('--protocol must be one of {binary|compact|json|accel}');
exit(1);
}
}