/******************************************************************************* * Copyright (c) 2017 Alex Xu and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Alex Xu - initial API and implementation *******************************************************************************/ package org.eclipse.php.internal.server.core.builtin; import java.io.IOException; import java.io.UnsupportedEncodingException; import org.apache.http.HttpException; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpServerConnection; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicHttpRequest; import org.apache.http.protocol.HttpContext; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.php.debug.core.debugger.parameters.IDebugParametersInitializer; import org.eclipse.php.internal.debug.core.launching.PHPLaunchUtilities; import org.eclipse.php.internal.debug.core.zend.debugger.DebugParametersInitializersRegistry; import org.eclipse.php.internal.server.core.builtin.debugger.HttpReverseProxyServer; import org.eclipse.php.internal.server.core.builtin.debugger.HttpReverseProxyServer.IHttpRequestHandler; import org.eclipse.php.internal.server.core.builtin.debugger.PHPServerDebugTarget; @SuppressWarnings("restriction") public class DefaultPHPServerDebugger extends DefaultPHPServerRunner { private HttpReverseProxyServer proxyServer; @Override public void run(PHPServerRunnerConfiguration configuration, ILaunch launch, IProgressMonitor monitor) throws CoreException { super.run(configuration, launch, monitor); IDebugTarget target = new PHPServerDebugTarget(launch, launch.getProcesses()[0]); launch.addDebugTarget(target); IDebugParametersInitializer parametersInitializer = DebugParametersInitializersRegistry .getBestMatchDebugParametersInitializer(launch); String query = PHPLaunchUtilities.generateQuery(launch, parametersInitializer); proxyServer = new HttpReverseProxyServer(new HttpRequestHandler(getServerPort(), query)); try { proxyServer.start(configuration.getPort()); } catch (Exception e) { e.printStackTrace(); } } @Override public int getServerPort() { return super.getServerPort() + 1; } class HttpRequestHandler implements IHttpRequestHandler { private int fPort; private String fDebugQuery; HttpRequestHandler(int port, String debugQuery) { fPort = port; fDebugQuery = debugQuery; } @Override public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException { HttpClient client = HttpClientBuilder.create().build(); HttpResponse response1 = client.execute(new HttpHost("localhost", fPort), createHttpRequest(request)); //$NON-NLS-1$ response.setEntity(response1.getEntity()); response.setStatusCode(response1.getStatusLine().getStatusCode()); } private HttpRequest createHttpRequest(HttpRequest request) throws UnsupportedEncodingException { String uri = request.getRequestLine().getUri(); if (uri.indexOf('?') == -1) { uri = uri + '?' + fDebugQuery; } else { uri = uri + '&' + fDebugQuery; } HttpRequest newRequest = new BasicHttpRequest(request.getRequestLine().getMethod(), uri, request.getProtocolVersion()); newRequest.setHeaders(request.getAllHeaders()); newRequest.setParams(request.getParams()); return newRequest; } @Override public void close(HttpServerConnection connection) throws IOException { if (connection != null) { connection.close(); } } } @Override public void stop() { if (proxyServer != null) { proxyServer.stop(); } } }