155 lines
5.5 KiB
CoffeeScript
155 lines
5.5 KiB
CoffeeScript
|
#-------------------------------------------------------------------------------
|
||
|
# 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'
|