Search in sources :

Example 71 with BValue

use of org.ballerinalang.model.values.BValue in project ballerina by ballerina-lang.

the class WebSocketDispatcher method dispatchPingMessage.

private static void dispatchPingMessage(WebSocketOpenConnectionInfo connectionInfo, WebSocketControlMessage controlMessage) {
    WebSocketService wsService = connectionInfo.getService();
    Resource onPingMessageResource = wsService.getResourceByName(WebSocketConstants.RESOURCE_NAME_ON_PING);
    if (onPingMessageResource == null) {
        pingAutomatically(controlMessage);
        return;
    }
    List<ParamDetail> paramDetails = onPingMessageResource.getParamDetails();
    BValue[] bValues = new BValue[paramDetails.size()];
    bValues[0] = connectionInfo.getWsConnection();
    BStruct wsPingFrame = wsService.createPingFrameStruct();
    byte[] data = controlMessage.getByteArray();
    wsPingFrame.setBlobField(0, data);
    bValues[1] = wsPingFrame;
    // TODO handle BallerinaConnectorException
    Executor.submit(onPingMessageResource, new WebSocketEmptyCallableUnitCallback(), null, null, bValues);
}
Also used : BStruct(org.ballerinalang.model.values.BStruct) ParamDetail(org.ballerinalang.connector.api.ParamDetail) BValue(org.ballerinalang.model.values.BValue) Resource(org.ballerinalang.connector.api.Resource)

Example 72 with BValue

use of org.ballerinalang.model.values.BValue in project ballerina by ballerina-lang.

the class WebSocketDispatcher method dispatchCloseMessage.

public static void dispatchCloseMessage(WebSocketOpenConnectionInfo connectionInfo, WebSocketCloseMessage closeMessage) {
    WebSocketService wsService = connectionInfo.getService();
    Resource onCloseResource = wsService.getResourceByName(WebSocketConstants.RESOURCE_NAME_ON_CLOSE);
    if (onCloseResource == null) {
        return;
    }
    List<ParamDetail> paramDetails = onCloseResource.getParamDetails();
    BValue[] bValues = new BValue[paramDetails.size()];
    bValues[0] = connectionInfo.getWsConnection();
    BStruct wsCloseFrame = wsService.createCloseFrameStruct();
    wsCloseFrame.setIntField(0, closeMessage.getCloseCode());
    wsCloseFrame.setStringField(0, closeMessage.getCloseReason());
    bValues[1] = wsCloseFrame;
    // TODO handle BallerinaConnectorException
    Executor.submit(onCloseResource, new WebSocketEmptyCallableUnitCallback(), null, null, bValues);
}
Also used : BStruct(org.ballerinalang.model.values.BStruct) ParamDetail(org.ballerinalang.connector.api.ParamDetail) BValue(org.ballerinalang.model.values.BValue) Resource(org.ballerinalang.connector.api.Resource)

Example 73 with BValue

use of org.ballerinalang.model.values.BValue in project ballerina by ballerina-lang.

the class WebSocketServerConnectorListener method onMessage.

