001/* 002 * Copyright 2002-2018 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * https://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.springframework.web.socket.sockjs.client; 018 019import java.net.InetSocketAddress; 020import java.net.URI; 021import java.util.Collections; 022import java.util.List; 023 024import org.springframework.http.HttpHeaders; 025import org.springframework.http.MediaType; 026import org.springframework.util.Assert; 027import org.springframework.util.concurrent.SettableListenableFuture; 028import org.springframework.web.socket.CloseStatus; 029import org.springframework.web.socket.TextMessage; 030import org.springframework.web.socket.WebSocketExtension; 031import org.springframework.web.socket.WebSocketHandler; 032import org.springframework.web.socket.WebSocketSession; 033import org.springframework.web.socket.sockjs.transport.TransportType; 034 035/** 036 * An extension of {@link AbstractClientSockJsSession} for use with HTTP 037 * transports simulating a WebSocket session. 038 * 039 * @author Rossen Stoyanchev 040 * @since 4.1 041 */ 042public class XhrClientSockJsSession extends AbstractClientSockJsSession { 043 044 private final XhrTransport transport; 045 046 private HttpHeaders headers; 047 048 private HttpHeaders sendHeaders; 049 050 private final URI sendUrl; 051 052 private int textMessageSizeLimit = -1; 053 054 private int binaryMessageSizeLimit = -1; 055 056 057 public XhrClientSockJsSession(TransportRequest request, WebSocketHandler handler, 058 XhrTransport transport, SettableListenableFuture<WebSocketSession> connectFuture) { 059 060 super(request, handler, connectFuture); 061 Assert.notNull(transport, "XhrTransport is required"); 062 this.transport = transport; 063 this.headers = request.getHttpRequestHeaders(); 064 this.sendHeaders = new HttpHeaders(); 065 this.sendHeaders.putAll(this.headers); 066 this.sendHeaders.setContentType(MediaType.APPLICATION_JSON); 067 this.sendUrl = request.getSockJsUrlInfo().getTransportUrl(TransportType.XHR_SEND); 068 } 069 070 071 public HttpHeaders getHeaders() { 072 return this.headers; 073 } 074 075 @Override 076 public InetSocketAddress getLocalAddress() { 077 return null; 078 } 079 080 @Override 081 public InetSocketAddress getRemoteAddress() { 082 URI uri = getUri(); 083 return (uri != null ? new InetSocketAddress(uri.getHost(), uri.getPort()) : null); 084 } 085 086 @Override 087 public String getAcceptedProtocol() { 088 return null; 089 } 090 091 @Override 092 public void setTextMessageSizeLimit(int messageSizeLimit) { 093 this.textMessageSizeLimit = messageSizeLimit; 094 } 095 096 @Override 097 public int getTextMessageSizeLimit() { 098 return this.textMessageSizeLimit; 099 } 100 101 @Override 102 public void setBinaryMessageSizeLimit(int messageSizeLimit) { 103 this.binaryMessageSizeLimit = -1; 104 } 105 106 @Override 107 public int getBinaryMessageSizeLimit() { 108 return this.binaryMessageSizeLimit; 109 } 110 111 @Override 112 public List<WebSocketExtension> getExtensions() { 113 return Collections.emptyList(); 114 } 115 116 @Override 117 protected void sendInternal(TextMessage message) { 118 this.transport.executeSendRequest(this.sendUrl, this.sendHeaders, message); 119 } 120 121 @Override 122 protected void disconnect(CloseStatus status) { 123 // Nothing to do: XHR transports check if session is disconnected. 124 } 125 126}