@@ -3,7 +3,7 @@ _ = require('underscore')
3
3
class FSM
4
4
constructor : (resource , trace )->
5
5
@resource = resource
6
- # TODO: Ruby had a good idea, but actually use this if you can do it async
6
+ # TODO: actually use this if you can do it async
7
7
@metadata = {}
8
8
@trace = trace
9
9
@@ -52,6 +52,7 @@ class FSM
52
52
switch code
53
53
when 404
54
54
res .res .writeHead (404 , {' Content-Type' : ' text/plain' })
55
+ res .res .statusCode = 404
55
56
res .res .write (' File Not Found' )
56
57
when 304
57
58
delete res .headers [' Content-Type' ]
@@ -142,9 +143,19 @@ class FSM
142
143
# else
143
144
# _.find(charsets, (cs)-> cs == charset)
144
145
145
- # TODO: implement choose encoding
146
+ # TODO: sort using q values
146
147
chooseEncoding : (req , res , encoding )->
147
- " identity"
148
+ accepted = encoding .split (/ ,\s * / )
149
+ provided = @resource .encodingsProvidedSync (req, res)
150
+ match = _ .isEmpty (provided)
151
+ accepted_encoding = null
152
+ accepted_encoding = accepted[0 ] if match
153
+ while ! match && accepted .length
154
+ accept = accepted .shift ().split (/ \s * ;\s * / )[0 ].toLowerCase ()
155
+ match = ((accept == " *" ) || (provided[accept]? )) # .indexOf(accept) > -1))
156
+ accepted_encoding = accept if match
157
+ @metadata [' accept-encoding' ] = accepted_encoding
158
+
148
159
149
160
variances : (req , res )->
150
161
accept = if @resource .contentTypesProvidedSync (req, res).length > 1 then [" Accept" ] else []
@@ -343,6 +354,8 @@ class FSM
343
354
# Acceptable encoding available?
344
355
v3f7 : (req , res ) =>
345
356
@ tracePush ' v3f7'
357
+ # console.log @getHeaderVal(req, "accept-encoding")
358
+ # console.log @chooseEncoding(req, res, @getHeaderVal(req, "accept-encoding"))
346
359
@ decisionTest (@ chooseEncoding (req, res, @ getHeaderVal (req, " accept-encoding" )), req, res, null , 406 , @v3g7 )
347
360
348
361
# "@resource exists?"
@@ -417,7 +430,7 @@ class FSM
417
430
@resource .movedPermanently req, res, (reply )=>
418
431
switch typeof (reply)
419
432
when ' string'
420
- response .headers [" Location" ] = reply
433
+ res .headers [" Location" ] = reply
421
434
next (301 )
422
435
# when 'number'
423
436
# next(reply)
@@ -488,7 +501,7 @@ class FSM
488
501
next (307 )
489
502
else
490
503
next (reply)
491
- , req, res, true , 301 , @v3m5 )
504
+ , req, res, true , 307 , @v3m5 )
492
505
493
506
# "POST?"
494
507
v3l7 : (req , res ) =>
@@ -564,8 +577,9 @@ class FSM
564
577
@ decisionTest (@resource .allowMissingPost , req, res, true , @v3n11 , 410 )
565
578
566
579
stage1Ok : (req , res ) =>
567
- @ tracePush ' stage1Ok'
568
- if res .isRedirect ()
580
+ # @tracePush 'stage1Ok'
581
+ console .log res .respRedirect ()
582
+ if res .respRedirect () # isRedirect()
569
583
if res .headers [' Location' ]
570
584
@ respond (req, res, 303 )
571
585
else
@@ -582,20 +596,22 @@ class FSM
582
596
@resource .createPath req, res, (uri )=>
583
597
if uri
584
598
@resource .baseUri req, res, (baseUri )=>
585
- baseUri = @resource .baseUri () || req .baseUri ()
586
- req .dispPath = baseUri + ' /' + uri
587
- res .headers [' Location' ] = req .dispPath
588
- result = @ acceptHelper ()
589
- if typeof (result) == ' number'
590
- @ respond (result)
591
- else
592
- @ stage1Ok (req, res)
599
+ baseUri ||= req .baseUri ()
600
+ # req.dispPath = baseUri + '/' + uri
601
+ # res.headers['Location'] = req.dispPath()
602
+ dispPath = baseUri + ' /' + uri
603
+ res .headers [' Location' ] = dispPath
604
+ @ acceptHelper req, res, (result )=>
605
+ if typeof (result) == ' number'
606
+ @ respond (req, res, result)
607
+ else
608
+ @ stage1Ok (req, res)
593
609
else
594
610
@ errorResponse (' postIsCreate w/o createPath' )
595
611
else
596
612
@resource .processPost req, res, (processedPost )=>
597
613
if typeof (processedPost)
598
- @ respond (processedPost)
614
+ @ respond (req, res, processedPost)
599
615
else if processedPost
600
616
# TODO: encodeBodyIfSet()
601
617
@ stage1Ok (req, res)
@@ -612,11 +628,11 @@ class FSM
612
628
@ tracePush ' v3o14'
613
629
@resource .isConflict req, res, (isConflict )=>
614
630
if isConflict
615
- @ respond (409 )
631
+ @ respond (req, res, 409 )
616
632
else
617
- result = @ acceptHelper ()
633
+ result = @ acceptHelper (req )
618
634
if typeof (res) == ' number'
619
- @ respond (result)
635
+ @ respond (req, res, result)
620
636
else
621
637
@ d (req, res, @v3p11 )
622
638
@@ -656,7 +672,7 @@ class FSM
656
672
@ d (req, res, @v3o18b )
657
673
]
658
674
else
659
- console .log ' d'
675
+ # console.log 'd'
660
676
@ d (req, res, @v3o18b )
661
677
662
678
v3o18b : (req , res ) =>
@@ -666,18 +682,18 @@ class FSM
666
682
# Response includes an entity?
667
683
v3o20 : (req , res ) =>
668
684
@ tracePush ' v3o20'
669
- @ decisionTest (req .hasResponseBody (), req, res, true , @v3o18 , 204 )
685
+ @ decisionTest (res .hasResponseBody (), req, res, true , @v3o18 , 204 )
670
686
671
687
# Conflict?
672
688
v3p3 : (req , res ) =>
673
689
@ tracePush ' v3p3'
674
690
@resource .isConflict req, res, (isConflict )=>
675
691
if isConflict
676
- @ respond (409 )
692
+ @ respond (req, res, 409 )
677
693
else
678
- result = @ acceptHelper ()
694
+ result = @ acceptHelper (req )
679
695
if typeof (res) == ' number'
680
- @ respond (result)
696
+ @ respond (req, res, result)
681
697
else
682
698
@ d (req, res, @v3p11 )
683
699
@@ -686,19 +702,35 @@ class FSM
686
702
@ tracePush ' v3p11'
687
703
@ decisionTest (@ getHeaderVal (req, ' location' ), req, res, null , @v3o20 , 201 )
688
704
689
- acceptHelper : () ->
690
- null
691
- # CT = case getHeaderVal("Content-Type") of
692
- # undefined -> "application/octet-stream";
693
- # Other -> Other
694
- # end,
705
+ # TODO: should require a callback
706
+ acceptHelper : (req , res , next ) ->
707
+ # null
708
+ ct = @ getHeaderVal (req, ' content-type' ) || " application/octet-stream"
709
+ mt = ct .split (' ;' )[0 ]
710
+ contentTypesAccepted = @resource .contentTypesAcceptedSync ()
711
+ func = null
712
+ func = contentTypesAccepted[mt] if contentTypesAccepted?
713
+ if func?
714
+ # TODO: allow string or function
715
+ # @resource[func].apply
716
+ func .apply @resource , [req, res, (result ) =>
717
+ # encodeBodyIfSet()
718
+ next (result)
719
+ ]
720
+
721
+ # TODO: encodeBodyIfSet()
722
+ # true
723
+ else
724
+ # @respond(req, res, 415)
725
+ # 415
726
+ next (415 )
727
+
695
728
# {MT, MParams} = webmachineUtil:mediaTypeToDetail(CT),
696
729
# wrcall({setMetadata, 'mediaparams', MParams}),
697
- # case [Fun || {Type,Fun} <-
698
- # resourceCall(contentTypesAcceptedSync), MT =:= Type] of
730
+ # case [Fun || {Type, Fun} <- @resource.contentTypesAcceptedSync(), MT =:= Type] of
699
731
# [] -> {respond,415};
700
732
# AcceptedContentList ->
701
- # F = hd( AcceptedContentList) ,
733
+ # F = AcceptedContentList[0] ,
702
734
# case resourceCall(F) of
703
735
# true ->
704
736
# encodeBodyIfSet(),
0 commit comments