@Override
public void onMessage(WebSocketInitMessage webSocketInitMessage) {
    HTTPCarbonMessage msg = new HTTPCarbonMessage(((DefaultWebSocketInitMessage) webSocketInitMessage).getHttpRequest());
    Map<String, String> pathParams = new HashMap<>();
    WebSocketService wsService = WebSocketDispatcher.findService(servicesRegistry, pathParams, webSocketInitMessage, msg);
    BStruct serviceEndpoint = BLangConnectorSPIUtil.createBStruct(wsService.getResources()[0].getResourceInfo().getServiceInfo().getPackageInfo().getProgramFile(), PROTOCOL_PACKAGE_HTTP, WEBSOCKET_ENDPOINT);
    BStruct serverConnector = WebSocketUtil.createAndGetBStruct(wsService.getResources()[0]);
    serverConnector.addNativeData(WebSocketConstants.WEBSOCKET_MESSAGE, webSocketInitMessage);
    serverConnector.addNativeData(WebSocketConstants.WEBSOCKET_SERVICE, wsService);
    serviceEndpoint.setRefField(SERVICE_ENDPOINT_CONNECTION_INDEX, serverConnector);
    serviceEndpoint.setRefField(3, new BMap());
    serverConnector.addNativeData(WEBSOCKET_ENDPOINT, serviceEndpoint);
    Map<String, String> upgradeHeaders = webSocketInitMessage.getHeaders();
    BMap<String, BString> bUpgradeHeaders = new BMap<>();
    upgradeHeaders.forEach((key, value) -> bUpgradeHeaders.put(key, new BString(value)));
    serviceEndpoint.setRefField(4, bUpgradeHeaders);
    Resource onUpgradeResource = wsService.getResourceByName(WebSocketConstants.RESOURCE_NAME_ON_UPGRADE);
    if (onUpgradeResource != null) {
        Semaphore semaphore = new Semaphore(0);
        AtomicBoolean isResourceExeSuccessful = new AtomicBoolean(false);
        BStruct inRequest = BLangConnectorSPIUtil.createBStruct(WebSocketUtil.getProgramFile(wsService.getResources()[0]), PROTOCOL_PACKAGE_HTTP, HttpConstants.REQUEST);
        BStruct inRequestEntity = BLangConnectorSPIUtil.createBStruct(WebSocketUtil.getProgramFile(wsService.getResources()[0]), org.ballerinalang.mime.util.Constants.PROTOCOL_PACKAGE_MIME, Constants.ENTITY);
        BStruct mediaType = BLangConnectorSPIUtil.createBStruct(WebSocketUtil.getProgramFile(wsService.getResources()[0]), org.ballerinalang.mime.util.Constants.PROTOCOL_PACKAGE_MIME, Constants.MEDIA_TYPE);
        BStruct cacheControlStruct = BLangConnectorSPIUtil.createBStruct(WebSocketUtil.getProgramFile(wsService.getResources()[0]), PROTOCOL_PACKAGE_HTTP, REQUEST_CACHE_CONTROL);
        RequestCacheControlStruct requestCacheControl = new RequestCacheControlStruct(cacheControlStruct);
        HttpUtil.populateInboundRequest(inRequest, inRequestEntity, mediaType, msg, requestCacheControl);
        List<ParamDetail> paramDetails = onUpgradeResource.getParamDetails();
        BValue[] bValues = new BValue[paramDetails.size()];
        bValues[0] = serviceEndpoint;
        bValues[1] = inRequest;
        WebSocketDispatcher.setPathParams(bValues, paramDetails, pathParams, 2);
        Tracer tracer = TraceManagerWrapper.newTracer(null, false);
        upgradeHeaders.entrySet().stream().filter(c -> c.getKey().startsWith(TraceConstants.TRACE_PREFIX)).forEach(e -> tracer.addProperty(e.getKey(), e.getValue()));
        Executor.submit(onUpgradeResource, new CallableUnitCallback() {

            @Override
            public void notifySuccess() {
                isResourceExeSuccessful.set(true);
                semaphore.release();
            }

            @Override
            public void notifyFailure(BStruct error) {
                ErrorHandlerUtils.printError("error: " + BLangVMErrors.getPrintableStackTrace(error));
                semaphore.release();
            }
        }, null, tracer, bValues);
        try {
            semaphore.acquire();
            if (isResourceExeSuccessful.get() && !webSocketInitMessage.isCancelled() && !webSocketInitMessage.isHandshakeStarted()) {
                WebSocketUtil.handleHandshake(wsService, null, serverConnector);
            }
        } catch (InterruptedException e) {
            throw new BallerinaConnectorException("Connection interrupted during handshake");
        }
    } else {
        WebSocketUtil.handleHandshake(wsService, null, serverConnector);
    }
}
Also used : LoggerFactory(org.slf4j.LoggerFactory) WebSocketTextMessage(org.wso2.transport.http.netty.contract.websocket.WebSocketTextMessage) HTTPCarbonMessage(org.wso2.transport.http.netty.message.HTTPCarbonMessage) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) CallableUnitCallback(org.ballerinalang.bre.bvm.CallableUnitCallback) RequestCacheControlStruct(org.ballerinalang.net.http.caching.RequestCacheControlStruct) HashMap(java.util.HashMap) WebSocketControlMessage(org.wso2.transport.http.netty.contract.websocket.WebSocketControlMessage) WebSocketInitMessage(org.wso2.transport.http.netty.contract.websocket.WebSocketInitMessage) BLangConnectorSPIUtil(org.ballerinalang.connector.api.BLangConnectorSPIUtil) Executor(org.ballerinalang.connector.api.Executor) Resource(org.ballerinalang.connector.api.Resource) WebSocketBinaryMessage(org.wso2.transport.http.netty.contract.websocket.WebSocketBinaryMessage) WebSocketConnectorListener(org.wso2.transport.http.netty.contract.websocket.WebSocketConnectorListener) DefaultWebSocketInitMessage(org.wso2.transport.http.netty.contractimpl.websocket.message.DefaultWebSocketInitMessage) WEBSOCKET_ENDPOINT(org.ballerinalang.net.http.WebSocketConstants.WEBSOCKET_ENDPOINT) BString(org.ballerinalang.model.values.BString) WebSocketCloseMessage(org.wso2.transport.http.netty.contract.websocket.WebSocketCloseMessage) Map(java.util.Map) BStruct(org.ballerinalang.model.values.BStruct) BMap(org.ballerinalang.model.values.BMap) Logger(org.slf4j.Logger) Semaphore(java.util.concurrent.Semaphore) ErrorHandlerUtils(org.ballerinalang.services.ErrorHandlerUtils) BLangVMErrors(org.ballerinalang.bre.bvm.BLangVMErrors) Constants(org.ballerinalang.mime.util.Constants) REQUEST_CACHE_CONTROL(org.ballerinalang.net.http.HttpConstants.REQUEST_CACHE_CONTROL) SERVICE_ENDPOINT_CONNECTION_INDEX(org.ballerinalang.net.http.HttpConstants.SERVICE_ENDPOINT_CONNECTION_INDEX) TraceManagerWrapper(org.ballerinalang.util.tracer.TraceManagerWrapper) TraceConstants(org.ballerinalang.util.tracer.TraceConstants) PROTOCOL_PACKAGE_HTTP(org.ballerinalang.net.http.HttpConstants.PROTOCOL_PACKAGE_HTTP) List(java.util.List) Tracer(org.ballerinalang.util.tracer.Tracer) ParamDetail(org.ballerinalang.connector.api.ParamDetail) BallerinaConnectorException(org.ballerinalang.connector.api.BallerinaConnectorException) BValue(org.ballerinalang.model.values.BValue) BStruct(org.ballerinalang.model.values.BStruct) HTTPCarbonMessage(org.wso2.transport.http.netty.message.HTTPCarbonMessage) BallerinaConnectorException(org.ballerinalang.connector.api.BallerinaConnectorException) HashMap(java.util.HashMap) BMap(org.ballerinalang.model.values.BMap) BString(org.ballerinalang.model.values.BString) BValue(org.ballerinalang.model.values.BValue) Tracer(org.ballerinalang.util.tracer.Tracer) Resource(org.ballerinalang.connector.api.Resource) BString(org.ballerinalang.model.values.BString) Semaphore(java.util.concurrent.Semaphore) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) ParamDetail(org.ballerinalang.connector.api.ParamDetail) RequestCacheControlStruct(org.ballerinalang.net.http.caching.RequestCacheControlStruct) CallableUnitCallback(org.ballerinalang.bre.bvm.CallableUnitCallback)

