Ejemplo n.º 1
0
FskErr KprSocketSend(KprSocket self, FskMemPtr data, UInt32 length)
{
	FskErr err = kFskErrNone;

	if (self->writer == NULL) return kFskErrConnectionClosed;

	KprSocketWriterSendBytes(self->writer, data, length);
	return err;
}
Ejemplo n.º 2
0
static FskErr KprWebSocketEndpointUpgradeConnection(KprWebSocketEndpoint self)
{
	FskErr err = kFskErrNone;
	FskHeaders *request;
	char buffer[1024], tmp[1024], portStr[10];
	int len, port;
	
	bailIfError(FskHeaderStructNew(&request));
	
	port = (self->parts->port ? port = self->parts->port : 80);
	
	if (port == 80) {
		FskHeaderAddString("Host", self->parts->host, request);
	} else {
		FskStrCopy(tmp, self->parts->host);
		FskStrCat(tmp, ":");
		FskStrNumToStr(port, portStr, 10);
		FskStrCat(tmp, portStr);
		FskHeaderAddString("Host", tmp, request);
	}
	
	if (self->origin) {
		FskHeaderAddString("Origin", self->origin, request);
	} else {
		FskStrCopy(tmp, "http://");
		FskStrCat(tmp, self->parts->host);
		FskHeaderAddString("Origin", tmp, request);
	}
	
	FskHeaderAddString("Upgrade", "websocket", request);
	FskHeaderAddString("Connection", "Upgrade", request);
	
	KprWebSocketCreateKey(&self->key);
	FskHeaderAddString("Sec-WebSocket-Key", self->key, request);
	FskHeaderAddInteger("Sec-WebSocket-Version", 13, request);
	
	FskStrCopy(buffer, "GET ");
	if (self->parts->path[0] != '/') FskStrCat(buffer, "/");
	FskStrCat(buffer, self->parts->path);
	FskStrCat(buffer, " HTTP/1.1\r\n");
	
	len = FskStrLen(buffer);
	FskHeaderGenerateOutputBlob(&buffer[len], 1024 - len, true, request);
	
	KprSocketWriterSendBytes(self->writer, buffer, FskStrLen(buffer));
	
bail:
	
	return err;
}
Ejemplo n.º 3
0
static FskErr KprWebSocketEndpointSendRawFrame(KprWebSocketEndpoint self, UInt8 opcode, void *payload, UInt32 length)
{
	FskErr err = kFskErrNone;
	void *frame = NULL;
	UInt32 frameLength;
	
	if (self->closeWasSent) return kFskErrBadState;
	if (self->writer == NULL) return kFskErrBadState;

	bailIfError(KprWebSocketEndpointCreateFrame(true, opcode, self->doMask, payload, length, &frame, &frameLength));
	KprSocketWriterSendBytes(self->writer, frame, frameLength);
	
bail:
	if (frame) FskMemPtrDispose(frame);
	return err;
}
Ejemplo n.º 4
0
static FskErr KprWebSocketEndpointSendRawFrame(KprWebSocketEndpoint self, UInt8 opcode, void *payload, UInt32 length)
{
	FskErr err = kFskErrNone;
	void *frame = NULL;
	UInt32 frameLength;

	if (self->state == kKprWebSocketStateConnecting) return kFskErrBadState;
	if (self->closeWasSent || self->writer == NULL) {
		CALLBACK(errorCallback)(self, kFskErrConnectionClosed, "endpoint closed", self->refcon);
		return kFskErrNone;
	}

	bailIfError(KprWebSocketEndpointCreateFrame(true, opcode, self->doMask, payload, length, &frame, &frameLength));
	KprSocketWriterSendBytes(self->writer, frame, frameLength);
	
bail:
	if (frame) FskMemPtrDispose(frame);
	return err;
}
Ejemplo n.º 5
0
void KprDebugMachineDispatchCommand(KprDebugMachine self, int theCommand, char* name, char* value, SInt32 number)
{
	static char aBuffer[16 * 1024];
	static char aValue[4096];
	int aCount;
	char* aColon;
	char* aLine;
	
	strcpy(aBuffer, "HTTP/1.1 200 OK\15\12Content-type: xml/xsbug\15\12\15\12");
	strcat(aBuffer, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
	switch (theCommand) {
	case mxAbortCommand:
		strcat(aBuffer, "<abort/>");
		break;
	case mxGoCommand:
		strcat(aBuffer, "<go/>");
		break;
	case mxStepCommand:
		strcat(aBuffer, "<step/>");
		break;
	case mxStepInCommand:
		strcat(aBuffer, "<step-inside/>");
		break;
	case mxStepOutCommand:
		strcat(aBuffer, "<step-outside/>");
		break;
	case mxClearAllBreakpointsCommand:
		strcat(aBuffer, "<clear-all-breakpoints/>");
		break;
		
	case mxClearBreakpointCommand:
		if (name && (number >= 0)) {
			strcat(aBuffer, "<clear-breakpoint path=\"");
			strcat(aBuffer, name);
			strcat(aBuffer, "\" line=\"");
			sprintf(aValue, "%ld", number);
			strcat(aBuffer, aValue);
			strcat(aBuffer, "\"/>");
		}
		else
			return;
		break;
	case mxSetBreakpointCommand:
		if (name && (number >= 0)) {
			strcat(aBuffer, "<set-breakpoint path=\"");
			strcat(aBuffer, name);
			strcat(aBuffer, "\" line=\"");
			sprintf(aValue, "%ld", number);
			strcat(aBuffer, aValue);
			strcat(aBuffer, "\"/>");
		}
		else
			return;
		break;
	
	case mxLogView:
		aCount = FskStrLen(name);
		if (aCount) {
			aColon = name;
			if ((name[1] == ':') && ((name[2] == '/') || (name[2] == '\\')))
				aColon += 3;
			aColon = strchr(aColon, ':');
			if (aColon) {
				*aColon = 0;
				aLine = aColon + 1;
				aColon = strchr(aLine, ':');
				if (aColon) {
					*aColon = 0;
					KprDebugMachineLoadView(self, mxFileView, name, strtol(aLine, NULL, 10));
				}
			}
		}
		return;

	case mxFilesView:
		KprDebugMachineLoadView(self, mxFileView, name, -1);
		return;
	case mxBreakpointsView:
		aCount = FskStrLen(name);
		if (aCount)
			KprDebugMachineLoadView(self, mxFileView, name, number);
		return;
	case mxFramesView:
		KprDebugMachineLoadView(self, mxFileView, name, number);
		aCount = FskStrLen(value);
		if (aCount && (value[0] == '@')) {
			strcat(aBuffer, "<select id=\"");
			strcat(aBuffer, value);
			strcat(aBuffer, "\"/>");
		}
		else
			return;
		break;	
	case mxGrammarsView:
		aCount = FskStrLen(name);
		aColon = strrchr(name, ' ');
		if (aColon) {
			aColon++;
			aLine = aColon;
			if ((aLine[1] == ':') && ((aLine[2] == '/') || (aLine[2] == '\\')))
				aLine += 3;
			aLine = strchr(aLine, ':');
			if (aLine) {
				*aLine = 0;
				KprDebugMachineLoadView(self, mxFileView, aColon, strtol(aLine + 1, NULL, 10));
			}
		}
		/* continue */	
	case mxLocalsView:
	case mxGlobalsView:
		aCount = value ? FskStrLen(value) : 0;
		if (aCount && (value[0] == '@')) {
			strcat(aBuffer, "<toggle id=\"");
			strcat(aBuffer, value);
			strcat(aBuffer, "\"/>");
		}
		else
			return;
		break;
	default:
		return;
	}
	aCount = strlen(aBuffer);
	KprSocketWriterSendBytes(self->writer, aBuffer, aCount);
}