উন্নত কোড গল্ফ - একটি ছোট এইচটিটিপি সার্ভার লিখুন


39

আপনার চ্যালেঞ্জটি হ'ল একটি জিইটি অনুরোধ গ্রহণ করে এমন একটি কোড-গল্ফ এইচটিটিপি সার্ভার লিখুন। এটি অবশ্যই পুরোপুরি বৈশিষ্ট্যযুক্ত হবে না, তবে এটি অবশ্যই একটি ডিরেক্টরি থেকে ফাইলগুলি সরবরাহ করবে।

নিয়মাবলী:

  • এইচটিটিপি সার্ভার অবশ্যই টিসিপি পোর্ট 36895 (0x901F) এ শুনতে হবে
  • এটি অবশ্যই /var/www* NIX সিস্টেম (যেমন লিনাক্স), বা C:\hgolfউইন্ডোজ থেকে ফাইল পরিবেশন করতে পারে ।
  • আপনি GETনিজে থেকে বাদে আগত সমস্ত HTTP শিরোনামকে এড়িয়ে যেতে পারেন ।
  • যদি এইচটিটিপি পদ্ধতিটি জিইটি না হয়, আপনাকে অবশ্যই "405 সমর্থিত নয়" এর একটি স্থিতি কোড এবং "405 সমর্থিত নয়" এর একটি বডি ফেরত পাঠাতে হবে।
  • যদি ফাইলটি বিদ্যমান না থাকে তবে আপনাকে অবশ্যই "404 ফাইল পাওয়া যায়নি" এর একটি স্থিতি কোড এবং "404 ফাইল পাওয়া যায়নি" এর একটি বডি ফেরত পাঠাতে হবে।
  • যদি ফাইলটি বিদ্যমান থাকে তবে কোনও কারণে পড়তে না পারলে আপনাকে অবশ্যই "500 সার্ভার ত্রুটি" এর একটি স্ট্যাটাস কোড এবং "500 সার্ভার ত্রুটি" এর একটি বডি ফেরত পাঠাতে হবে।
  • যদি ব্যবহারকারী অনুরোধ করে /বা অন্য কোনও বিদ্যমান ডিরেক্টরি রুট (যেমন: /foo/ডিরেক্টরিতে ডিরেক্টরি fooউপস্থিত রয়েছে /var/www/), একটি ফাঁকা পৃষ্ঠাতে প্রতিক্রিয়া জানান।
  • আপনার প্রতিক্রিয়াতে ফায়ারফক্স 8.0 এবং ইন্টারনেট এক্সপ্লোরার 8.0 এ সামগ্রী প্রদর্শিত হওয়ার জন্য কমপক্ষে সর্বনিম্ন শিরোনাম থাকতে হবে
  • আপনাকে অবশ্যই Content-Typeশিরোনাম সেটটি দিয়ে সাড়া দিতে হবে , তবে আপনাকে কেবল এক্সটেনশানগুলি সমর্থন করতে হবে html => text/htmlএবং txt => text/plain। অন্য কোনও ফাইল এক্সটেনশনের জন্য, application/octet-streamসামগ্রী প্রকার হিসাবে প্রেরণ করুন ।
  • আপনার কোড অবশ্যই ASCII এবং বাইনারি উভয় ডেটা স্থানান্তর করতে সক্ষম হবে, যদিও আপনাকে স্পষ্টভাবে দুটির মধ্যে পার্থক্য করতে হবে না।
  • আপনি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করতে পারেন না।
  • আপনি অন্তর্নির্মিত ক্লাস বা HTTP অনুরোধগুলি প্রক্রিয়া করার জন্য ডিজাইন করা বৈশিষ্ট্যগুলি ব্যবহার করতে পারবেন না (যেমন HttpListenerসি # তে)
  • আপনার ব্যবহার করা সকেট এপিআইগুলির কারণে যদি আপনার কোডটি কোনও নির্দিষ্ট ওএসে কাজ করে তবে দয়া করে এটি বিবরণ দিন।

সমাধানগুলিতে অবশ্যই একটি চিত্র অন্তর্ভুক্ত করা উচিত যা এটি কোনও ব্রাউজারে একটি HTML পৃষ্ঠা সরবরাহ করে page

যদি আপনার কোন প্রশ্ন থাকে তবে বিনা দ্বিধায় জিজ্ঞাসা করুন! :)


3
এটিতে একটি বৃহত্তর সাবধানবাণী অন্তর্ভুক্ত করা উচিত: এইগুলির কোনও সমাধান পাবলিক নেটওয়ার্ক ইন্টারফেসে প্রকাশ করবেন না! যেহেতু লক্ষ্যটি সুরক্ষার চেয়ে কোড গল্ফ, তাই তারা বিপজ্জনকভাবে নিরাপত্তাহীন হবে। (উদাঃ আমি প্রত্যাশা করি যে এগুলি সবাই ..নির্ধারিত নথিপত্রের শিকড়কে ভেঙে ফেলার উপায় হিসাবে পথটিতে অনুমতি দেবে )।
পিটার টেলর

8
কেউ সর্বদা একটি ভাল বোকা আবিষ্কার।
পিটার টেলর

21
@ পিটারটেলর তাই আমার ব্লগটি পরিবেশন করার জন্য আমার সমাধানটি ব্যবহার করা বন্ধ করা উচিত? : -ও
গ্যারেথ