Example 74 with BValue

use of org.ballerinalang.model.values.BValue in project ballerina by ballerina-lang.

the class Promise method execute.

@Override
public void execute(Context context) {
    BStruct connectionStruct = (BStruct) context.getRefArgument(0);
    HTTPCarbonMessage inboundRequestMsg = HttpUtil.getCarbonMsg(connectionStruct, null);
    HttpUtil.serverConnectionStructCheck(inboundRequestMsg);
    BStruct pushPromiseStruct = (BStruct) context.getRefArgument(1);
    Http2PushPromise http2PushPromise = HttpUtil.getPushPromise(pushPromiseStruct, HttpUtil.createHttpPushPromise(pushPromiseStruct));
    HttpResponseFuture outboundRespStatusFuture = HttpUtil.pushPromise(inboundRequestMsg, http2PushPromise);
    BValue[] outboundResponseStatus = handleResponseStatus(context, outboundRespStatusFuture);
    context.setReturnValues(outboundResponseStatus);
}
Also used : BStruct(org.ballerinalang.model.values.BStruct) HTTPCarbonMessage(org.wso2.transport.http.netty.message.HTTPCarbonMessage) Http2PushPromise(org.wso2.transport.http.netty.message.Http2PushPromise) BValue(org.ballerinalang.model.values.BValue) HttpResponseFuture(org.wso2.transport.http.netty.contract.HttpResponseFuture)

