#------------------------------------------------------------------------------- # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. #------------------------------------------------------------------------------- _ = require 'underscore' utils = require './utils' Channel = require './Channel' channelManager = require './channelManager' #------------------------------------------------------------------------------- module.exports = utils.registerClass class HttpChannelHandler #--------------------------------------------------------------------------- constructor: (@pathPrefix) -> if @pathPrefix == '/ws/client' @isClient = true else if @pathPrefix == '/ws/target' @isClient = false else utils.pitch "invalid pathPrefix: #{@pathPrefix}" @isTarget = !@isClient #--------------------------------------------------------------------------- handle: (request, response, uri) -> setCORSHeaders request, response setCacheHeaders request, response #----------------- # * #{pathPrefix}a if uri[0] != '/' return handleError(request, response, 404) #----------------- if uri == '/' # OPTIONS #{pathPrefix}/ if request.method == 'OPTIONS' return handleOptions(request, response) # POST #{pathPrefix}/ if request.method == 'POST' return handleCreate(@pathPrefix, @isClient, request, response) # * #{pathPrefix}/ return handleError(request, response, 405) #----------------- parts = uri.split('/') # * #{pathPrefix}/x/y if parts.length > 2 return handleError(request, response, 404) #----------------- channelName = parts[1] # OPTIONS #{pathPrefix}/x if request.method == 'OPTIONS' return handleOptions(request, response) # GET #{pathPrefix}/x if request.method == 'GET' return handleGet(request, response, channelName) # POST #{pathPrefix}/x if request.method == 'POST' return handlePost(request, response, channelName) # anything else return handleError(request, response, 405) #------------------------------------------------------------------------------- handleCreate = (pathPrefix, isClient, request, response) -> id = request.body?.id remoteAddress = request.connection?.remoteAddress || "" channel = new Channel(pathPrefix, id, remoteAddress, isClient) response.contentType 'application/json' response.send JSON.stringify channel: channel.name id: channel.id #------------------------------------------------------------------------------- handleGet = (request, response, channelName) -> remoteAddress = request.connection?.remoteAddress || "" channel = channelManager.getChannel(channelName, remoteAddress) return handleError(request, response, 404) if !channel channel.getMessages (messages) => return handleError(request, response, 404) if channel.isClosed return handleError(request, response, 404) if !messages response.contentType 'application/json' response.send JSON.stringify(messages) #------------------------------------------------------------------------------- handlePost = (request, response, channelName) -> remoteAddress = request.connection?.remoteAddress || "" channel = channelManager.getChannel(channelName, remoteAddress) return handleError(request, response, 404) if !channel channel.handleMessages(request.body) response.send('') #------------------------------------------------------------------------------- handleOptions = (request, response) -> response.send('') #------------------------------------------------------------------------------- handleError = (request, response, status) -> response.send(status) #------------------------------------------------------------------------------- setCORSHeaders = (request, response) -> origin = request.header 'Origin' return if !origin response.header 'Access-Control-Allow-Origin', origin response.header 'Access-Control-Max-Age', '600' response.header 'Access-Control-Allow-Methods', 'GET, POST' #------------------------------------------------------------------------------- setCacheHeaders = (request, response) -> response.header 'Pragma', 'no-cache' response.header 'Expires', '0' response.header 'Cache-Control', 'no-cache' response.header 'Cache-Control', 'no-store'