001/* 002 * Copyright 2002-2017 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, "'transport' is required"); 062 this.transport = transport; 063 this.headers = request.getHttpRequestHeaders(); 064 this.sendHeaders = new HttpHeaders(); 065 if (this.headers != null) { 066 this.sendHeaders.putAll(this.headers); 067 } 068 this.sendHeaders.setContentType(MediaType.APPLICATION_JSON); 069 this.sendUrl = request.getSockJsUrlInfo().getTransportUrl(TransportType.XHR_SEND); 070 } 071 072 073 public HttpHeaders getHeaders() { 074 return this.headers; 075 } 076 077 @Override 078 public InetSocketAddress getLocalAddress() { 079 return null; 080 } 081 082 @Override 083 public InetSocketAddress getRemoteAddress() { 084 return new InetSocketAddress(getUri().getHost(), getUri().getPort()); 085 } 086 087 @Override 088 public String getAcceptedProtocol() { 089 return null; 090 } 091 092 @Override 093 public void setTextMessageSizeLimit(int messageSizeLimit) { 094 this.textMessageSizeLimit = messageSizeLimit; 095 } 096 097 @Override 098 public int getTextMessageSizeLimit() { 099 return this.textMessageSizeLimit; 100 } 101 102 @Override 103 public void setBinaryMessageSizeLimit(int messageSizeLimit) { 104 this.binaryMessageSizeLimit = -1; 105 } 106 107 @Override 108 public int getBinaryMessageSizeLimit() { 109 return this.binaryMessageSizeLimit; 110 } 111 112 @Override 113 public List<WebSocketExtension> getExtensions() { 114 return Collections.emptyList(); 115 } 116 117 @Override 118 protected void sendInternal(TextMessage message) { 119 this.transport.executeSendRequest(this.sendUrl, this.sendHeaders, message); 120 } 121 122 @Override 123 protected void disconnect(CloseStatus status) { 124 // Nothing to do: XHR transports check if session is disconnected. 125 } 126 127}