Example 75 with BValue

use of org.ballerinalang.model.values.BValue in project ballerina by ballerina-lang.

the class PushPromisedResponse method execute.

@Override
public void execute(Context context) {
    BStruct connectionStruct = (BStruct) context.getRefArgument(0);
    HTTPCarbonMessage inboundRequestMsg = HttpUtil.getCarbonMsg(connectionStruct, null);
    HttpUtil.serverConnectionStructCheck(inboundRequestMsg);
    BStruct pushPromiseStruct = (BStruct) context.getRefArgument(1);
    Http2PushPromise http2PushPromise = HttpUtil.getPushPromise(pushPromiseStruct, null);
    if (http2PushPromise == null) {
        throw new BallerinaException("invalid push promise");
    }
    BStruct outboundResponseStruct = (BStruct) context.getRefArgument(2);
    HTTPCarbonMessage outboundResponseMsg = HttpUtil.getCarbonMsg(outboundResponseStruct, HttpUtil.createHttpCarbonMessage(false));
    HttpUtil.prepareOutboundResponse(context, inboundRequestMsg, outboundResponseMsg, outboundResponseStruct);
    BValue[] outboundResponseStatus = pushResponseRobust(context, inboundRequestMsg, outboundResponseStruct, outboundResponseMsg, http2PushPromise);
    context.setReturnValues(outboundResponseStatus);
}
Also used : BStruct(org.ballerinalang.model.values.BStruct) HTTPCarbonMessage(org.wso2.transport.http.netty.message.HTTPCarbonMessage) Http2PushPromise(org.wso2.transport.http.netty.message.Http2PushPromise) BValue(org.ballerinalang.model.values.BValue) BallerinaException(org.ballerinalang.util.exceptions.BallerinaException)

Aggregations

BValue (org.ballerinalang.model.values.BValue)1043 Test (org.testng.annotations.Test)923 BString (org.ballerinalang.model.values.BString)437 BInteger (org.ballerinalang.model.values.BInteger)323 BStruct (org.ballerinalang.model.values.BStruct)188 BFloat (org.ballerinalang.model.values.BFloat)118 BJSON (org.ballerinalang.model.values.BJSON)112 BBoolean (org.ballerinalang.model.values.BBoolean)79 CompileResult (org.ballerinalang.launcher.util.CompileResult)60 BRefValueArray (org.ballerinalang.model.values.BRefValueArray)45 BMap (org.ballerinalang.model.values.BMap)43 BXMLItem (org.ballerinalang.model.values.BXMLItem)42 BXML (org.ballerinalang.model.values.BXML)40 BStringArray (org.ballerinalang.model.values.BStringArray)30 BIntArray (org.ballerinalang.model.values.BIntArray)25 BBlob (org.ballerinalang.model.values.BBlob)23 HttpHeaders (io.netty.handler.codec.http.HttpHeaders)19 BeforeTest (org.testng.annotations.BeforeTest)19 HTTPCarbonMessage (org.wso2.transport.http.netty.message.HTTPCarbonMessage)19 BallerinaException (org.ballerinalang.util.exceptions.BallerinaException)16