FskErr KprSocketSend(KprSocket self, FskMemPtr data, UInt32 length) { FskErr err = kFskErrNone; if (self->writer == NULL) return kFskErrConnectionClosed; KprSocketWriterSendBytes(self->writer, data, length); return err; }
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; }
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; }
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; }
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); }