All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ociweb.ProxyRequestToBackEndStage Maven / Gradle / Ivy

package com.ociweb;

import com.ociweb.pronghorn.network.ClientCoordinator;
import com.ociweb.pronghorn.network.ServerCoordinator;
import com.ociweb.pronghorn.network.config.HTTPContentTypeDefaults;
import com.ociweb.pronghorn.network.config.HTTPHeader;
import com.ociweb.pronghorn.network.config.HTTPHeaderDefaults;
import com.ociweb.pronghorn.network.config.HTTPRevisionDefaults;
import com.ociweb.pronghorn.network.config.HTTPSpecification;
import com.ociweb.pronghorn.network.config.HTTPVerbDefaults;
import com.ociweb.pronghorn.network.http.HeaderWriter;
import com.ociweb.pronghorn.network.http.HeaderWriterLocal;
import com.ociweb.pronghorn.network.schema.ClientHTTPRequestSchema;
import com.ociweb.pronghorn.network.schema.HTTPRequestSchema;
import com.ociweb.pronghorn.pipe.DataInputBlobReader;
import com.ociweb.pronghorn.pipe.DataOutputBlobWriter;
import com.ociweb.pronghorn.pipe.Pipe;
import com.ociweb.pronghorn.pipe.StructuredReader;
import com.ociweb.pronghorn.stage.PronghornStage;
import com.ociweb.pronghorn.stage.scheduling.GraphManager;

public class ProxyRequestToBackEndStage extends PronghornStage {

	private final Pipe[] inputPipes;
	private final Pipe[] connectionId;
	private final Pipe[] clientRequests;
	private final String targetHost;
	private final int targetPort;
	private HTTPSpecification spec;
	
	public static ProxyRequestToBackEndStage newInstance(GraphManager graphManager,
			Pipe[] inputPipes, 
			Pipe[] connectionId, 
			Pipe[] clientRequests,
			ServerCoordinator serverCoordinator) {
		return new ProxyRequestToBackEndStage(graphManager, inputPipes, 
				                    connectionId, clientRequests, 
				                    serverCoordinator);
	}	
	
	public ProxyRequestToBackEndStage(GraphManager graphManager,
			Pipe[] inputPipes, 
			Pipe[] connectionId, 
			Pipe[] clientRequests,
			ServerCoordinator serverCoordinator) {
		
		super(graphManager, inputPipes, join(clientRequests,connectionId));
		this.inputPipes = inputPipes;
		this.connectionId = connectionId;
		this.clientRequests = clientRequests;
		assert(inputPipes.length == connectionId.length);
		assert(inputPipes.length == clientRequests.length);
		this.targetHost = serverCoordinator.host();
		this.targetPort = serverCoordinator.port();
		this.spec = serverCoordinator.spec;
		
		assert(targetHost!=null);
		ClientCoordinator.registerDomain(targetHost);
	}

	@Override
	public void run() {
	
		int i = inputPipes.length;
		while (--i >= 0) {
			process(inputPipes[i], connectionId[i], clientRequests[i]);
		}
		
	}
	


	private void process(
			Pipe sourceRequest, 
			Pipe targetConnectionData, 
			Pipe targetClientRequest
			) {
	
		while (Pipe.hasContentToRead(sourceRequest) && 
			   Pipe.hasRoomForWrite(targetConnectionData) &&
			   Pipe.hasRoomForWrite(targetClientRequest)
				) {
		
			int requestIdx = Pipe.takeMsgIdx(sourceRequest);

			final long connectionId = Pipe.takeLong(sourceRequest);
			final int sequenceNo = Pipe.takeInt(sourceRequest);
						
			int verb       = Pipe.takeInt(sourceRequest);
			
			DataInputBlobReader inputStream = Pipe.openInputStream(sourceRequest);
		
			int fieldDestination = 0; //pipe index for the response
			int fieldSession =1; //value for us to know which this belongs
			
			assert(fieldDestination>=0);
						
			int size = Pipe.addMsgIdx(targetClientRequest, ClientHTTPRequestSchema.MSG_GET_200);
			
			Pipe.addIntValue(fieldSession, targetClientRequest);
			Pipe.addIntValue(targetPort, targetClientRequest);
			Pipe.addIntValue(ClientCoordinator.registerDomain(targetHost), targetClientRequest);
			Pipe.addLongValue(-1,  targetClientRequest);
			Pipe.addIntValue(fieldDestination, targetClientRequest);
						
			StructuredReader reader = inputStream.structured();
			
			DataOutputBlobWriter outputStream = Pipe.openOutputStream(targetClientRequest);			
			reader.readText(WebFields.proxyGet, outputStream);
			DataOutputBlobWriter.closeLowLevelField(outputStream);
				
			
			//open as output stream for headers..
			DataOutputBlobWriter headerStream = Pipe.openOutputStream(targetClientRequest);			
			final HeaderWriter headWriter = (HeaderWriterLocal.get().target(headerStream));
			reader.visit(HTTPHeader.class, (header, hr, fId) -> {
				if (   (header != HTTPHeaderDefaults.HOST)
						&& (header != HTTPHeaderDefaults.CONNECTION)	){					
					headWriter.write((HTTPHeader)header, spec, hr);
				}
			});
			DataOutputBlobWriter.closeLowLevelField(headerStream);
			
			Pipe.confirmLowLevelWrite(targetClientRequest, size);
			Pipe.publishWrites(targetClientRequest);
			
			int revision   = Pipe.takeInt(sourceRequest);
			final int context    = Pipe.takeInt(sourceRequest);
			

			
			
			int size2 = Pipe.addMsgIdx(targetConnectionData, ConnectionData.MSG_CONNECTIONDATA_1);
			Pipe.addLongValue(connectionId, targetConnectionData);
			Pipe.addIntValue(sequenceNo, targetConnectionData);
			Pipe.addIntValue(context, targetConnectionData);
			Pipe.confirmLowLevelWrite(targetConnectionData, size2);
			Pipe.publishWrites(targetConnectionData);
			
			Pipe.confirmLowLevelRead(sourceRequest, Pipe.sizeOf(sourceRequest, requestIdx));
			Pipe.releaseReadLock(sourceRequest);
								
		}
	}
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy