| /* | |
| * Copyright (C) 2008-2009, Google Inc. and others | |
| * | |
| * This program and the accompanying materials are made available under the | |
| * terms of the Eclipse Distribution License v. 1.0 which is available at | |
| * https://www.eclipse.org/org/documents/edl-v10.php. | |
| * | |
| * SPDX-License-Identifier: BSD-3-Clause | |
| */ | |
| package org.eclipse.jgit.transport; | |
| import java.io.BufferedInputStream; | |
| import java.io.BufferedOutputStream; | |
| import java.io.IOException; | |
| import java.io.InputStream; | |
| import java.io.OutputStream; | |
| import java.net.InetAddress; | |
| import java.net.Socket; | |
| import java.util.Arrays; | |
| import java.util.Collection; | |
| import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; | |
| import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; | |
| /** | |
| * Active network client of {@link org.eclipse.jgit.transport.Daemon}. | |
| */ | |
| public class DaemonClient { | |
| private final Daemon daemon; | |
| private InetAddress peer; | |
| private InputStream rawIn; | |
| private OutputStream rawOut; | |
| DaemonClient(Daemon d) { | |
| daemon = d; | |
| } | |
| void setRemoteAddress(InetAddress ia) { | |
| peer = ia; | |
| } | |
| /** | |
| * Get the daemon which spawned this client. | |
| * | |
| * @return the daemon which spawned this client. | |
| */ | |
| public Daemon getDaemon() { | |
| return daemon; | |
| } | |
| /** | |
| * Get Internet address of the remote client. | |
| * | |
| * @return Internet address of the remote client. | |
| */ | |
| public InetAddress getRemoteAddress() { | |
| return peer; | |
| } | |
| /** | |
| * Get input stream to read from the connected client. | |
| * | |
| * @return input stream to read from the connected client. | |
| */ | |
| public InputStream getInputStream() { | |
| return rawIn; | |
| } | |
| /** | |
| * Get output stream to send data to the connected client. | |
| * | |
| * @return output stream to send data to the connected client. | |
| */ | |
| public OutputStream getOutputStream() { | |
| return rawOut; | |
| } | |
| void execute(Socket sock) throws IOException, | |
| ServiceNotEnabledException, ServiceNotAuthorizedException { | |
| rawIn = new BufferedInputStream(sock.getInputStream()); | |
| rawOut = new BufferedOutputStream(sock.getOutputStream()); | |
| if (0 < daemon.getTimeout()) | |
| sock.setSoTimeout(daemon.getTimeout() * 1000); | |
| String cmd = new PacketLineIn(rawIn).readStringRaw(); | |
| Collection<String> extraParameters = null; | |
| int nulnul = cmd.indexOf("\0\0"); //$NON-NLS-1$ | |
| if (nulnul != -1) { | |
| extraParameters = Arrays.asList(cmd.substring(nulnul + 2).split("\0")); //$NON-NLS-1$ | |
| } | |
| final int nul = cmd.indexOf('\0'); | |
| if (nul >= 0) { | |
| // Newer clients hide a "host" header behind this byte. | |
| // Currently we don't use it for anything, so we ignore | |
| // this portion of the command. | |
| // | |
| cmd = cmd.substring(0, nul); | |
| } | |
| final DaemonService srv = getDaemon().matchService(cmd); | |
| if (srv == null) | |
| return; | |
| sock.setSoTimeout(0); | |
| srv.execute(this, cmd, extraParameters); | |
| } | |
| } |