blob: dd7f2f4736a9681c6a52fd464afe5237d0577088 [file] [log] [blame]
#-------------------------------------------------------------------------------
# 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'