httpNode.js এ মডিউলটি ঠিক আছে?
মার্কাসফল্টওয়্যার

@ মারকাসফটওয়্যার আপনি এইচটিটিপি অনুরোধগুলি প্রক্রিয়াকরণের জন্য ডিজাইন করা ইন-বিল্ট ক্লাস বা বৈশিষ্ট্যগুলি ব্যবহার করতে পারবেন না (যেমন সি # তে
এইচটিপিপ্লাইটার

উত্তর:


13

রুবি, 383 টি অক্ষর

require 'socket'
v=TCPServer.new 36895
while c=v.accept
h="200 OK";m="";t=""
(c.gets=~/GET (\S*)/)?File.directory?(s='C:/hgolf'+$1)?0:File.exist?(s)?(h+="\r\nContent-Type: "+(s=~/\.txt$/?"text/plain":s=~/\.html$/?"text/html":"application/octet-stream");t="IO.copy_stream(s,c)"):(h=m="404 File Not Found"):(h=m="405 Not Supported")
c.puts "HTTP/1.1 #{h}\r\n\r\n"+m
eval(t)
c.close
end

কোডটিকে সংক্ষিপ্ত করে তোলে যা একটি লাইন মধ্যে প্রয়োজনীয় লজিক প্যাক কোড পুনর্গঠন। তবুও, আমি আশা করি এই সংস্করণটি আরও খানিকটা গল্ফ করা যেতে পারে।

এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য: আমি এখনও "500 সার্ভার ত্রুটি" প্রয়োগ করি নি কারণ আমি একটি উপযুক্ত কাঠামো খুঁজে পাইনি (সম্ভবত সবকিছু প্যাকেজিং শুরু / উদ্ধার / শেষের মধ্যে রয়েছে তবে ফাইলটি পড়া শিরোনাম প্রেরণের পরে শেষ হয়েছে)।


আপনি কি এটিতে একটি স্ক্রিনশট কর্ম আছে? :)
বহুবর্ষ

@ পলিয়োনমিয়াল একটি স্ক্রিনশট যুক্ত করেছে।
হাওয়ার্ড

8
ছাড়া 500 Server Errorএটা প্রয়োজনীয়তা মাপসই করা হবে না, তাই এটি গ্রহণ করা উচিত নয়।
হায়েনেক-পিচি- ভাইচোদিল

26

বাশ + নেটক্যাট: 354 টি অক্ষর

  • দুটি স্ক্রিপ্ট ফাইল ব্যবহৃত হয়।
  • কোনও ইউআরএল ডিকোডিং নয়, সুতরাং ফাঁকা স্থান এবং বিশেষ অক্ষর সহ ফাইলগুলির নাম সমর্থিত নয়।
  • একক থ্রেডযুক্ত, সুতরাং সমবর্তী অনুরোধগুলি ব্যর্থ হতে পারে।
  • লিনাক্সে পরীক্ষিত, ফায়ারফক্স এবং অপেরার সাথে দুর্দান্তভাবে কাজ করে।

ওয়েবসারভার.শ (33 টি অক্ষর):

while :;do nc -lp36895 -e./w;done

ডাব্লু (321 টি অক্ষর):

read m p v
p=/var/www$p
t=text/plain
[[ -r $p ]]||s='500 Server Error'
[[ -e $p ]]||s='404 Not Found'
[[ $m != GET ]]&&s='405 Not Supported'
[[ $s||-d $p ]]||case ${p##*.} in
txt);;html)t=text/html;;*)t=application/octet-stream;;esac
echo "$v ${s-200 Ok}
Content-Type:$t
"
[[ $s ]]&&echo $s||{ [[ -d $p ]]&&echo||cat $p;}

নমুনা রান:

bash-4.2$ ./webserver.sh 

নমুনা পরিদর্শন (ফায়ারফক্স 19.0):

এখানে চিত্র বর্ণনা লিখুন


নেটক্যাট - এটি কিছু করবে!
মিঃ ল্লামা

কৌতূহলী ... যখনই আমি এটি চেষ্টা করি ncআমাকে বলে যে -e বিকল্পটি সমর্থিত নয়। কোন ধারনা?
টমসডিং

আপনি সম্ভবত ncব্যাসিবক্স থেকে এসেছেন। আমি জিএনইউnetcat ব্যবহার করি ।
manatwork

1
কি হবে text/plain?
ugoren

আপনি কি ইউগোরেন বলতে চান? .Txt এক্সটেনশন এবং ত্রুটি পৃষ্ঠাগুলি সহ ফাইলগুলি পাঠ্য / প্লেইন উভয় হিসাবে পরিবেশন করা হয়। এখানে কয়েকটি পরীক্ষা দেখুন: পেস্টবিন.ই.আরএনটিভি কিউএক্সএক্স (পড়ার ত্রুটিগুলি উপেক্ষা করুন, সেগুলি ক্লায়েন্টের স্বাভাবিক প্রতিক্রিয়া netcat
man

13

হাস্কেল, 636

import Data.List;import Network;import System.Directory;import System.IO
main=listenOn(PortNumber 36895)>>=l;l s=(n s`catch`\_->u())>>l s
n s=do(h,_,_)<-accept s;z h>>=q.words>>=hPutStr h;hClose h
q("GET":p:_)=d$"/var/www"++p;q _=c"405 Not Supported"
d p=doesFileExist p>>=f p;e x|x=u$s""""|1<3=c"404 File Not Found"
f p x|x=t p`catch`\_e->c"500 Server Error"|1<3=doesDirectoryExist p>>=e
t p=fmap(s$"\nContent-Type: "++g p)$z=<<openBinaryFile p ReadMode
r s h b=["HTTP/1.0 ",s,h,"\n\n",b]>>=id
g p|b".html"p="text/html"|b".txt"p="text/plain"|1<3="application/octet-stream"
s=r"200 OK";c s=u$r s[]s;u=return;b=isSuffixOf;z=hGetContents

ফাইলগুলি অলসভাবে প্রবাহিত হয়, তাই বড় ফাইলগুলি পরিবেশন করা খুব বেশি মেমরি ব্যবহার করে না, তবে এর অর্থ হ'ল সংক্রমণ শুরুর সময় শুধুমাত্র ত্রুটিগুলি (যেমন অনুমতি ত্রুটিগুলি) এর ফলে ফলাফল হয় 500 Server Error

একটি HTML পৃষ্ঠা পরিবেশন করা হচ্ছে

উবুন্টু ১০.১০ তে পরীক্ষা করা হয়েছে। পরিবর্তন করে Windows- এ বৈশিষ্ট্যসমূহ নিয়ে আসা যেতে পারে /var/wwwকরার C:/hgolfএবং পরিবর্তন main=করার জন্য main=withSocketsDo$, যেহেতু Windows এ সকেট গ্রন্থাগার স্পষ্ট আরম্ভের প্রয়োজন।

অবরুদ্ধ সংস্করণ:

import Data.List
import Network
import System.Directory
import System.IO

root = "/var/www"

main = do
    s <- listenOn (PortNumber 36895)
    loop s

loop s = (next s `catch` \e -> return ()) >> loop s

next s = do
    (h, _, _) <- accept s
    hGetContents h >>= serve >>= hPutStr h
    hClose h

serve req =
    case words req of
        ("GET" : path : _) -> deliver (root ++ path)
        _ -> complain "405 Not Supported"

deliver path = do
    isFile <- doesFileExist path
    if isFile
        then transfer path `catch` (\e -> complain "500 Server Error")
        else do isDir <- doesDirectoryExist path
                if isDir
                    then return $ response "200 OK" [] ""
                    else complain "404 File Not Found"

transfer path = do
   body <- hGetContents =<< openBinaryFile path ReadMode
   return $ response "200 OK" ["Content-Type: " ++ guessType path] body

response status headers body =
  concat [unlines $ ("HTTP/1.0 " ++ status) : headers, "\n", body]

complain status = return $ response status [] status

guessType path
    | ".html" `isSuffixOf` path = "text/html"
    | ".txt"  `isSuffixOf` path = "text/plain"
    | otherwise                 = "application/octet-stream"

12

পাইথন 2, 525 510 493 (নিয়মগুলি 483 নমন করে) চরগুলি

from socket import*
from os.path import*
a=socket(2,1)
a.bind(("",80))
a.listen(5)
while 1:
 c,_=a.accept();i=c.recv(512).split("\n")[0].split();z=i[1][1:];m=i[2]+(i[0]!="GET"and"405 Not Supported\n\n"*2or exists(z)-1and"404 File Not Found\n\n"*2or"200 OK\n")
 if(len(m)>16)+isdir(z)<1:
    try:f=open(z,"rb");m+="Content-Type: "+{".txt":"text/plain","html":"text/html"}.get(z[-4:],"application/octet-stream")+"\n\n"+f.read()
    except:m=i[2]+"500 Server Error\n\n"*2
 c.send(m);c.close()

আমি বলেছি যে আমি যদি নিয়মগুলি বাঁক করি তবে কেবলমাত্র 483 টি অক্ষর দরকার কারণ ;c.close()শেষগুলি বাদ দেওয়া যেতে পারে। এটি কারণ পরবর্তী ক্লায়েন্ট গ্রহণ হওয়ার মুহুর্তে, সকেটটি যাইহোক বন্ধ হয়ে যায়। এটি অবশ্যই অপেক্ষার সময়টিকে কিছুটা বাড়িয়ে তুলবে (ফায়ারফক্স কেবলমাত্র পরবর্তী ক্লায়েন্ট সংযুক্ত হওয়ার সাথে সাথে পৃষ্ঠাটি প্রদর্শন করবে, ক্রোম এটি আগে প্রদর্শন করবে, তবে লোড চালিয়ে যাবে), তবে নিয়মগুলি আমাকে তত্ক্ষণাত অনুরোধের প্রতিক্রিয়া জানাবে না , কেবলমাত্র এক পর্যায়ে তাই না ।

এটি ইউনিক্সগুলিতে কাজ করবে কিনা তা আমি নিশ্চিত নই কারণ আমি প্রেরণের পরিবর্তে প্রেরণ ও প্রেরণ ব্যবহার করেছি যা এটি খাওয়ানো সবই প্রেরণের নিশ্চয়তা দেয় না। এটি উইন্ডোজে কাজ করে।

স্ক্রিনশট যা কোনও কিছুরই প্রমাণ দেয় না কারণ এটি তৈরি করার জন্য আমি অ্যাপাচি বা আমার নিজের সার্ভার ব্যবহার করেছি কিনা তা বলার উপায় নেই


1
আপনি সি: \ হিগল্ফ (8 টি অক্ষর) এর পরিবর্তে পোর্ট 80 এ 36895 (3 টি অক্ষর) এর পরিবর্তে বর্তমান ডিরেক্টরিটি পরিবেশন করে নিয়মগুলি নমন করছেন।
manatwork

7

গ্রোভি, 507 500 489 485

for(ServerSocket s=new ServerSocket(36895);;){t=s.accept()
o=t.outputStream
o<<"HTTP/1.1 "
e='\r\n'*2
d={o<<"$it$e$it"}
p=t.inputStream.newReader().readLine().split()
if(p[0]!='GET')d'405 Not Supported'else{f=new File('/var/www/',p[1])
if(!f.exists())d'404 File Not Found'else if(f.isFile()){x=f.name=~/\.(.*)/
o<<"200 OK\r\nContent-Type: ${[html:'text/html',txt:'text/plain'][!x?:x[0][1]]?:'application/octet-stream'}$e"
try{o.bytes=f.bytes}catch(t){d"500 Server Error"}}}
o.close()}

এখানে চিত্র বর্ণনা লিখুন

বাইনারি ফাইলগুলি ঠিকঠাকভাবে কাজ করছে তা দেখানোর জন্য চিত্র ডাউনলোডটি যুক্ত করেছে - এটি শুরু করার সাথে তাদের কয়েকটি সমস্যা ছিল।

কেউ কি ইনপুট পড়ার জন্য আরও একটি ছোট উপায় প্রস্তাব করতে পারেন?


5

এরলং (এসক্রিপ্ট) 575

খুব নোংরা এরলং এসক্রিপ্ট। ভালভাবে কাজ করার জন্য ফাইলের শুরুতে একটি ফাঁকা রেখা থাকতে হবে:

$ cat hgolf.erl

main(_)->{ok,L}=gen_tcp:listen(36895,[]),s(L).
s(L)->{ok,S}=gen_tcp:accept(L),receive{tcp,S,"GET "++R}->[F|_]=string:tokens("/var/www"++R," "),case case file:read_file_info(F)of{ok,{_,_,regular,read,_,_,_,_,_,_,_,_,_,_}}->a;{ok,_}->"500 Server Error";_->"404 File Not Found"end of a->h(S,"200 OK\r\nContent-Type: "++case lists:reverse(F)of"lmth."++_->"text/html";"txt."++_->"text/plain";_->"application/octet-stream"end,[]),file:sendfile(F,S);E->h(S,E,E)end;_->E="405 Not Supported",h(S,E,E)end,gen_tcp:close(S),s(L).
h(S,H,B)->gen_tcp:send(S,["HTTP/1.1 ",H,"\r\n\r\n",B]).

কীভাবে চালাবেন

$ escript hgolf.erl

স্ক্রিনশট

সম্পাদনা:

আমি 20 টি চর বের করে দিয়েছি। caseএমনকি একটি যুক্তি এবং তিনটি ধারা দ্বারা আশ্চর্যজনকভাবে ফাংশনটির চেয়ে কম।


বিটিডব্লিউ আপনি এই প্রশ্নটিতেও সেই জিনিসটি পোস্ট করতে পারেন ( কোডগল্ফ.স্ট্যাকেক্সেঞ্জারজিও
সেকশনস /

4

ভিবি.এনইটি, 7203

সার্ভার চলমান ছবি

আপনি যথাযথ --portএবং ব্যবহার করে যে কোনও বন্দর এবং যে কোনও বেস ডিরেক্টরি নির্ধারণ করতে পারেন --base

না, এটি সত্যিই একটি গল্ফিং সমাধান নয়। কিন্তু ভিবি.এনইটি হওয়ার কারণে আর কোনও উপায় নেই। প্লাস দিকে, এইটির আরও অনেকগুলি বৈশিষ্ট্য রয়েছে।

Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Text.RegularExpressions

Public Module Server
    Private Const READ_BUFFER_SIZE As Integer = 1024

#Region "Content-Type Identification"
    Private ReadOnly ContentTypes As New Dictionary(Of String, String) From {
            {".htm", "text/html"},
            {".html", "text/html"},
            {".js", "text/javascript"},
            {".css", "text/css"},
            {".png", "image/png"},
            {".jpg", "image/jpeg"},
            {".jpeg", "image/jpeg"},
            {".gif", "image/gif"}
        } 'Feel free to add more.

    ''' <summary>
    ''' Retrieves the Content-Type of the specified file.
    ''' </summary>
    ''' <param name="filepath">The file for which to retrieve the Content-Type.</param>
    Private Function GetContentType(ByVal filepath As String) As String
        Dim ext As String = IO.Path.GetExtension(filepath)

        If ContentTypes.ContainsKey(ext) Then _
            Return ContentTypes(ext)

        Return "text/plain"
    End Function
#End Region

#Region "Server Main()"
    Public Sub Main(ByVal args() As String)
        Try
            'Get a dictionary of options passed:
            Dim options As New Dictionary(Of String, String) From {
                {"--port", "8080"},
                {"--address", "127.0.0.1"},
                {"--base", String.Empty}
            }

            For i As Integer = 0 To args.Length - 2
                If args(i).StartsWith("-") AndAlso options.ContainsKey(args(i)) Then _
                    options(args(i)) = args(i + 1)
            Next

            'Get the base directory:
            Dim basedir As String = Path.Combine(My.Computer.FileSystem.CurrentDirectory, options("--base"))

            'Start listening:
            Dim s As New TcpListener(IPAddress.Parse(options("--address")), Integer.Parse(options("--port"))) 'Can be changed.
            Dim client As TcpClient

            s.Start()

            Do
                'Wait for the next TCP client, and accept the connection:
                client = s.AcceptTcpClient()

                'Read the data being sent to the server:
                Dim ns As NetworkStream = client.GetStream()
                Dim sendingData As New Text.StringBuilder()
                Dim rdata(READ_BUFFER_SIZE - 1) As Byte
                Dim read As Integer

                Do
                    read = ns.Read(rdata, 0, READ_BUFFER_SIZE)
                    sendingData.Append(Encoding.UTF8.GetString(rdata, 0, read))
                Loop While read = READ_BUFFER_SIZE

                'Get the method and requested file:
#If Not Debug Then
                Try
#End If
                If sendingData.Length > 0 Then
                    Dim data As String = sendingData.ToString()

                    Dim headers() As String = data.Split({ControlChars.Cr, ControlChars.Lf}, StringSplitOptions.RemoveEmptyEntries)
                    Dim basicRequestInfo() As String = headers(0).Split(" "c)
                    Dim method As String = basicRequestInfo(0)
                    Dim filepath As String = basicRequestInfo(1).Substring(1)
                    Dim actualFilepath As String = Path.Combine(basedir, Uri.UnescapeDataString(Regex.Replace(filepath, "\?.*$", "")).TrimStart("/"c).Replace("/"c, "\"c))
                    Dim httpVersion As String = basicRequestInfo(2)

                    'Set up the response:
                    Dim responseHeaders As New Dictionary(Of String, String)

                    Dim statusCode As String = "200"
                    Dim statusReason As String = "OK"
                    Dim responseContent() As Byte = {}

                    'Check the HTTP version - we only support HTTP/1.0 and HTTP/1.1:
                    If httpVersion <> "HTTP/1.0" AndAlso httpVersion <> "HTTP/1.1" Then
                        statusCode = "505"
                        statusReason = "HTTP Version Not Supported"
                        responseContent = Encoding.UTF8.GetBytes("505 HTTP Version Not Supported")
                    Else

                        'Attempt to check if the requested path is a directory; if so, we'll add index.html to it:
                        Try
                            If filepath = String.Empty OrElse filepath = "/" Then
                                actualFilepath = Path.Combine(basedir, "index.html")
                                filepath = "/"
                            ElseIf Directory.Exists(actualFilepath) Then
                                actualFilepath = Path.Combine(actualFilepath, "index.html")
                            End If
                        Catch
                            'Ignore the error; it will appear once again when we try to read the file.
                        End Try

                        'Check the method - we only support GET and HEAD:
                        If method = "GET" Then
                            'Make sure nobody's trying to hack the system by requesting ../whatever or an absolute path:
                            If filepath.Contains("..") Then
                                statusCode = "403"
                                statusReason = "Forbidden"
                                responseContent = Encoding.UTF8.GetBytes("403 Forbidden")
                                Console.WriteLine("Access to {0} was forbidden.", filepath)
                            ElseIf Not File.Exists(actualFilepath) Then
                                statusCode = "404"
                                statusReason = "Not Found"
                                responseContent = Encoding.UTF8.GetBytes("404 Not Found")
                                Console.WriteLine("A request for file {0} resulted in a 404 Not Found. The actual path was {1}.", filepath, actualFilepath)
                            Else
                                Try
                                    'Read the requested file:
                                    responseContent = File.ReadAllBytes(actualFilepath)

                                    'Get the requested file's length:
                                    responseHeaders.Add("Content-Length", responseContent.Length.ToString())

                                    'And get its content type too:
                                    responseHeaders.Add("Content-Type", GetContentType(actualFilepath))
                                Catch
                                    'Couldn't get the file's information - assume forbidden.
                                    statusCode = "403"
                                    statusReason = "Forbidden"
                                    responseContent = Encoding.UTF8.GetBytes("403 Forbidden")
                                End Try
                            End If
                        ElseIf method = "HEAD" Then
                            'Make sure nobody's trying to hack the system by requesting ../whatever or an absolute path:
                            If filepath.Contains("..") Then
                                statusCode = "403"
                                statusReason = "Forbidden"
                                responseContent = Encoding.UTF8.GetBytes("403 Forbidden")
                                Console.WriteLine("Access to {0} was forbidden.", filepath)
                            ElseIf Not File.Exists(actualFilepath) Then
                                statusCode = "404"
                                statusReason = "Not Found"
                                responseContent = Encoding.UTF8.GetBytes("404 Not Found")
                                Console.WriteLine("A request for file {0} resulted in a 404 Not Found.", filepath)
                            Else
                                Try
                                    'Get the requested file's length:
                                    responseHeaders.Add("Content-Length", New FileInfo(actualFilepath).Length.ToString())

                                    'And get its content type too:
                                    responseHeaders.Add("Content-Type", GetContentType(actualFilepath))
                                Catch
                                    'Couldn't get the file's information - assume forbidden.
                                    statusCode = "403"
                                    statusReason = "Forbidden"
                                    responseContent = Encoding.UTF8.GetBytes("403 Forbidden")
                                End Try
                            End If
                        Else
                            'Unknown method:
                            statusCode = "405"
                            statusReason = "Method Not Allowed"
                        End If

                        'Prepare the response:
                        Dim response As New List(Of Byte)

                        'Prepare the response's HTTP version and status:
                        response.AddRange(Encoding.UTF8.GetBytes("HTTP/1.1 " & statusCode & statusReason & ControlChars.CrLf))

                        'Prepare the response's headers:
                        Dim combinedResponseHeaders As New List(Of String)
                        For Each header As KeyValuePair(Of String, String) In responseHeaders
                            combinedResponseHeaders.Add(header.Key & ": " & header.Value)
                        Next
                        response.AddRange(Encoding.UTF8.GetBytes(String.Join(ControlChars.CrLf, combinedResponseHeaders.ToArray())))

                        'Prepare the response's content:
                        response.Add(13)
                        response.Add(10)
                        response.Add(13)
                        response.Add(10)
                        response.AddRange(responseContent)

                        'Finally, write the response:
                        ns.Write(response.ToArray(), 0, response.Count)
                    End If
                End If
#If Not Debug Then
                Catch ex As Exception
                    Console.WriteLine("Serious error while processing request:")
                    Console.WriteLine(ex.ToString())
                    Dim errorResponse() As Byte = Encoding.UTF8.GetBytes("HTTP/1.1 500 Internal Server Error" & ControlChars.CrLf & ControlChars.CrLf & "500 Internal Server Error")
                    ns.Write(errorResponse, 0, errorResponse.Length)
                End Try
#End If

                'And at last, close the connection:
                client.Close()
            Loop
        Catch ex As SocketException
            Console.WriteLine("SocketException occurred. Is the socket already in use?")
            Console.ReadKey(True)
        End Try
    End Sub
#End Region

End Module

এমনকি আমি এটি গিটহাব :) এ রাখার সিদ্ধান্ত নিয়েছি :) https://github.com/minitech/DevServ


2
হাহাহা, হ্যাঁ, ভিবি.এনইটি ঠিক গল্ফার পছন্দের ভাষা নয়। তবুও সুন্দর।
বহুবর্ষ

VB.NET গল্ফ করা যেতে পারে; আপনি ব্যবহার করতে পারেন বেশ কয়েকটি কৌশল আছে।
জোয়

@ জোয়ি: হ্যাঁ, তবে বর্তমান উত্তরগুলির সাথে প্রতিযোগিতা করার কোনও উপায় নেই। আমি প্রথমে মন্তব্যগুলি গ্রহণ করব :)
রাই-

@ মিনিটেক আমি আপনার উত্তরটি একটু গল্ফ করে পোস্ট করেছি ( কোডগল্ফ.স্ট্যাকেক্সেঞ্জারএ / a / 21757 / 15022 ), এবং আপনি যদি চান তবে সেখান থেকে কোডটি অনুলিপি করুন এবং আমি আমার উত্তরটি মুছব
টুথব্রাশ

গিথুব-এ কোডের 46 মিনিটে @ এমনিটেক আপনার কাছে রয়েছে For i As Integer = 0 To args.Length - 2। যদি আপনি Step 2এই লাইনের শেষে যুক্ত করেন তবে আপনি কাউন্টারটি 1 এর পরিবর্তে দুটি দ্বারা বাড়িয়ে দিন
টুথব্রাশ

4

সি # (869)

এটা কাজ করেছে

using E=System.Text.Encoding;using System.IO;class C{static void Main(){var l=new System.Net.Sockets.TcpListener(new System.Net.IPEndPoint(16777343,36895));l.Start();while(0<1){using(var c=l.AcceptTcpClient()){try{string v="200 OK",r="",t="text/plain",p;var s=c.GetStream();var b=new byte[c.ReceiveBufferSize];s.Read(b,0,b.Length);var h=E.UTF8.GetString(b).Split();b=null;try{if(h[0]=="GET"){p="/var/www"+h[1];if(File.Exists(p)){b=File.ReadAllBytes(p);t=p.EndsWith(".txt")?t:p.EndsWith(".html")?"text/html":"application/octet-stream";}else if(!Directory.Exists(p)){v=r="404 Not Found";}}else{v=r="405 Not Supported";}}catch(IOException){v=r="500 Server Error";}b=b??E.UTF8.GetBytes(r);var m=E.UTF8.GetBytes("HTTP/1.1 "+v+"\r\nContent-Type:"+t+";charset=utf-8\r\nContent-Length:"+b.Length+"\r\n\r\n");s.Write(m,0,m.Length);s.Write(b,0,b.Length);}catch(IOException){}}}}}

Ungolfed

using System.Text;
using System.IO;

class C {
    static void Main() {
        var listener = new System.Net.Sockets.TcpListener(new System.Net.IPEndPoint(16777343,36895));
        listener.Start();

        while (true){
            using (var client = listener.AcceptTcpClient()) {
                try {
                    string responseCode = "200 OK", responseBody = "", contentType = "text/plain", path;
                    var stream = client.GetStream();

                    var bytes = new byte[client.ReceiveBufferSize];
                    stream.Read(bytes,0,bytes.Length);

                    var requestHeaders = Encoding.UTF8.GetString(bytes).Split();
                    bytes = null;

                    try{
                        if(requestHeaders[0] == "GET"){
                            path = "/var/www" + requestHeaders[1];

                            if (File.Exists(path)) {
                                bytes = File.ReadAllBytes(path);
                                contentType = path.EndsWith(".txt") ? contentType : path.EndsWith(".html") ? "text/html" : "application/octet-stream";
                            } else if (!Directory.Exists(path)){
                                responseCode = responseBody = "404 Not Found";
                            }
                        } else {
                            responseCode = responseBody = "405 Not Supported";
                        }
                    } catch(IOException) {
                        responseCode = responseBody = "500 Server Error";
                    }
                    bytes = bytes ?? Encoding.UTF8.GetBytes(responseBody);

                    var responseHeader=Encoding.UTF8.GetBytes("HTTP/1.1 " + responseCode + "\r\nContent-Type:" + contentType + ";charset=utf-8\r\nContent-Length:" + bytes.Length + "\r\n\r\n");
                    stream.Write(responseHeader, 0, responseHeader.Length);
                    stream.Write(bytes, 0, bytes.Length);
                } catch(IOException) {
                    // If a client disconnects in the middle of a request (e.g. by refreshing the browser) an IOException is thrown.
                }
            }
        }
    }
}

3

নোড.জেএস - 636

শুধুমাত্র লিনাক্সে পরীক্ষিত, উইন্ডোজে কাজ করবে না।

a=require
b=a('fs')
function c(){g+=o+h+i+j+f+f+o+f}
a('net').createServer(function(d){d.on('data',function(e){f='\r\n'
g='HTTP/1.1 '
h=f+'Content-Type: '
i='text/'
j='plain'
if(k=/^GET (\S+)/.exec((e+'').split(f)[0])){k=k[1]
l=k.slice(k.lastIndexOf('.')+1)
m='www'+k
if(b.existsSync(m)){if(b.lstatSync(m).isDirectory()){g+='200 OK'+h+i+j+f}else{try{n=b.readFileSync(m)
g+='200 OK'+h
if(l=='txt')g+=i+j
else if(l=='html')g+=i+l
else g+='application/octet-stream'
g+=f+f+n}catch(_){o='500 Server Error'
c()}}}else{o='404 File Not Found'
c()}}else{o='405 Not Supported'
c()}
d.write(g)
d.end()})
d.on('error',function(){})}).listen(36895)

স্ক্রিনশট


2

স্কালা, 653 টি অক্ষর

import java.net._
import java.io._
object I extends App{val l=new ServerSocket(36895)
while(true){var (s,e,c,b)=(l.accept,"200 OK","text/html","")
var h=io.Source.fromInputStream(s.getInputStream).getLines.next.split(" ")
if(h(0)!="GET"){e="405 Not Supported"
b=e}else{var f=new File("/var/www"+h(1))
if(!f.isDirectory){if(f.exists){var q=h(1).split("\\.").last
if(q=="txt")c="text/plain"else if(q!="html")c="application/octet-stream"
try b=io.Source.fromFile(f).mkString catch{case _=>e="500 Server Error";b=e}}else{e="404 File Not Found"
b=e}}}
var o=new PrintWriter(s.getOutputStream)
o.print("HTTP/1.1 "+e+"\nContent-Encoding:"+c+"\n\n"+b)
o.close}}

এটির একটি স্ক্রিনশট আমার ম্যাকবুকে চলছে:

স্ক্রিনশট

দুর্দান্ত না, তবে পরে যখন কিছুটা সময় পেলাম তখন আমি এটিকে কিছুটা স্কোয়াশ করতে যাব।


এটির একটি স্ক্রিনশট পেয়েছেন?
বহুবর্ষীয়

@ পলিয়োনমিয়াল হ্যাঁ দুঃখিত, এর আগে কোথাও যাওয়ার জন্য কিছুটা ভিড় ছিল।
গ্যারেথ

2

পাইথন 3 - 655

from socket import*
import re
import threading
def x(c):
    u=str(c.recv(1024))
    if not'GET'in u:conn.sendall(t("HTTP/1.1 405 Not Supported"))
    u=re.search('GET [^\s]+ HTTP/1.1',u).group(0).split(" ")[1];u="/index.html" if u == "/" else u;e=u.split(".")[1]
    try:c.sendall(t("HTTP/1.1 200 OK\nContent-Type: "+({'txt':'text/plain','html':'text/html'}[e]if e in'txthtml'else'application/octet-stream')+"\n\n")+open("."+u,'rb').read())
    except:c.sendall(t("HTTP/1.1 404 File Not Found\n\n404 File Not Found"))
t=lambda s: bytes(s,'utf8')
s=socket(AF_INET,SOCK_STREAM)
s.bind(('',36895))
s.listen(10)
while 1:threading.Thread(target=x,args=[s.accept()[0]]).run()

এখানে চিত্র বর্ণনা লিখুন


আফাইক আপনি 15 টি অক্ষর সংরক্ষণ করতে 1-স্পেস ইন্ডেন্টেশন (4 পরিবর্তে) ব্যবহার করতে পারেন
জেমস ভিকারি

1

ভিবি.নেট (3504 টি অক্ষর):

Imports System.IO:Imports System.Net:Imports System.Net.Sockets:Imports System.Text:Imports System.Text.RegularExpressions:Module x:Dim s=1024,ct As New Dictionary(Of String,String)From{{".htm","text/html"},{".html","text/html"},{".js","text/javascript"},{".css","text/css"},{".png","image/png"},{".jpg","image/jpeg"},{".jpeg","image/jpeg"},{".gif","image/gif"}}:Function b$(f$):Dim ext$=Path.GetExtension(f$):Return If(ct.ContainsKey(ext$),ct(ext$),"text/plain"):End Function:Sub Main(a$()):Try:Dim z As New Dictionary(Of String,String)From{{"--port","8080"},{"--address","127.0.0.1"},{"--base",""}}:For i As Integer=0 To a.Length-2:If a$(i).StartsWith("-")AndAlso z.ContainsKey(a$(i))Then:z(a$(i))=a$(i+1):Next:Dim b$=Path.Combine(My.Computer.FileSystem.CurrentDirectory,z("--base")),s As New TcpListener(IPAddress.Parse(z("--address")),Integer.Parse(z("--port"))),c As TcpServer:s.Start():Do:c=s.AcceptTcpServer():Dim ns As NetworkStream=c.GetStream():Dim sd As New Text.StringBuilder(),rd(s-1)As Byte,r As Integer:Do:r=ns.Read(rd,0,s):sd.Append(Encoding.UTF8.GetString(rd,0,r)):Loop While r=s:Try:If sd.Length>0 Then:Dim dd$=sd.ToString(),h$()=dd$.Split({ControlChars.Cr,ControlChars.Lf},StringSplitOptions.RemoveEmptyEntries),br$()=h$(0).Split(" "c),mt$=br$(0),f$=br$(1).Substring(1),af$=Path.Combine(b$,Uri.UnescapeDataString(Regex.Replace(f$,"\?.*$","")).TrimStart("/"c).Replace("/"c,"\"c)),hv$=br$(2),rh As New Dictionary(Of String,String),sc$="200",sr$="OK",rc()As Byte={}:If hv$<>"HTTP/1.0"AndAlso hv$<>"HTTP/1.1"Then:sc$="505":sr$="HTTP Version Not Supported":rc=Encoding.UTF8.GetBytes("505"&sr$):Else:Try:If f$=String.Empty OrElse f$="/"Then:af$=Path.Combine(b$,"index.html"):f$="/":ElseIf Directory.Exists(af$)Then:af$=Path.Combine(af$,"index.html"):End If:Catch:End Try:If mt$="GET"Then:If f$.Contains("..")Then:sc$="403":sr$="Forbidden":rc=Encoding.UTF8.GetBytes(sc$&" "&sr$):Console.WriteLine("{0} forbidden.",f$):ElseIf Not File.Exists(af$)Then:sc$="404":sr$="Not Found":rc=Encoding.UTF8.GetBytes(sc$&" "&sr$):Console.WriteLine("{0} resulted in 404 Not Found. Path {1}.",f$,af$):Else:Try:rc=File.ReadAllBytes(af$):rh.Add("Content-Length",rc.Length&""):rh.Add("Content-Type",b$(af$)):Catch:sc$="403":sr$="Forbidden":rc = Encoding.UTF8.GetBytes(sc$&" "&sr$):End Try:End If:ElseIf mt$="HEAD"Then:If f$.Contains("..")Then:sc$="403":sr$="Forbidden":rc=Encoding.UTF8.GetBytes(sc$&" "&sr$):Console.WriteLine("{0} forbidden.",f$):ElseIf Not File.Exists(af$)Then:sc$="404":sr$="Not Found":rc=Encoding.UTF8.GetBytes(sc$&" "&sr$):Console.WriteLine("404 Not Found: {0}",f$):Else:Try:rh.Add("Content-Length",New FileInfo(af$).Length&""):rh.Add("Content-Type",b$(af$)):Catch:sc$="403":sr$="Forbidden":rc = Encoding.UTF8.GetBytes(sc$&" "&sr$):End Try:End If:Else:sc$="405":sr$="Method Not Allowed":End If:Dim rr As New List(Of Byte):rr.AddRange(Encoding.UTF8.GetBytes("HTTP/1.1 "&sc$&sr$&ControlChars.CrLf)):Dim cr As New List(Of String):For Each h As KeyValuePair(Of String,String)In rh:cr.Add(h.Key&": "&h.Value):Next:rr.AddRange(Encoding.UTF8.GetBytes(String.Join(ControlChars.CrLf,cr.ToArray()))):rr.Add(13):rr.Add(10):rr.Add(13):rr.Add(10):rr.AddRange(rc):ns.Write(rr.ToArray(),0,rr.Count):End If:End If:Catch ex As Exception:Console.WriteLine("Error:"):Console.WriteLine(ex.ToString()):Dim e()As Byte=Encoding.UTF8.GetBytes("HTTP/1.1 500 Internal x Error"&ControlChars.CrLf &ControlChars.CrLf &"500 Internal x Error"):ns.Write(e,0,e.Length):End Try:c.Close():Loop:Catch:End Try:End Sub:End Module

@ মিনিটেকের উত্তর থেকে গল্ফ হয়েছে।


1

লুয়া 5.1 435 434 বাইটে

s=require'socket'.bind('*',36895)while{}do
c=s:accept()u=c:receive'*l':match'GET (.*) HTTP'f,_,e=io.open('/var/www'..u,'rb')d=z
x=z if f then d,_,x=f:read'*a'end
h=u and(x==21 and''or(e==2 and'404 File Not Found'or d
and('200 OK\r\nContent-Type:'..(({txt='text/plain',html='text/html'})[u:match'%.(.-)$']or'application/octet-stream'))or'500 Server Error'))or'405 Not Supported'c:send('HTTP/1.1 '..h..'\r\n\r\n'..(d
or h))c:close()end

... এবং প্রমাণ ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.